源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.9 KiB

  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. EffectEvla m_EffectEvla;
  22. ParticleSystem[] m_ParticleSystems;
  23. MethodInfo m_CalculateEffectUIDataMethod;
  24. int m_ParticleCount = 0;
  25. int m_MaxParticleCount = 0;
  26. ParticleEffectCurve m_CurveParticleCount;
  27. ParticleEffectCurve m_CurveDrawCallCount;
  28. ParticleEffectCurve m_CurveOverdraw;
  29. void Awake()
  30. {
  31. Debug.Log("开始测试单个粒子系统");
  32. Application.targetFrameRate = ParticleEffectCurve.FPS;
  33. m_CurveParticleCount = new ParticleEffectCurve();
  34. m_CurveDrawCallCount = new ParticleEffectCurve();
  35. m_CurveOverdraw = new ParticleEffectCurve();
  36. m_EffectEvla = new EffectEvla(Camera.main);
  37. #if UNITY_2017_1_OR_NEWER
  38. m_CalculateEffectUIDataMethod = typeof(ParticleSystem).GetMethod("CalculateEffectUIData", BindingFlags.Instance | BindingFlags.NonPublic);
  39. #else
  40. m_CalculateEffectUIDataMethod = typeof(ParticleSystem).GetMethod("CountSubEmitterParticles", BindingFlags.Instance | BindingFlags.NonPublic);
  41. #endif
  42. }
  43. void Start()
  44. {
  45. m_ParticleSystems = GetComponentsInChildren<ParticleSystem>();
  46. }
  47. private void LateUpdate()
  48. {
  49. RecordParticleCoun();
  50. m_EffectEvla.Update();
  51. UpdateParticleCountCurve();
  52. UpdateDrawCallCurve();
  53. UpdateOverdrawCurve();
  54. }
  55. public EffectEvlaData[] GetEffectEvlaData()
  56. {
  57. return m_EffectEvla.GetEffectEvlaData();
  58. }
  59. public void RecordParticleCoun()
  60. {
  61. m_ParticleCount = 0;
  62. foreach (var ps in m_ParticleSystems)
  63. {
  64. int count = 0;
  65. #if UNITY_2017_1_OR_NEWER
  66. object[] invokeArgs = { count, 0.0f, Mathf.Infinity };
  67. m_CalculateEffectUIDataMethod.Invoke(ps, invokeArgs);
  68. count = (int)invokeArgs[0];
  69. #else
  70. object[] invokeArgs = { count };
  71. m_CalculateEffectUIDataMethod.Invoke(ps, invokeArgs);
  72. count = (int)invokeArgs[0];
  73. count += ps.particleCount;
  74. #endif
  75. m_ParticleCount += count;
  76. }
  77. if (m_MaxParticleCount < m_ParticleCount)
  78. {
  79. m_MaxParticleCount = m_ParticleCount;
  80. }
  81. }
  82. public int GetParticleCount()
  83. {
  84. return m_ParticleCount;
  85. }
  86. public int GetMaxParticleCount()
  87. {
  88. return m_MaxParticleCount;
  89. }
  90. void UpdateParticleCountCurve()
  91. {
  92. = m_CurveParticleCount.UpdateAnimationCurve(m_ParticleCount, , );
  93. }
  94. void UpdateDrawCallCurve()
  95. {
  96. DrawCall = m_CurveDrawCallCount.UpdateAnimationCurve(GetParticleEffectData.GetOnlyParticleEffecDrawCall(), , );
  97. }
  98. void UpdateOverdrawCurve()
  99. {
  100. EffectEvlaData[] effectEvlaData = this.GetEffectEvlaData();
  101. Overdraw = m_CurveOverdraw.UpdateAnimationCurve((float)effectEvlaData[0].GetPixRate(), , );
  102. }
  103. //监听apply事件
  104. [InitializeOnLoadMethod]
  105. static void StartInitializeOnLoadMethod()
  106. {
  107. PrefabUtility.prefabInstanceUpdated = delegate(GameObject instance)
  108. {
  109. var particleEffectScript = instance.GetComponentsInChildren<ParticleEffectScript>(true);
  110. if (particleEffectScript.Length > 0)
  111. {
  112. Debug.LogError("保存前请先删除ParticleEffectScript脚本!");
  113. }
  114. };
  115. }
  116. }
  117. #endif