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