Files
JJBB/Assets/Project/Script/Common/Utilities/Particle/ParticleCleaner.cs

88 lines
2.7 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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();
}