ro-webgl/Assets/Src/Core/UI/UIAdditiveEffect.cs
2021-12-21 09:40:39 +08:00

91 lines
2.1 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(Graphic))]
[ExecuteAlways]
public class UIAdditiveEffect : UIBehaviour, IMaterialModifier
{
static private Material s_TempMaterial;
static private int s_ReferenceNum = 0;
private Graphic m_Graphic;
protected override void OnDestroy()
{
base.OnDestroy();
if (s_ReferenceNum <= 0 && s_TempMaterial)
{
#if UNITY_EDITOR
if (Application.isPlaying)
{
Destroy(s_TempMaterial);
}
else
{
DestroyImmediate(s_TempMaterial);
}
#else
Destroy(s_TempMaterial);
#endif
s_TempMaterial = null;
SetMaterialDirty();
}
}
protected override void OnEnable()
{
base.OnEnable();
if (!m_Graphic)
{
m_Graphic = GetComponent<Graphic>();
}
if (!m_Graphic)
{
enabled = false;
return;
}
if (!s_TempMaterial)
{
Shader shader = ResourceMgr.Instance.FindShader("UI/UIAdditive", "Assets/Shaders/UI/UIAdditive");
if (!shader)
{
enabled = false;
return;
}
s_TempMaterial = new Material(shader);
}
if (!s_TempMaterial)
{
enabled = false;
return;
}
s_ReferenceNum = s_ReferenceNum + 1;
SetMaterialDirty();
}
protected override void OnDisable()
{
base.OnDisable();
s_ReferenceNum = s_ReferenceNum - 1;
SetMaterialDirty();
}
public Material GetModifiedMaterial(Material baseMaterial)
{
if (s_TempMaterial)
{
return s_TempMaterial;
}
return baseMaterial;
}
private void SetMaterialDirty()
{
if (m_Graphic)
{
m_Graphic.SetMaterialDirty();
}
}
}