A game about forced loneliness, made by TACStudios
1using System.Collections;
2
3namespace Unity.VisualScripting
4{
5 /// <summary>
6 /// Loops as long as a given condition is true.
7 /// </summary>
8 [UnitTitle("While Loop")]
9 [UnitCategory("Control")]
10 [UnitOrder(11)]
11 public class While : LoopUnit
12 {
13 /// <summary>
14 /// The condition to check at each iteration to determine whether the loop should continue.
15 /// </summary>
16 [DoNotSerialize]
17 [PortLabelHidden]
18 public ValueInput condition { get; private set; }
19
20 protected override void Definition()
21 {
22 base.Definition();
23
24 condition = ValueInput<bool>(nameof(condition));
25
26 Requirement(condition, enter);
27 }
28
29 private int Start(Flow flow)
30 {
31 return flow.EnterLoop();
32 }
33
34 private bool CanMoveNext(Flow flow)
35 {
36 return flow.GetValue<bool>(condition);
37 }
38
39 protected override ControlOutput Loop(Flow flow)
40 {
41 var loop = Start(flow);
42
43 var stack = flow.PreserveStack();
44
45 while (flow.LoopIsNotBroken(loop) && CanMoveNext(flow))
46 {
47 flow.Invoke(body);
48
49 flow.RestoreStack(stack);
50 }
51
52 flow.DisposePreservedStack(stack);
53
54 flow.ExitLoop(loop);
55
56 return exit;
57 }
58
59 protected override IEnumerator LoopCoroutine(Flow flow)
60 {
61 var loop = Start(flow);
62
63 var stack = flow.PreserveStack();
64
65 while (flow.LoopIsNotBroken(loop) && CanMoveNext(flow))
66 {
67 yield return body;
68
69 flow.RestoreStack(stack);
70 }
71
72 flow.DisposePreservedStack(stack);
73
74 flow.ExitLoop(loop);
75
76 yield return exit;
77 }
78 }
79}