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