using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using UnityEngine; namespace Unity.VisualScripting { /// /// Executes the output ports in order. /// [UnitCategory("Control")] [UnitOrder(13)] public sealed class Sequence : Unit { [SerializeAs(nameof(outputCount))] private int _outputCount = 2; /// /// The entry point for the sequence. /// [DoNotSerialize] [PortLabelHidden] public ControlInput enter { get; private set; } [DoNotSerialize] [Inspectable, InspectorLabel("Steps"), UnitHeaderInspectable("Steps")] public int outputCount { get => _outputCount; set => _outputCount = Mathf.Clamp(value, 1, 10); } [DoNotSerialize] public ReadOnlyCollection multiOutputs { get; private set; } protected override void Definition() { enter = ControlInputCoroutine(nameof(enter), Enter, EnterCoroutine); var _multiOutputs = new List(); multiOutputs = _multiOutputs.AsReadOnly(); for (var i = 0; i < outputCount; i++) { var output = ControlOutput(i.ToString()); Succession(enter, output); _multiOutputs.Add(output); } } private ControlOutput Enter(Flow flow) { var stack = flow.PreserveStack(); foreach (var output in multiOutputs) { flow.Invoke(output); flow.RestoreStack(stack); } flow.DisposePreservedStack(stack); return null; } private IEnumerator EnterCoroutine(Flow flow) { var stack = flow.PreserveStack(); foreach (var output in multiOutputs) { yield return output; flow.RestoreStack(stack); } flow.DisposePreservedStack(stack); } public void CopyFrom(Sequence source) { base.CopyFrom(source); outputCount = source.outputCount; } } }