A game about forced loneliness, made by TACStudios
1using System.Collections; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using UnityEngine; 5 6namespace Unity.VisualScripting 7{ 8 /// <summary> 9 /// Executes the output ports in order. 10 /// </summary> 11 [UnitCategory("Control")] 12 [UnitOrder(13)] 13 public sealed class Sequence : Unit 14 { 15 [SerializeAs(nameof(outputCount))] 16 private int _outputCount = 2; 17 18 /// <summary> 19 /// The entry point for the sequence. 20 /// </summary> 21 [DoNotSerialize] 22 [PortLabelHidden] 23 public ControlInput enter { get; private set; } 24 25 [DoNotSerialize] 26 [Inspectable, InspectorLabel("Steps"), UnitHeaderInspectable("Steps")] 27 public int outputCount 28 { 29 get => _outputCount; 30 set => _outputCount = Mathf.Clamp(value, 1, 10); 31 } 32 33 [DoNotSerialize] 34 public ReadOnlyCollection<ControlOutput> multiOutputs { get; private set; } 35 36 protected override void Definition() 37 { 38 enter = ControlInputCoroutine(nameof(enter), Enter, EnterCoroutine); 39 40 var _multiOutputs = new List<ControlOutput>(); 41 42 multiOutputs = _multiOutputs.AsReadOnly(); 43 44 for (var i = 0; i < outputCount; i++) 45 { 46 var output = ControlOutput(i.ToString()); 47 48 Succession(enter, output); 49 50 _multiOutputs.Add(output); 51 } 52 } 53 54 private ControlOutput Enter(Flow flow) 55 { 56 var stack = flow.PreserveStack(); 57 58 foreach (var output in multiOutputs) 59 { 60 flow.Invoke(output); 61 62 flow.RestoreStack(stack); 63 } 64 65 flow.DisposePreservedStack(stack); 66 67 return null; 68 } 69 70 private IEnumerator EnterCoroutine(Flow flow) 71 { 72 var stack = flow.PreserveStack(); 73 74 foreach (var output in multiOutputs) 75 { 76 yield return output; 77 78 flow.RestoreStack(stack); 79 } 80 81 flow.DisposePreservedStack(stack); 82 } 83 84 public void CopyFrom(Sequence source) 85 { 86 base.CopyFrom(source); 87 outputCount = source.outputCount; 88 } 89 } 90}