using UnityEngine; using UnityEngine.Events; using System.Collections.Generic; public class AnyCountDownUtility : SingletonMonobehaviour { private Stack m_FreeStack = new Stack(); public List m_ActiveList = new List(); public List m_CacheRemoveList = new List(); public void Create(float cd, GActor target, UnityAction callback) { CDItem _item = null; if (m_FreeStack.Count > 0) { _item = m_FreeStack.Pop(); } else { _item = new CDItem(); } _item.Reset(cd, target, callback); _item.Start(); m_ActiveList.Add(_item); } void Update() { m_CacheRemoveList.Clear(); for (int i = 0; i < m_ActiveList.Count; ++i) { m_ActiveList[i].Update(); if (m_ActiveList[i].IsFinished()) { m_CacheRemoveList.Add(m_ActiveList[i]); } } for (int i = 0; i < m_CacheRemoveList.Count; ++i) { m_CacheRemoveList[i].Reset(0, null, null); m_ActiveList.Remove(m_CacheRemoveList[i]); m_FreeStack.Push(m_CacheRemoveList[i]); } m_CacheRemoveList.Clear(); } public class CDItem { private float m_Cd; private UnityAction m_Callback; private float m_StartTime; private GActor m_Target; public void Start() { m_StartTime = Time.realtimeSinceStartup; } public void Update() { if (Time.realtimeSinceStartup - m_StartTime > m_Cd) { if (m_Callback != null) { m_Callback(); } } } public bool IsFinished() { return Time.realtimeSinceStartup - m_StartTime > m_Cd || m_Target == null || m_Target.ActorInfo == null || m_Target.ActorInfo.serverDie; } public void Reset(float cd, GActor target, UnityAction callback) { m_Cd = cd; m_Target = target; m_Callback = callback; } } }