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