using System; using System.Collections.Generic; using System.Linq; using UniRx; using UnityEngine; namespace SoulliesFramework.General { public enum ExecutionMode { Sequential, Parallel } public class CommandGroup : CommandBase { private readonly List commands = new List(); private readonly ExecutionMode mode; public CommandGroup(ExecutionMode mode, params ICommand[] commands) { this.mode = mode; this.commands.AddRange(commands); } public CommandGroup AddCommand(ICommand command) { commands.Add(command); return this; } protected override IObservable OnExecute(CommandContext context) { // --- 核心修正 --- // 我们不再直接调用 cmd.Execute(context)。 // 而是创建一个“延迟执行”的 Observable 序列。 // Defer 会将对 Execute 的调用推迟到 Concat/WhenAll 真正订阅它的时候。 var lazyCommandObservables = commands.Select(cmd => Observable.Defer(() => cmd.Execute(context)) ); IObservable executionFlow; if (mode == ExecutionMode.Sequential) { // Concat 现在会按顺序地、一个一个地订阅 lazyCommandObservables 中的 Defer 对象。 // 每订阅一个,对应的 cmd.Execute() 才会被真正调用。 executionFlow = lazyCommandObservables.Concat(); } else { // WhenAll 同样能很好地处理延迟的 Observable 序列。 executionFlow = Observable.WhenAll(lazyCommandObservables).AsUnitObservable(); } return executionFlow; // 注意:基类中的 TakeUntil(forceCompleteSubject) 会自动应用到这里返回的流上,所以无需重复添加。 } } }