A game about forced loneliness, made by TACStudios
1using System;
2using UnityEngine;
3
4namespace Unity.VisualScripting
5{
6 public abstract class GameObjectEventUnit<TArgs> : EventUnit<TArgs>, IGameObjectEventUnit
7 {
8 protected sealed override bool register => true;
9
10 public abstract Type MessageListenerType { get; }
11
12 public new class Data : EventUnit<TArgs>.Data
13 {
14 public GameObject target;
15 }
16
17 public override IGraphElementData CreateData()
18 {
19 return new Data();
20 }
21
22 /// <summary>
23 /// The game object that listens for the event.
24 /// </summary>
25 [DoNotSerialize]
26 [NullMeansSelf]
27 [PortLabel("Target")]
28 [PortLabelHidden]
29 public ValueInput target { get; private set; }
30
31 protected override void Definition()
32 {
33 base.Definition();
34
35 target = ValueInput<GameObject>(nameof(target), null).NullMeansSelf();
36 }
37
38 public override EventHook GetHook(GraphReference reference)
39 {
40 if (!reference.hasData)
41 {
42 return hookName;
43 }
44
45 var data = reference.GetElementData<Data>(this);
46
47 return new EventHook(hookName, data.target);
48 }
49
50 protected virtual string hookName => throw new InvalidImplementationException($"Missing event hook for '{this}'.");
51
52 private void UpdateTarget(GraphStack stack)
53 {
54 var data = stack.GetElementData<Data>(this);
55
56 var wasListening = data.isListening;
57
58 var newTarget = Flow.FetchValue<GameObject>(target, stack.ToReference());
59
60 if (newTarget != data.target)
61 {
62 if (wasListening)
63 {
64 StopListening(stack);
65 }
66
67 data.target = newTarget;
68
69 if (wasListening)
70 {
71 StartListening(stack, false);
72 }
73 }
74 }
75
76 protected void StartListening(GraphStack stack, bool updateTarget)
77 {
78 if (updateTarget)
79 {
80 UpdateTarget(stack);
81 }
82
83 var data = stack.GetElementData<Data>(this);
84
85 if (data.target == null)
86 {
87 return;
88 }
89
90 if (UnityThread.allowsAPI)
91 {
92 if (MessageListenerType != null) // can be null. CustomEvent doesn't need a message listener
93 MessageListener.AddTo(MessageListenerType, data.target);
94 }
95
96 base.StartListening(stack);
97 }
98
99 public override void StartListening(GraphStack stack)
100 {
101 StartListening(stack, true);
102 }
103 }
104}