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}