暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. namespace Unity.VisualScripting
  2. {
  3. /// <summary>
  4. /// Sets the value of a field or property via reflection.
  5. /// </summary>
  6. public sealed class SetMember : MemberUnit
  7. {
  8. public SetMember() : base() { }
  9. public SetMember(Member member) : base(member) { }
  10. /// <summary>
  11. /// Whether the target should be output to allow for chaining.
  12. /// </summary>
  13. [Serialize]
  14. [InspectableIf(nameof(supportsChaining))]
  15. public bool chainable { get; set; }
  16. [DoNotSerialize]
  17. public bool supportsChaining => member.requiresTarget;
  18. [DoNotSerialize]
  19. [MemberFilter(Fields = true, Properties = true, ReadOnly = false)]
  20. public Member setter
  21. {
  22. get => member;
  23. set => member = value;
  24. }
  25. [DoNotSerialize]
  26. [PortLabelHidden]
  27. public ControlInput assign { get; private set; }
  28. [DoNotSerialize]
  29. [PortLabel("Value")]
  30. [PortLabelHidden]
  31. public ValueInput input { get; private set; }
  32. [DoNotSerialize]
  33. [PortLabel("Value")]
  34. [PortLabelHidden]
  35. public ValueOutput output { get; private set; }
  36. /// <summary>
  37. /// The target object used when setting the value.
  38. /// </summary>
  39. [DoNotSerialize]
  40. [PortLabel("Target")]
  41. [PortLabelHidden]
  42. public ValueOutput targetOutput { get; private set; }
  43. [DoNotSerialize]
  44. [PortLabelHidden]
  45. public ControlOutput assigned { get; private set; }
  46. protected override void Definition()
  47. {
  48. base.Definition();
  49. assign = ControlInput(nameof(assign), Assign);
  50. assigned = ControlOutput(nameof(assigned));
  51. Succession(assign, assigned);
  52. if (supportsChaining && chainable)
  53. {
  54. targetOutput = ValueOutput(member.targetType, nameof(targetOutput));
  55. Assignment(assign, targetOutput);
  56. }
  57. output = ValueOutput(member.type, nameof(output));
  58. Assignment(assign, output);
  59. if (member.requiresTarget)
  60. {
  61. Requirement(target, assign);
  62. }
  63. input = ValueInput(member.type, nameof(input));
  64. Requirement(input, assign);
  65. if (member.allowsNull)
  66. {
  67. input.AllowsNull();
  68. }
  69. input.SetDefaultValue(member.type.PseudoDefault());
  70. }
  71. protected override bool IsMemberValid(Member member)
  72. {
  73. return member.isAccessor && member.isSettable;
  74. }
  75. private object GetAndChainTarget(Flow flow)
  76. {
  77. if (member.requiresTarget)
  78. {
  79. var target = flow.GetValue(this.target, member.targetType);
  80. if (supportsChaining && chainable)
  81. {
  82. flow.SetValue(targetOutput, target);
  83. }
  84. return target;
  85. }
  86. return null;
  87. }
  88. private ControlOutput Assign(Flow flow)
  89. {
  90. var target = GetAndChainTarget(flow);
  91. var value = flow.GetConvertedValue(input);
  92. flow.SetValue(output, member.Set(target, value));
  93. return assigned;
  94. }
  95. #region Analytics
  96. public override AnalyticsIdentifier GetAnalyticsIdentifier()
  97. {
  98. var aid = new AnalyticsIdentifier
  99. {
  100. Identifier = $"{member.targetType.FullName}.{member.name}(Set)",
  101. Namespace = member.targetType.Namespace,
  102. };
  103. aid.Hashcode = aid.Identifier.GetHashCode();
  104. return aid;
  105. }
  106. #endregion
  107. }
  108. }