Files
UnityPackages/Assets/Common/Timer/Runtime/MonoTimer.cs
2025-12-01 12:36:01 +08:00

109 lines
2.9 KiB
C#

using System;
using TriInspector;
using UnityEngine;
namespace Common.Timer.Runtime
{
[DeclareBoxGroup("Debug")]
[DeclareBoxGroup("Internal")]
// TODO: Create a MonoTimerBase similar to TimerBaseSO instead
public class MonoTimer : MonoBehaviour, ITimer
{
[Title("Settings")]
[SerializeField]
protected bool isActive;
public virtual bool IsActive
{
get => isActive;
protected set => isActive = value;
}
protected float currentTime;
[Group("Internal"), ShowInInspector, DisableInEditMode]
public virtual float CurrentTime
{
get
{
currentTime = Mathf.Max(currentTime, 0f);
return currentTime;
}
set => currentTime = Mathf.Max(value, 0f);
}
[Group("Internal"), ShowInInspector, DisableInEditMode]
public virtual float DeltaTime => Time.deltaTime;
public event Action OnTick;
public event Action OnActivate;
public event Action OnDeactivate;
public event Action OnTimeReset;
protected virtual void Update()
{
Tick();
}
#region Public Methods
public virtual void Tick()
{
if (!IsActive) return;
CurrentTime += DeltaTime;
InvokeOnTick();
}
public virtual void Activate(bool resetTime = false)
{
IsActive = true;
InvokeOnActivate();
if (resetTime) ResetTime();
}
public virtual void Deactivate()
{
IsActive = false;
InvokeOnDeactivate();
}
public virtual void ResetTime()
{
CurrentTime = 0f;
InvokeOnTimeReset();
}
public virtual void SetTime(float value)
{
CurrentTime = value;
}
#endregion
#region Protected Methods
protected virtual void InvokeOnTick() => OnTick?.Invoke();
protected virtual void InvokeOnActivate() => OnActivate?.Invoke();
protected virtual void InvokeOnDeactivate() => OnDeactivate?.Invoke();
protected virtual void InvokeOnTimeReset() => OnTimeReset?.Invoke();
#endregion
#if UNITY_EDITOR
[Group("Debug"), Button("Activate"), HideInEditMode]
private void Activate_Editor() => Activate(false);
[Group("Debug"), Button("Activate (Reset Time)"), HideInEditMode]
private void ActivateResetTime_Editor() => Activate(true);
[Group("Debug"), Button("Deactivate"), HideInEditMode]
private void Deactivate_Editor() => Deactivate();
[Group("Debug"), Button("Tick"), HideInEditMode]
private void Tick_Editor() => Tick();
[Group("Debug"), Button("Reset Time"), HideInEditMode]
private void ResetTime_Editor() => ResetTime();
#endif
}
}