Ingen beskrivning
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GameObjectEventUnit.cs 2.7KB

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