A game about forced loneliness, made by TACStudios
1using UnityEngine;
2
3namespace Unity.VisualScripting
4{
5 [UnitOrder(502)]
6 public abstract class MoveTowards<T> : Unit
7 {
8 /// <summary>
9 /// The current value.
10 /// </summary>
11 [DoNotSerialize]
12 public ValueInput current { get; private set; }
13
14 /// <summary>
15 /// The target value.
16 /// </summary>
17 [DoNotSerialize]
18 public ValueInput target { get; private set; }
19
20 /// <summary>
21 /// The maximum scalar increment between values.
22 /// </summary>
23 [DoNotSerialize]
24 public ValueInput maxDelta { get; private set; }
25
26 /// <summary>
27 /// The incremented value.
28 /// </summary>
29 [DoNotSerialize]
30 [PortLabelHidden]
31 public ValueOutput result { get; private set; }
32
33 [Serialize, Inspectable, UnitHeaderInspectable("Per Second"), InspectorToggleLeft]
34 public bool perSecond { get; set; }
35
36 [DoNotSerialize]
37 protected virtual T defaultCurrent => default(T);
38
39 [DoNotSerialize]
40 protected virtual T defaultTarget => default(T);
41
42 protected override void Definition()
43 {
44 current = ValueInput(nameof(current), defaultCurrent);
45 target = ValueInput(nameof(target), defaultTarget);
46 maxDelta = ValueInput<float>(nameof(maxDelta), 0);
47 result = ValueOutput(nameof(result), Operation);
48
49 Requirement(current, result);
50 Requirement(target, result);
51 Requirement(maxDelta, result);
52 }
53
54 private T Operation(Flow flow)
55 {
56 return Operation(flow.GetValue<T>(current), flow.GetValue<T>(target), flow.GetValue<float>(maxDelta) * (perSecond ? Time.deltaTime : 1));
57 }
58
59 public abstract T Operation(T current, T target, float maxDelta);
60 }
61}