using System; using Cysharp.Threading.Tasks; using SLSFramework.General; using UnityEngine; using UnityEngine.Events; namespace Continentis.MainGame.Commands { /// /// 同步/延迟函数命令。新代码请改用 / / 。 /// [Obsolete("请改用 Cmd.Do() / Cmd.Wait() / Cmd.After()。")] public class Cmd_Function : CommandBase { private readonly float functionDuration; private readonly UnityAction function; private readonly bool executeAtStart; public Cmd_Function(float functionDuration, UnityAction function, bool executeAtStart = true) { this.functionDuration = functionDuration; this.function = function; this.executeAtStart = executeAtStart; } public Cmd_Function(UnityAction function) { this.functionDuration = 0f; this.function = function; this.executeAtStart = true; } protected override async UniTask ExecuteAsync(CommandContext outerContext) { if (functionDuration > 0f) { if (executeAtStart) { function?.Invoke(); await UniTask.Delay(TimeSpan.FromSeconds(functionDuration)); } else { await UniTask.Delay(TimeSpan.FromSeconds(functionDuration)); function?.Invoke(); } } else { function?.Invoke(); } } } /// /// 带参数的函数命令,参数由 selfContext 中的 "Target" 注入。 /// 新代码请改用闭包捕获参数,通过 执行。 /// [Obsolete("请改用闭包捕获参数并通过 Cmd.Do() 执行。")] public class Cmd_ParamFunction : CommandBase where T : class { private readonly float functionDuration; private readonly UnityAction function; private readonly bool executeAtStart; public Cmd_ParamFunction(UnityAction function, CommandContext selfContext = null, bool executeAtStart = true) : base(selfContext) { this.functionDuration = 0f; this.function = function; this.executeAtStart = executeAtStart; } public Cmd_ParamFunction(float functionDuration, UnityAction function, CommandContext selfContext = null, bool executeAtStart = true) : base(selfContext) { this.functionDuration = functionDuration; this.function = function; this.executeAtStart = executeAtStart; } protected override async UniTask ExecuteAsync(CommandContext outerContext) { if (!selfContext.TryGet(CommandContextKeys.Target, out T param)) { Debug.LogWarning($"Cmd_ParamFunction<{typeof(T).Name}> 未能从 selfContext 中获取 Target 参数。"); } if (functionDuration > 0f) { if (executeAtStart) { function?.Invoke(param); await UniTask.Delay(TimeSpan.FromSeconds(functionDuration)); } else { await UniTask.Delay(TimeSpan.FromSeconds(functionDuration)); function?.Invoke(param); } } else { function?.Invoke(param); } } } }