using NaughtyAttributes; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace GameplayIngredients { public class Timer : MonoBehaviour { public bool StartOnEnable = false; public uint Hours = 0; [Range(0,59)] public uint Minutes = 1; [Range(0,59)] public uint Seconds = 30; [Range(0,999)] public uint Milliseconds = 0; public uint CurrentHours { get { return (uint)Mathf.Floor(m_TTL / 3600); } } public uint CurrentMinutes { get { return (uint)Mathf.Floor(m_TTL / 60) % 60; } } public uint CurrentSeconds { get { return (uint)Mathf.Floor(m_TTL) % 60; } } public uint CurrentMilliseconds { get { return (uint)((m_TTL % 1.0f) * 1000); } } [ReorderableList] public Callable[] OnTimerFinished; [ReorderableList] public Callable[] OnTimerInterrupt; [ReorderableList] public Callable[] OnTimerStart; float m_TTL = 0.0f; public bool isRunning => m_TTL > 0.0f; public void OnEnable() { if (StartOnEnable) Restart(); else m_TTL = 0.0f; } public void Restart(GameObject instigator = null) { m_TTL = Hours * 3600 + Minutes * 60 + Seconds + Milliseconds * 0.001f; Callable.Call(OnTimerStart, instigator); } public void Update() { if(m_TTL > 0.0f) { m_TTL -= Time.deltaTime; if (m_TTL <= 0.0f) { m_TTL = 0.0f; Callable.Call(OnTimerFinished); } } } public void Interrupt(GameObject instigator = null) { if(m_TTL > 0.0f) { m_TTL = 0.0f; Callable.Call(OnTimerInterrupt, instigator); } } } }