123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- using UnityEngine;
-
- namespace Unity.VisualScripting
- {
- /// <summary>
- /// Gets the value of a variable.
- /// </summary>
- public sealed class GetVariable : UnifiedVariableUnit
- {
- /// <summary>
- /// The value of the variable.
- /// </summary>
- [DoNotSerialize]
- [PortLabelHidden]
- public ValueOutput value { get; private set; }
-
- /// <summary>
- /// The value to return if the variable is not defined.
- /// </summary>
- [DoNotSerialize]
- public ValueInput fallback { get; private set; }
-
- /// <summary>
- /// Whether a fallback value should be provided if the
- /// variable is not defined.
- /// </summary>
- [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<object>(nameof(fallback));
- Requirement(fallback, value);
- }
- }
-
- private bool IsDefined(Flow flow)
- {
- var name = flow.GetValue<string>(this.name);
-
- if (string.IsNullOrEmpty(name))
- {
- return false;
- }
-
- GameObject @object = null;
-
- if (kind == VariableKind.Object)
- {
- @object = flow.GetValue<GameObject>(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<VariableKind>(kind);
- }
- }
-
- private object Get(Flow flow)
- {
- var name = flow.GetValue<string>(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<GameObject>(@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<VariableKind>(kind);
- }
-
- if (specifyFallback && !variables.IsDefined(name))
- {
- return flow.GetValue(fallback);
- }
-
- return variables.Get(name);
- }
- }
- }
|