using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// UI 界面上的特效管理类 绑定在特效的最外层物体上(特效的Prefab上)
///
public class UIParticleSystem : UIBehaviour
{
private static Shader _replaceShader;
private int _LastAddOrder;
private bool _started;
private UiMaskListener _maskListener;
protected override void OnEnable()
{
base.OnEnable();
var renders = gameObject.GetComponentsInChildren();
for (var i = 0; i < renders.Length; i++)
{
var renderroder = renders[i].sortingOrder;
renders[i].sortingOrder = renderroder > 0 ? renderroder : 1;
var meshRender = renders[i].gameObject.GetComponent();
if (meshRender != null)
meshRender.sortingOrder = renderroder > 0 ? renderroder : 1;
}
Init();
if (_started)
SetCullListening(true);
}
protected override void Start()
{
base.Start();
var mask = gameObject.GetComponentInParent();
if (mask != null)
{
_maskListener = mask.gameObject.EnsureComponent();
SetCullListening(true);
}
_started = true;
}
private void SetCullListening(bool isEnable)
{
if (_maskListener != null)
{
_maskListener.onMaskUndate -= Cull;
if (isEnable)
_maskListener.onMaskUndate += Cull;
}
}
public void Init()
{
var wndParent = gameObject.GetComponentsInParent();
if (wndParent.Length <= 0)
return;
wndParent[0].SetWndDirty();
}
protected override void OnDisable()
{
base.OnDisable();
var wndParent = gameObject.GetComponentsInParent();
if (wndParent.Length <= 0)
return;
wndParent[0].SetWndDirty();
SetCullListening(false);
}
public void SortParticle(int order)
{
if (order > 0)
order -= _LastAddOrder;
var renders = gameObject.GetComponentsInChildren();
for (var i = 0; i < renders.Length; i++)
{
var renderroder = renders[i].sortingOrder;
renderroder += order;
renders[i].sortingOrder = renderroder > 0 ? renderroder : 1;
var meshRender = renders[i].gameObject.GetComponent();
if (meshRender != null)
meshRender.sortingOrder = renderroder > 0 ? renderroder : 1;
}
_LastAddOrder += order;
}
//检查一下是否是在UI的裁剪区域
private void Cull(UiMaskListener listener)
{
var renderers = gameObject.GetComponentsInChildren();
if (renderers.Length < 1)
return;
if (_maskListener != null)
{
var rect = _maskListener.rect;
for (var i = 0; i < renderers.Length; i++)
{
var renderItem = renderers[i];
for (var j = 0; j < renderItem.sharedMaterials.Length; j++)
{
if (renderItem.sharedMaterials[j] != null)
{
var shader = renderItem.sharedMaterials[j].shader;
if (shader != null)
{
var cull = false;
if (shader.name.Contains("AdditiveAlphaWrite"))
{
if (_replaceShader == null)
_replaceShader = Shader.Find("Zhanyou/Particles/AdditiveAlphaWriteMask");
if (_replaceShader != null)
{
renderItem.materials[j].shader = _replaceShader;
cull = true;
}
}
else if (shader.name.Contains("AlphaBlendAlphaWrite"))
{
cull = true;
}
if (cull)
{
var material = renderItem.materials[j];
material.SetFloat("_UseMask", 2);
material.SetVector("_ClipRect", rect);
}
}
}
}
}
}
}
}