chicken_dy/Assets/Scripts/Core/TimerManager/TimerUnit.cs

103 lines
2.0 KiB
C#

using System;
public class TimerUnit
{
public bool IsRunning => mStarted;
public bool IsAvailable => !mDestroyed;
private Action mDelDone;
private bool mStarted = 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 (mStarted)
{
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()
{
mStarted = false;
mTotalTime = 0;
mTimeCounter = -1;
mDelDone = null;
}
public void ResetTimeDelta(float pSeconds)
{
mTotalTime = pSeconds;
}
public void ReUse()
{
mDestroyed = false;
}
public void Destroy()
{
mStarted = false;
mDestroyed = true;
}
private void ExecuteOnce()
{
mStarted = true;
mTimeCounter = mTotalTime;
}
private void Done()
{
mStarted = false;
mDelDone?.Invoke();
mCount--;
if (mCount > 0)
{
ExecuteOnce();
}
else
{
if (mAutoDestroy)
{
Destroy();
}
}
}
}