using System.Collections; using System.Collections.Generic; using System.Collections.Concurrent; using UnityEngine; using UnityEngine.Events; using UnityEngine.TestTools; namespace BITKit { using SubSystems; public class BITTimer { internal BITTimer() { } public static BITTimer Create(float addTime = 1, UnityAction action = null) { BITTimer timer = new(); timer.excuteTime = Utility.Time.time + addTime; timer.onExcute = action; TimerSystem.queue.Enqueue(timer); return timer; } public float excuteTime; public bool isActive { get; internal set; } public UnityAction onExcute; public void Cancel() { isActive = false; } } } namespace BITKit.SubSystems { public class TimerSystem : SubBITSystem { internal static List timers = new(); internal static ConcurrentQueue queue = new(); public override void OnUpdate(float deltaTime) { List nexts = new(); lock (timers) { timers.ForEach(x => { if (x.excuteTime > Utility.Time.time) { if (x.onExcute is not null) x.onExcute(); x.isActive = false; } else { nexts.Add(x); } }); while (queue.TryDequeue(out var timer)) { nexts.Add(timer); } timers = nexts; } } } }