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