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); } } } } } } } }