using System; namespace AibisDream.Kit { internal class Callback : IAction { private Callback() { } private Action _callback; private static readonly SimpleObjectPool SimpleObjectPool = new(() => new Callback(), null, 10); public static Callback Allocate(Action callback) { var callbackAction = SimpleObjectPool.Allocate(); callbackAction.ActionID = ActionKit.IDGenerator++; callbackAction.Reset(); callbackAction.IsFinalized = false; callbackAction._callback = callback; return callbackAction; } public bool Paused { get; set; } public bool IsFinalized { get; set; } public ulong ActionID { get; set; } public ActionStatus Status { get; set; } public void OnStart() { _callback?.Invoke(); this.Finish(); } public void OnExecute(float dt) { } public void OnFinish() { } public void Deinit() { if (!IsFinalized) { IsFinalized = true; _callback = null; ActionKitMonoBehaviourEvents.AddCallback( new ActionQueueRecycleCallback(SimpleObjectPool, this)); } } public void Reset() { Paused = false; Status = ActionStatus.NotStart; } } public static class CallbackExtension { public static ISequence Callback(this ISequence self, Action callback) { return self.Append(Kit.Callback.Allocate(callback)); } } }