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}