ParticleEffectScript.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #if UNITY_EDITOR
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Reflection;
  6. using UnityEditor;
  7. using UnityEditorInternal;
  8. using UnityEngine;
  9. /// <summary>
  10. /// 特效性能分析工具的管理类
  11. /// 将此类添加到特效上即可
  12. /// </summary>
  13. public class ParticleEffectScript : MonoBehaviour {
  14. public AnimationCurve 粒子数量 = new AnimationCurve();
  15. public AnimationCurve DrawCall = new AnimationCurve();
  16. public AnimationCurve Overdraw = new AnimationCurve();
  17. //特效是否循环播放
  18. public bool 循环 = false;
  19. [Range(1,10)]
  20. public int 特效运行时间 = 3;
  21. public RenderTexture RenderTexture;
  22. public Texture2D Texture2D;
  23. EffectEvla m_EffectEvla;
  24. ParticleSystem[] m_ParticleSystems;
  25. MethodInfo m_CalculateEffectUIDataMethod;
  26. int m_ParticleCount = 0;
  27. int m_MaxParticleCount = 0;
  28. ParticleEffectCurve m_CurveParticleCount;
  29. ParticleEffectCurve m_CurveDrawCallCount;
  30. ParticleEffectCurve m_CurveOverdraw;
  31. void Awake()
  32. {
  33. Debug.Log("开始测试单个粒子系统");
  34. Application.targetFrameRate = ParticleEffectCurve.FPS;
  35. m_CurveParticleCount = new ParticleEffectCurve();
  36. m_CurveDrawCallCount = new ParticleEffectCurve();
  37. m_CurveOverdraw = new ParticleEffectCurve();
  38. m_EffectEvla = new EffectEvla(this,Camera.main);
  39. }
  40. void Start()
  41. {
  42. m_ParticleSystems = GetComponentsInChildren<ParticleSystem>();
  43. Shader shader= Shader.Find("ParticleEffectProfiler/OverDraw");
  44. for (int i = 0; i < m_ParticleSystems.Length; i++)
  45. {
  46. Renderer renderer= m_ParticleSystems[i].GetComponent<Renderer>();
  47. if (renderer != null&&renderer.material!=null)
  48. {
  49. for (int j = 0; j < renderer.materials.Length; j++)
  50. {
  51. renderer.materials[j].shader = shader;
  52. }
  53. }
  54. }
  55. #if UNITY_2017_1_OR_NEWER
  56. m_CalculateEffectUIDataMethod = typeof(ParticleSystem).GetMethod("CalculateEffectUIData", BindingFlags.Instance | BindingFlags.NonPublic);
  57. #else
  58. m_CalculateEffectUIDataMethod = typeof(ParticleSystem).GetMethod("CountSubEmitterParticles", BindingFlags.Instance | BindingFlags.NonPublic);
  59. #endif
  60. }
  61. private void LateUpdate()
  62. {
  63. RecordParticleCoun();
  64. m_EffectEvla.Update();
  65. UpdateParticleCountCurve();
  66. UpdateDrawCallCurve();
  67. UpdateOverdrawCurve();
  68. }
  69. public EffectEvlaData[] GetEffectEvlaData()
  70. {
  71. return m_EffectEvla.GetEffectEvlaData();
  72. }
  73. public void RecordParticleCoun()
  74. {
  75. m_ParticleCount = 0;
  76. foreach (var ps in m_ParticleSystems)
  77. {
  78. int count = 0;
  79. #if UNITY_2017_1_OR_NEWER
  80. object[] invokeArgs = { count, 0.0f, Mathf.Infinity };
  81. m_CalculateEffectUIDataMethod.Invoke(ps, invokeArgs);
  82. count = (int)invokeArgs[0];
  83. #else
  84. object[] invokeArgs = { count };
  85. m_CalculateEffectUIDataMethod.Invoke(ps, invokeArgs);
  86. count = (int)invokeArgs[0];
  87. count += ps.particleCount;
  88. #endif
  89. m_ParticleCount += count;
  90. }
  91. if (m_MaxParticleCount < m_ParticleCount)
  92. {
  93. m_MaxParticleCount = m_ParticleCount;
  94. }
  95. }
  96. public int GetParticleCount()
  97. {
  98. return m_ParticleCount;
  99. }
  100. public int GetMaxParticleCount()
  101. {
  102. return m_MaxParticleCount;
  103. }
  104. void UpdateParticleCountCurve()
  105. {
  106. 粒子数量 = m_CurveParticleCount.UpdateAnimationCurve(m_ParticleCount, 循环, 特效运行时间);
  107. }
  108. void UpdateDrawCallCurve()
  109. {
  110. DrawCall = m_CurveDrawCallCount.UpdateAnimationCurve(GetParticleEffectData.GetOnlyParticleEffecDrawCall(), 循环, 特效运行时间);
  111. }
  112. void UpdateOverdrawCurve()
  113. {
  114. EffectEvlaData[] effectEvlaData = this.GetEffectEvlaData();
  115. Overdraw = m_CurveOverdraw.UpdateAnimationCurve(effectEvlaData[0].GetPixRate(), 循环, 特效运行时间);
  116. }
  117. //监听apply事件
  118. [InitializeOnLoadMethod]
  119. static void StartInitializeOnLoadMethod()
  120. {
  121. PrefabUtility.prefabInstanceUpdated = delegate(GameObject instance)
  122. {
  123. var particleEffectScript = instance.GetComponentsInChildren<ParticleEffectScript>(true);
  124. if (particleEffectScript.Length > 0)
  125. {
  126. Debug.LogError("保存前请先删除ParticleEffectScript脚本!");
  127. }
  128. };
  129. }
  130. }
  131. #endif