using UnityEngine; namespace Unity.VisualScripting { /// /// Gets the value of a variable. /// public sealed class GetVariable : UnifiedVariableUnit { /// /// The value of the variable. /// [DoNotSerialize] [PortLabelHidden] public ValueOutput value { get; private set; } /// /// The value to return if the variable is not defined. /// [DoNotSerialize] public ValueInput fallback { get; private set; } /// /// Whether a fallback value should be provided if the /// variable is not defined. /// [Serialize] [Inspectable] [InspectorLabel("Fallback")] public bool specifyFallback { get; set; } = false; protected override void Definition() { base.Definition(); value = ValueOutput(nameof(value), Get).PredictableIf(IsDefined); Requirement(name, value); if (kind == VariableKind.Object) { Requirement(@object, value); } if (specifyFallback) { fallback = ValueInput(nameof(fallback)); Requirement(fallback, value); } } private bool IsDefined(Flow flow) { var name = flow.GetValue(this.name); if (string.IsNullOrEmpty(name)) { return false; } GameObject @object = null; if (kind == VariableKind.Object) { @object = flow.GetValue(this.@object); if (@object == null) { return false; } } var scene = flow.stack.scene; if (kind == VariableKind.Scene) { if (scene == null || !scene.Value.IsValid() || !scene.Value.isLoaded || !Variables.ExistInScene(scene)) { return false; } } switch (kind) { case VariableKind.Flow: return flow.variables.IsDefined(name); case VariableKind.Graph: return Variables.Graph(flow.stack).IsDefined(name); case VariableKind.Object: return Variables.Object(@object).IsDefined(name); case VariableKind.Scene: return Variables.Scene(scene.Value).IsDefined(name); case VariableKind.Application: return Variables.Application.IsDefined(name); case VariableKind.Saved: return Variables.Saved.IsDefined(name); default: throw new UnexpectedEnumValueException(kind); } } private object Get(Flow flow) { var name = flow.GetValue(this.name); VariableDeclarations variables; switch (kind) { case VariableKind.Flow: variables = flow.variables; break; case VariableKind.Graph: variables = Variables.Graph(flow.stack); break; case VariableKind.Object: variables = Variables.Object(flow.GetValue(@object)); break; case VariableKind.Scene: variables = Variables.Scene(flow.stack.scene); break; case VariableKind.Application: variables = Variables.Application; break; case VariableKind.Saved: variables = Variables.Saved; break; default: throw new UnexpectedEnumValueException(kind); } if (specifyFallback && !variables.IsDefined(name)) { return flow.GetValue(fallback); } return variables.Get(name); } } }