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