UIAdditiveEffect.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using UnityEngine;
  2. using UnityEngine.EventSystems;
  3. using UnityEngine.UI;
  4. [RequireComponent(typeof(Graphic))]
  5. [ExecuteAlways]
  6. public class UIAdditiveEffect : UIBehaviour, IMaterialModifier
  7. {
  8. static private Material s_TempMaterial;
  9. static private int s_ReferenceNum = 0;
  10. private Graphic m_Graphic;
  11. protected override void OnDestroy()
  12. {
  13. base.OnDestroy();
  14. if (s_ReferenceNum <= 0 && s_TempMaterial)
  15. {
  16. #if UNITY_EDITOR
  17. if (Application.isPlaying)
  18. {
  19. Destroy(s_TempMaterial);
  20. }
  21. else
  22. {
  23. DestroyImmediate(s_TempMaterial);
  24. }
  25. #else
  26. Destroy(s_TempMaterial);
  27. #endif
  28. s_TempMaterial = null;
  29. SetMaterialDirty();
  30. }
  31. }
  32. protected override void OnEnable()
  33. {
  34. base.OnEnable();
  35. if (!m_Graphic)
  36. {
  37. m_Graphic = GetComponent<Graphic>();
  38. }
  39. if (!m_Graphic)
  40. {
  41. enabled = false;
  42. return;
  43. }
  44. if (!s_TempMaterial)
  45. {
  46. Shader shader = ResourceMgr.Instance.FindShader("UI/UIAdditive", "Assets/Shaders/UI/UIAdditive");
  47. if (!shader)
  48. {
  49. enabled = false;
  50. return;
  51. }
  52. s_TempMaterial = new Material(shader);
  53. }
  54. if (!s_TempMaterial)
  55. {
  56. enabled = false;
  57. return;
  58. }
  59. s_ReferenceNum = s_ReferenceNum + 1;
  60. SetMaterialDirty();
  61. }
  62. protected override void OnDisable()
  63. {
  64. base.OnDisable();
  65. s_ReferenceNum = s_ReferenceNum - 1;
  66. SetMaterialDirty();
  67. }
  68. public Material GetModifiedMaterial(Material baseMaterial)
  69. {
  70. if (s_TempMaterial)
  71. {
  72. return s_TempMaterial;
  73. }
  74. return baseMaterial;
  75. }
  76. private void SetMaterialDirty()
  77. {
  78. if (m_Graphic)
  79. {
  80. m_Graphic.SetMaterialDirty();
  81. }
  82. }
  83. }