using System.Collections.Generic; public delegate void DelayTriggeredCallback (T val); public class FrameDelayInfo { public T mValue; public int mFrame; public FrameDelayInfo (T val, int frame) { mValue = val; mFrame = frame; } } public class TimeDelayInfo { public T mValue; public float mTime; public int nSeq; public TimeDelayInfo (T val, float time,int seq) { mValue = val; mTime = time; nSeq = seq; } } public class FrameDelayManager { List> mList; DelayTriggeredCallback mCallback; public FrameDelayManager (DelayTriggeredCallback cb) { mList = new List> (); mCallback = cb; } public void Update () { for (int i = mList.Count - 1; i >= 0; i--) { mList [i].mFrame--; if (mList [i].mFrame <= 0) { mCallback (mList [i].mValue); mList.RemoveAt (i); } } } public void Add (T val, int delayFrame) { if (delayFrame <= 0) mCallback (val); else mList.Insert (0, new FrameDelayInfo (val, delayFrame)); } public void Clear () { mList.Clear (); } } public class TimeDelayManager { List> mList; DelayTriggeredCallback mCallback; public TimeDelayManager (DelayTriggeredCallback cb) { mList = new List> (); mCallback = cb; } public void Update (float deltaTime) { for (int i = mList.Count - 1; i >= 0; i--) { mList [i].mTime -= deltaTime; if (mList [i].mTime <= 0) { mCallback (mList [i].mValue); mList.RemoveAt (i); } } } public void Add (T val, float delayTime) { if (delayTime <= 0) mCallback (val); else mList.Insert (0, new TimeDelayInfo (val, delayTime, mList.Count+1)); } public void Clear () { mList.Clear (); } }