No Description
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.

MemberUnit.cs 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityObject = UnityEngine.Object;
  4. namespace Unity.VisualScripting
  5. {
  6. [SpecialUnit]
  7. public abstract class MemberUnit : Unit, IAotStubbable
  8. {
  9. protected MemberUnit() : base() { }
  10. protected MemberUnit(Member member) : this()
  11. {
  12. this.member = member;
  13. }
  14. [Serialize]
  15. [MemberFilter(Fields = true, Properties = true, Methods = true, Constructors = true)]
  16. public Member member { get; set; }
  17. /// <summary>
  18. /// The target object.
  19. /// </summary>
  20. [DoNotSerialize]
  21. [PortLabelHidden]
  22. [NullMeansSelf]
  23. public ValueInput target { get; private set; }
  24. public override bool canDefine => member != null;
  25. protected override void Definition()
  26. {
  27. member.EnsureReflected();
  28. if (!IsMemberValid(member))
  29. {
  30. throw new NotSupportedException("The member type is not valid for this unit.");
  31. }
  32. if (member.requiresTarget)
  33. {
  34. target = ValueInput(member.targetType, nameof(target));
  35. target.SetDefaultValue(member.targetType.PseudoDefault());
  36. if (typeof(UnityObject).IsAssignableFrom(member.targetType))
  37. {
  38. target.NullMeansSelf();
  39. }
  40. }
  41. }
  42. protected abstract bool IsMemberValid(Member member);
  43. public override void Prewarm()
  44. {
  45. if (member != null && member.isReflected)
  46. {
  47. member.Prewarm();
  48. }
  49. }
  50. public override IEnumerable<object> GetAotStubs(HashSet<object> visited)
  51. {
  52. if (member != null && member.isReflected)
  53. {
  54. yield return member.info;
  55. }
  56. }
  57. }
  58. }