Files
JJBB/Assets/Project/Script/Common/Utilities/Particle/ParticleCleaner.cs
2024-08-23 15:49:34 +08:00

88 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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