File size: 4,286 Bytes
18a519f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | 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);
}
}
}
|