Singularity/Library/PackageCache/com.unity.visualscripting@1.../Runtime/VisualScripting.Flow/Framework/Variables/GetVariable.cs
2024-05-06 11:45:45 -07:00

141 lines
4.2 KiB
C#

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);
}
}
}