123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- using System;
- using UnityEngine;
-
- namespace Unity.VisualScripting
- {
- public abstract class GameObjectEventUnit<TArgs> : EventUnit<TArgs>, IGameObjectEventUnit
- {
- protected sealed override bool register => true;
-
- public abstract Type MessageListenerType { get; }
-
- public new class Data : EventUnit<TArgs>.Data
- {
- public GameObject target;
- }
-
- public override IGraphElementData CreateData()
- {
- return new Data();
- }
-
- /// <summary>
- /// The game object that listens for the event.
- /// </summary>
- [DoNotSerialize]
- [NullMeansSelf]
- [PortLabel("Target")]
- [PortLabelHidden]
- public ValueInput target { get; private set; }
-
- protected override void Definition()
- {
- base.Definition();
-
- target = ValueInput<GameObject>(nameof(target), null).NullMeansSelf();
- }
-
- public override EventHook GetHook(GraphReference reference)
- {
- if (!reference.hasData)
- {
- return hookName;
- }
-
- var data = reference.GetElementData<Data>(this);
-
- return new EventHook(hookName, data.target);
- }
-
- protected virtual string hookName => throw new InvalidImplementationException($"Missing event hook for '{this}'.");
-
- private void UpdateTarget(GraphStack stack)
- {
- var data = stack.GetElementData<Data>(this);
-
- var wasListening = data.isListening;
-
- var newTarget = Flow.FetchValue<GameObject>(target, stack.ToReference());
-
- if (newTarget != data.target)
- {
- if (wasListening)
- {
- StopListening(stack);
- }
-
- data.target = newTarget;
-
- if (wasListening)
- {
- StartListening(stack, false);
- }
- }
- }
-
- protected void StartListening(GraphStack stack, bool updateTarget)
- {
- if (updateTarget)
- {
- UpdateTarget(stack);
- }
-
- var data = stack.GetElementData<Data>(this);
-
- if (data.target == null)
- {
- return;
- }
-
- if (UnityThread.allowsAPI)
- {
- if (MessageListenerType != null) // can be null. CustomEvent doesn't need a message listener
- MessageListener.AddTo(MessageListenerType, data.target);
- }
-
- base.StartListening(stack);
- }
-
- public override void StartListening(GraphStack stack)
- {
- StartListening(stack, true);
- }
- }
- }
|