using System; public class TimerUnit { public bool IsRunning => mIsRunning; public bool IsAvailable => !mDestroyed; private Action mDelDone; private bool mIsRunning = false; private bool mDestroyed = false; private float mTotalTime; private float mTimeCounter = -1; private int mCount = 0; private bool mIgnoreTimeScale = false; private bool mAutoDestroy = false; public void Update(float pDeltaTime, float pUnscaledDeltaTime) { if (mIsRunning) { if (mTimeCounter > 0) { mTimeCounter -= mIgnoreTimeScale ? pUnscaledDeltaTime : pDeltaTime; if (mTimeCounter <= 0) { Done(); } } } } public void StartTimer(Action pDelDone, float pSeconds, int pCount = 1, bool pIgnoreTimeScale = false, bool pAutoDestroy = false) { mDelDone = pDelDone; mTotalTime = pSeconds; mCount = pCount; mIgnoreTimeScale = pIgnoreTimeScale; mAutoDestroy = pAutoDestroy; if (pSeconds <= 0) { Done(); } else { ExecuteOnce(); } } public void CancelTimer() { mIsRunning = false; mTotalTime = 0; mTimeCounter = -1; mDelDone = null; } public void PauseTimer(bool pPause) { mIsRunning = !pPause; } public void ResetTimeDelta(float pSeconds) { mTotalTime = pSeconds; } public void ReUse() { mDestroyed = false; } public void Destroy() { mIsRunning = false; mDestroyed = true; } private void ExecuteOnce() { mIsRunning = true; mTimeCounter = mTotalTime; } private void Done() { mIsRunning = false; mDelDone?.Invoke(); mCount--; if (mCount > 0) { ExecuteOnce(); } else { if (mAutoDestroy) { Destroy(); } } } }