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