using System;
using Cysharp.Threading.Tasks;
using SLSUtilities.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);
}
}
}
}