using System.Collections.Generic; using UnityEngine; /// /// 特效残余清理工具 /// // 其次解决部分Particle需要延迟回收的情况,在特效到了结束时机,会保留拖尾一段时间 public class ParticleCleaner : MonoBehaviour, IParticleCleaner { protected List commonObjList; protected List delayObjList; protected List trailRendererList; public float DelayRecoveryTime { get; private set; } /// /// 开始延迟回收 - 关闭除规定组件外的其他组件,等待回收 /// public virtual void StartDelayRecovery() { for (var i = 0; i < commonObjList.Count; i++) commonObjList[i].SetActive(false); } protected virtual void Awake() { trailRendererList = new List(); delayObjList = new List(); commonObjList = new List(); // 标记最根部节点的状态类型 foreach (Transform child in transform) { var delayComponent = child.GetComponent(); if (delayComponent == null || delayComponent.delayTime <= 0) { commonObjList.Add(child.gameObject); } else { DelayRecoveryTime = Mathf.Max(delayComponent.delayTime, DelayRecoveryTime); delayObjList.Add(child.gameObject); } GatherComponentOnChild(child); } } private void OnEnable() { for (var i = 0; i < trailRendererList.Count; i++) trailRendererList[i].Clear(); EnableComponents(true); } protected virtual void EnableComponents(bool isEnable) { for (var i = 0; i < trailRendererList.Count; i++) trailRendererList[i].enabled = isEnable; for (var i = 0; i < commonObjList.Count; i++) commonObjList[i].SetActive(isEnable); for (var i = 0; i < delayObjList.Count; i++) delayObjList[i].SetActive(isEnable); } private void OnDisable() { EnableComponents(false); } /// /// 遍历子节点,搜集子节点上需要清理的组件 /// /// 子节点 private void GatherComponentOnChild(Transform parent) { var trailRendererer = parent.GetComponent(); if (trailRendererer != null) trailRendererList.Add(trailRendererer); foreach (Transform child in parent) GatherComponentOnChild(child); } } public interface IParticleCleaner { float DelayRecoveryTime { get; } void StartDelayRecovery(); }