78 lines
1.8 KiB
C#
78 lines
1.8 KiB
C#
using System;
|
|
|
|
namespace Utilities {
|
|
public abstract class Timer {
|
|
protected float initialTime;
|
|
protected float Time { get; set; }
|
|
public bool IsRunning { get; protected set; }
|
|
|
|
public float Progress => Time / initialTime;
|
|
|
|
public Action OnTimerStart = delegate { };
|
|
public Action OnTimerStop = delegate { };
|
|
|
|
protected Timer(float value) {
|
|
initialTime = value;
|
|
IsRunning = false;
|
|
}
|
|
|
|
public void Start() {
|
|
Time = initialTime;
|
|
if (!IsRunning) {
|
|
IsRunning = true;
|
|
OnTimerStart.Invoke();
|
|
}
|
|
}
|
|
|
|
public void Stop() {
|
|
if (IsRunning) {
|
|
IsRunning = false;
|
|
OnTimerStop.Invoke();
|
|
}
|
|
}
|
|
|
|
public void Resume() => IsRunning = true;
|
|
public void Pause() => IsRunning = false;
|
|
|
|
public abstract void Tick(float deltaTime);
|
|
}
|
|
|
|
public class CountdownTimer : Timer {
|
|
public CountdownTimer(float value) : base(value) { }
|
|
|
|
public override void Tick(float deltaTime) {
|
|
if (IsRunning && Time > 0) {
|
|
Time -= deltaTime;
|
|
}
|
|
|
|
if (IsRunning && Time <= 0) {
|
|
Stop();
|
|
}
|
|
}
|
|
|
|
public bool IsFinished => Time <= 0;
|
|
|
|
public void Reset() => Time = initialTime;
|
|
|
|
public void Reset(float newTime) {
|
|
initialTime = newTime;
|
|
Reset();
|
|
}
|
|
}
|
|
|
|
public class StopwatchTimer : Timer {
|
|
public StopwatchTimer() : base(0) { }
|
|
|
|
public override void Tick(float deltaTime) {
|
|
if (IsRunning) {
|
|
Time += deltaTime;
|
|
}
|
|
}
|
|
|
|
public void Reset() => Time = 0;
|
|
|
|
public float GetTime() => Time;
|
|
}
|
|
|
|
}
|