108 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | 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(); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |