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}