using System; using System.Threading.Tasks; namespace AibisDream.Kit { public class TaskAction : IAction { private static readonly SimpleObjectPool Pool = new(() => new TaskAction(), null, 10); private Func _taskGetter; private Task _executingTask; private TaskAction() { } public static TaskAction Allocate(Func taskGetter) { var coroutineAction = Pool.Allocate(); coroutineAction.ActionID = ActionKit.IDGenerator++; coroutineAction.IsFinalized = false; coroutineAction.Reset(); coroutineAction._taskGetter = taskGetter; return coroutineAction; } public bool Paused { get; set; } public void Deinit() { if (!IsFinalized) { IsFinalized = true; _taskGetter = null; if (_executingTask != null) { _executingTask.Dispose(); _executingTask = null; } ActionKitMonoBehaviourEvents.AddCallback(new ActionQueueRecycleCallback(Pool, this)); } } public void Reset() { Paused = false; Status = ActionStatus.NotStart; } public bool IsFinalized { get; set; } public ulong ActionID { get; set; } public ActionStatus Status { get; set; } public void OnStart() { StartTask(); } async void StartTask() { _executingTask = _taskGetter(); await _executingTask; Status = ActionStatus.Finished; _executingTask = null; } public void OnExecute(float dt) { } public void OnFinish() { } } public static class TaskExtension { public static ISequence Task(this ISequence self, Func taskGetter) { return self.Append(TaskAction.Allocate(taskGetter)); } public static IAction ToAction(this Task self) { return TaskAction.Allocate(() => self); } } }