using UnityEngine;
|
using UnityEngine.Events;
|
using System.Collections.Generic;
|
|
|
public class AnyCountDownUtility : SingletonMonobehaviour<AnyCountDownUtility>
|
{
|
private Stack<CDItem> m_FreeStack = new Stack<CDItem>();
|
public List<CDItem> m_ActiveList = new List<CDItem>();
|
public List<CDItem> m_CacheRemoveList = new List<CDItem>();
|
|
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;
|
}
|
}
|
}
|