using System; using SoulliesFramework.General; using UniRx; using UnityEngine; using UnityEngine.Events; namespace Continentis.MainGame.Commands { 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; } protected override IObservable OnExecute(CommandContext context) { if (functionDuration > 0) { if (executeAtStart) //在持续时间开始时执行 { function?.Invoke(); return Observable.Timer(TimeSpan.FromSeconds(functionDuration)).AsUnitObservable(); } return Observable.Timer(TimeSpan.FromSeconds(functionDuration)) .Do(_ => function?.Invoke()) .AsUnitObservable(); //在持续时间结束时执行 } function?.Invoke(); return Observable.Return(Unit.Default); //如果持续时间为0,立即完成 } } }