Maze / Library /PackageCache /com.unity.visualscripting@1.8.0 /Runtime /VisualScripting.Flow /Framework /Codebase /SetMember.cs
| namespace Unity.VisualScripting | |
| { | |
| /// <summary> | |
| /// Sets the value of a field or property via reflection. | |
| /// </summary> | |
| public sealed class SetMember : MemberUnit | |
| { | |
| public SetMember() : base() { } | |
| public SetMember(Member member) : base(member) { } | |
| /// <summary> | |
| /// Whether the target should be output to allow for chaining. | |
| /// </summary> | |
| [] | |
| [] | |
| public bool chainable { get; set; } | |
| [] | |
| public bool supportsChaining => member.requiresTarget; | |
| [] | |
| [] | |
| public Member setter | |
| { | |
| get => member; | |
| set => member = value; | |
| } | |
| [] | |
| [] | |
| public ControlInput assign { get; private set; } | |
| [] | |
| [] | |
| [] | |
| public ValueInput input { get; private set; } | |
| [] | |
| [] | |
| [] | |
| public ValueOutput output { get; private set; } | |
| /// <summary> | |
| /// The target object used when setting the value. | |
| /// </summary> | |
| [] | |
| [] | |
| [] | |
| public ValueOutput targetOutput { get; private set; } | |
| [] | |
| [] | |
| public ControlOutput assigned { get; private set; } | |
| protected override void Definition() | |
| { | |
| base.Definition(); | |
| assign = ControlInput(nameof(assign), Assign); | |
| assigned = ControlOutput(nameof(assigned)); | |
| Succession(assign, assigned); | |
| if (supportsChaining && chainable) | |
| { | |
| targetOutput = ValueOutput(member.targetType, nameof(targetOutput)); | |
| Assignment(assign, targetOutput); | |
| } | |
| output = ValueOutput(member.type, nameof(output)); | |
| Assignment(assign, output); | |
| if (member.requiresTarget) | |
| { | |
| Requirement(target, assign); | |
| } | |
| input = ValueInput(member.type, nameof(input)); | |
| Requirement(input, assign); | |
| if (member.allowsNull) | |
| { | |
| input.AllowsNull(); | |
| } | |
| input.SetDefaultValue(member.type.PseudoDefault()); | |
| } | |
| protected override bool IsMemberValid(Member member) | |
| { | |
| return member.isAccessor && member.isSettable; | |
| } | |
| private object GetAndChainTarget(Flow flow) | |
| { | |
| if (member.requiresTarget) | |
| { | |
| var target = flow.GetValue(this.target, member.targetType); | |
| if (supportsChaining && chainable) | |
| { | |
| flow.SetValue(targetOutput, target); | |
| } | |
| return target; | |
| } | |
| return null; | |
| } | |
| private ControlOutput Assign(Flow flow) | |
| { | |
| var target = GetAndChainTarget(flow); | |
| var value = flow.GetConvertedValue(input); | |
| flow.SetValue(output, member.Set(target, value)); | |
| return assigned; | |
| } | |
| public override AnalyticsIdentifier GetAnalyticsIdentifier() | |
| { | |
| var aid = new AnalyticsIdentifier | |
| { | |
| Identifier = $"{member.targetType.FullName}.{member.name}(Set)", | |
| Namespace = member.targetType.Namespace, | |
| }; | |
| aid.Hashcode = aid.Identifier.GetHashCode(); | |
| return aid; | |
| } | |
| } | |
| } | |