[url=]http://blog.csdn.net/yangyy753[/url]
原帖分享了这个工具,就不在这里重复赘述了,但是是针对老粒子特效的,并且中间有一些错误,稍微改动了下,并且添加了修改粒子数的新功能,不需要的可以去掉。
适用新粒子系统,新粒子系统中只能获得设置的最大粒子数和当前粒子数,无法获得实际运行中的最大粒子数。虽然可以运行时取得,但是并不是我们想要的方法,有好方法的可以分享下。 - using UnityEngine;
- using System.Collections;
- using UnityEditor;
- using System.Collections.Generic;
-
- public class EffectEmitChecker : EditorWindow
- {
- float ThumbnailWidth = 40;
- float ThumbnailHeight = 40;
- GUIStyle style = new GUIStyle();
- Vector2 vec2 = new Vector2(0, 0);
- List<EffectParticle> listEffect = new List<EffectParticle>(); //缓存特效信息
-
- [MenuItem("Effect/Effect Emit Checker")]
- static void MainTask()
- {
- EffectEmitChecker window = GetWindow<EffectEmitChecker>();
- window.LoadEffect(); //加载特效
- window.Show();
- }
-
- void OnGUI()
- {
- ListEffect();
- }
-
- void LoadEffect()
- {
- GameObject[] objs = (GameObject[])Resources.LoadAll<GameObject>("Effects"); //读取所有特效文件,可以根据情况改变地址
- for (int i = 0; i < objs.Length; i++)
- {
- //GameObject go = PrefabUtility.InstantiatePrefab(objs[i]) as GameObject; //创建实例
- if (objs[i] == null) continue;
- ParticleSystemRenderer[] renderers = objs[i].GetComponentsInChildren<ParticleSystemRenderer>(true); //获取特效实例下的所有ParticleRenderer组件
- foreach (ParticleSystemRenderer render in renderers)
- {
- EffectParticle effect = new EffectParticle();
- ParticleSystem emitter = render.particleSystem; //获取ParticleEmitter组件
- effect.name = objs[i].name;
- effect.material = render.sharedMaterial;
- if (emitter != null)
- {
- effect.maxEmission = emitter.maxParticles; //最大发射粒子数赋值
- }
- effect.prefab = emitter.gameObject;
- listEffect.Add(effect);
- }
- // DestroyImmediate(go); //销毁实例
- }
- listEffect.Sort((x, y) => { return y.maxEmission.CompareTo(x.maxEmission); }); //从大到小排序
- style.normal.textColor = Color.red;
- style.fixedWidth = 120;
- }
-
- void ListEffect()
- {
- vec2 = EditorGUILayout.BeginScrollView(vec2);
- foreach (EffectParticle effectParticle in listEffect)
- {
- if (effectParticle != null)
- {
- GUILayout.BeginHorizontal();
-
- Material mat = effectParticle.material;
- if (mat != null)
- {
- //根据材质找到相应的纹理显示
- Texture texture = mat.mainTexture;
- if (texture != null)
- GUILayout.Box(texture, GUILayout.Width(ThumbnailWidth), GUILayout.Height(ThumbnailHeight));
- else
- GUILayout.Box("N/A", GUILayout.Width(ThumbnailWidth), GUILayout.Height(ThumbnailHeight));
-
- GUILayout.Label("Shader:" + mat.shader.name, GUILayout.Width(140)); //Shader名称
-
- //特效主颜色显示
- if (mat.HasProperty("_Color"))
- EditorGUILayout.ColorField(mat.color, GUILayout.Width(50));
- else if (mat.HasProperty("_TintColor"))
- EditorGUILayout.ColorField(mat.GetColor("_TintColor"), GUILayout.Width(50));
- else
- GUILayout.Box("N/A", GUILayout.Width(50));
- }
-
- //发射粒子数判断
- float emission = effectParticle.maxEmission;
- if (emission < 50)
- GUILayout.Label("MaxEmission:" + emission.ToString(), GUILayout.Width(120));
- else
- {GUILayout.Label("MaxEmission:" + emission.ToString(), style);
- //字体标红
- //effectParticle.prefab.GetComponent<ParticleSystemRenderer>().particleSystem.maxParticles =50; //将大于50的修改为50(慎用,会导致粒子效果改变)
-
- }
-
- //特效名称,并可定位到相应文件
- if (GUILayout.Button(effectParticle.name))
- Selection.activeObject = effectParticle.prefab;
-
- //文件所在路径节点
- // GUILayout.TextField("Node:" + effectParticle.prefab.hierarcyPath);
-
- GUILayout.EndHorizontal();
- }
- }
- EditorGUILayout.EndScrollView();
- }
-
- //特效信息实体类
- class EffectParticle
- {
- public string name;
- public Material material;
- public float maxEmission;
- public GameObject prefab;
- public bool bScaleWithTransform;
- public EffectParticle()
- {
- maxEmission = 0;
-
- }
- }
- }
复制代码 |