-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathVariable.cs
More file actions
135 lines (120 loc) · 4.83 KB
/
Copy pathVariable.cs
File metadata and controls
135 lines (120 loc) · 4.83 KB
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
using System;
using System.Reflection;
using UnityEngine;
namespace ActionGraph
{
/// <summary>
/// Can hold a value directly or be bound to a property/field on a MonoBehaviour.
/// </summary>
/// <typeparam name="T">Variable type</typeparam>
public class Variable<T>
{
// -------------------------------------------------------------------------------
[SerializeField] private T mValue;
[SerializeField] private string mBoundMemberName = null;
[SerializeField] private MonoBehaviour mBoundOwner = null;
[SerializeField] private Type mBoundOwnerType = null;
// -------------------------------------------------------------------------------
public T Value
{
get
{
if (mBoundMemberName != null && mBoundOwner != null)
{
var property = mBoundOwnerType.GetProperty(mBoundMemberName);
if (property != null && property.CanRead)
{
return getValue(property.GetGetMethod().Invoke(mBoundOwner, null));
}
else
{
var field = mBoundOwnerType.GetField(mBoundMemberName);
if (field != null)
{
return getValue(field.GetValue(mBoundOwner));
}
else
{
Debug.LogError("Failed to retreive either Property or Field for bound Variable with member name: " + mBoundMemberName);
return mValue;
}
}
}
else
{
return mValue;
}
}
set
{
if (mBoundMemberName != null)
{
var property = mBoundOwnerType.GetProperty(mBoundMemberName);
if (property != null && property.CanWrite)
{
property.GetSetMethod().Invoke(mBoundOwner, new object[] { value });
}
else
{
var field = mBoundOwnerType.GetField(mBoundMemberName);
if (field != null)
{
field.SetValue(mBoundOwner, value);
}
else
{
Debug.LogError("Failed to retreive either Property or Field for bound Variable with member name: " + mBoundMemberName);
}
}
}
else
{
mValue = value;
}
}
}
// -------------------------------------------------------------------------------
public void Bind(MemberInfo member, MonoBehaviour owner)
{
if (member is FieldInfo || member is PropertyInfo)
{
mBoundOwner = owner;
mBoundMemberName = member.Name;
mBoundOwnerType = owner.GetType();
}
}
// -------------------------------------------------------------------------------
public void Unbind()
{
mBoundOwner = null;
mBoundMemberName = null;
mBoundOwnerType = null;
}
// -------------------------------------------------------------------------------
public override string ToString()
{
if (mValue != null)
{
var valueAsUnityObject = (mValue as UnityEngine.Object);
return (valueAsUnityObject != null) ? valueAsUnityObject.name : mValue.ToString();
}
else if (mBoundMemberName != null)
{
return mBoundOwner.name + "." + mBoundMemberName;
}
return "NULL";
}
// -------------------------------------------------------------------------------
private T getValue(object value)
{
// Are we bound to a MonoBehaviour but actually want to return the GameObject it belongs to?
if (typeof(T) == typeof(GameObject) && typeof(MonoBehaviour).IsAssignableFrom(value.GetType()))
{
return (T)((value as MonoBehaviour).gameObject as object);
}
// Otherwise just return the input value directly
return (T)value;
}
// -------------------------------------------------------------------------------
}
}