using System; using UnityEngine; using UnityEngine.Events; namespace SLSUtilities.General { public class PrioritizedFunctionBase : IPrioritized { public int Priority { get; set; } /// /// 执行计数。 /// -1 代表无限次执行。 /// >0 代表剩余执行次数,每次 Invoke 后递减,减至 0 时应被移除。 /// public int ExecutionCount { get; set; } = -1; public bool ShouldRemove => ExecutionCount == 0; protected void UpdateCount() { if (ExecutionCount > 0) ExecutionCount--; } } #region PrioritizedAction public class PrioritizedAction : PrioritizedFunctionBase { private readonly Action action; public PrioritizedAction(Action action, int priority = 0, int count = -1) { this.action = action; Priority = priority; ExecutionCount = count; } public void Invoke() { action.Invoke(); UpdateCount(); } } public class PrioritizedAction : PrioritizedFunctionBase { private readonly Action action; public PrioritizedAction(Action action, int priority = 0, int count = -1) { this.action = action; Priority = priority; ExecutionCount = count; } public void Invoke(T arg) { action.Invoke(arg); UpdateCount(); } } public class PrioritizedAction : PrioritizedFunctionBase { private readonly Action action; public PrioritizedAction(Action action, int priority = 0, int count = -1) { this.action = action; Priority = priority; ExecutionCount = count; } public void Invoke(T0 arg0, T1 arg1) { action.Invoke(arg0, arg1); UpdateCount(); } } public class PrioritizedAction : PrioritizedFunctionBase { private readonly Action action; public PrioritizedAction(Action action, int priority = 0, int count = -1) { this.action = action; Priority = priority; ExecutionCount = count; } public void Invoke(T0 arg0, T1 arg1, T2 arg2) { action.Invoke(arg0, arg1, arg2); UpdateCount(); } } #endregion #region PrioritizedFunc public class PrioritizedFunc : PrioritizedFunctionBase { private readonly Func func; public PrioritizedFunc(Func func, int priority = 0, int count = -1) { this.func = func; this.Priority = priority; this.ExecutionCount = count; } public TR Invoke() { TR result = func.Invoke(); UpdateCount(); return result; } } public class PrioritizedFunc : PrioritizedFunctionBase { private readonly Func func; public PrioritizedFunc(Func func, int priority = 0, int count = -1) { this.func = func; this.Priority = priority; this.ExecutionCount = count; } public TR Invoke(T arg) { TR result = func.Invoke(arg); UpdateCount(); return result; } } public class PrioritizedFunc : PrioritizedFunctionBase { private readonly Func func; public PrioritizedFunc(Func func, int priority = 0, int count = -1) { this.func = func; this.Priority = priority; this.ExecutionCount = count; } public TR Invoke(T0 arg0, T1 arg1) { TR result = func.Invoke(arg0, arg1); UpdateCount(); return result; } } public class PrioritizedFunc : PrioritizedFunctionBase { private readonly Func func; public PrioritizedFunc(Func func, int priority = 0, int count = -1) { this.func = func; this.Priority = priority; this.ExecutionCount = count; } public TR Invoke(T0 arg0, T1 arg1, T2 arg2) { TR result = func.Invoke(arg0, arg1, arg2); UpdateCount(); return result; } } #endregion }