using System; using System.Collections.Generic; namespace BITKit { /// /// 循环 /// public interface ITicker { /// /// 总帧数 /// ulong TickCount { get; } /// /// 在下一次循环时执行,仅执行一次 /// /// void Add(Action action); /// /// 注册在下一次循环时执行,每次循环都会执行 /// /// void Add(Action action); /// /// 移除循环 /// /// void Remove(Action action); /// /// 手动调用循环 /// /// void ManualTick(float delta); } /// /// 主线程循环 /// public interface IMainTicker : ITicker { } /// /// 线程池循环 /// public interface IThreadTicker : ITicker { } #if UNITY_5_3_OR_NEWER /// /// 最后执行的循环,通常用于旋转、位移等 /// public interface IAfterTicker : ITicker{} /// /// Unity专用固定循环 /// public interface IFixedTicker : ITicker{} #endif public class Ticker : ITicker { private readonly Queue _queue = new(); private event Action TickEvents; public ulong TickCount { get; private set; } public void Add(Action action) { _queue.Enqueue(action); } public void Add(Action action)=>TickEvents += action; public void Remove(Action action)=>TickEvents -= action; public void ManualTick(float delta) { TickCount++; while (_queue.TryDequeue(out var action)) { action.Invoke(); } TickEvents?.Invoke(delta); } } }