@@ -20,6 +20,7 @@ public class NetworkBehaviourEditor : UnityEditor.Editor
20
20
private readonly Dictionary < string , object > m_NetworkVariableObjects = new Dictionary < string , object > ( ) ;
21
21
22
22
private GUIContent m_NetworkVariableLabelGuiContent ;
23
+ private GUIContent m_NetworkListLabelGuiContent ;
23
24
24
25
private void Init ( MonoScript script )
25
26
{
@@ -30,6 +31,7 @@ private void Init(MonoScript script)
30
31
m_NetworkVariableObjects . Clear ( ) ;
31
32
32
33
m_NetworkVariableLabelGuiContent = new GUIContent ( "NetworkVariable" , "This variable is a NetworkVariable. It can not be serialized and can only be changed during runtime." ) ;
34
+ m_NetworkListLabelGuiContent = new GUIContent ( "NetworkList" , "This variable is a NetworkList. It is rendered, but you can't serialize or change it." ) ;
33
35
34
36
var fields = script . GetClass ( ) . GetFields ( BindingFlags . Public | BindingFlags . Instance | BindingFlags . FlattenHierarchy ) ;
35
37
for ( int i = 0 ; i < fields . Length ; i ++ )
@@ -39,6 +41,13 @@ private void Init(MonoScript script)
39
41
{
40
42
m_NetworkVariableNames . Add ( ObjectNames . NicifyVariableName ( fields [ i ] . Name ) ) ;
41
43
m_NetworkVariableFields . Add ( ObjectNames . NicifyVariableName ( fields [ i ] . Name ) , fields [ i ] ) ;
44
+ Debug . Log ( $ "Adding NetworkVariable { fields [ i ] . Name } ") ;
45
+ }
46
+ if ( ft . IsGenericType && ft . GetGenericTypeDefinition ( ) == typeof ( NetworkList < > ) && ! fields [ i ] . IsDefined ( typeof ( HideInInspector ) , true ) )
47
+ {
48
+ m_NetworkVariableNames . Add ( ObjectNames . NicifyVariableName ( fields [ i ] . Name ) ) ;
49
+ m_NetworkVariableFields . Add ( ObjectNames . NicifyVariableName ( fields [ i ] . Name ) , fields [ i ] ) ;
50
+ Debug . Log ( $ "Adding NetworkList { fields [ i ] . Name } ") ;
42
51
}
43
52
}
44
53
}
@@ -72,25 +81,48 @@ private void RenderNetworkVariable(int index)
72
81
EditorGUILayout . BeginHorizontal ( ) ;
73
82
if ( genericType . IsValueType )
74
83
{
75
- var method = typeof ( NetworkBehaviourEditor ) . GetMethod ( "RenderNetworkVariableValueType " , BindingFlags . Public | BindingFlags . Instance | BindingFlags . FlattenHierarchy | BindingFlags . NonPublic ) ;
84
+ var method = typeof ( NetworkBehaviourEditor ) . GetMethod ( "RenderNetworkContainerValueType " , BindingFlags . Public | BindingFlags . Instance | BindingFlags . FlattenHierarchy | BindingFlags . NonPublic ) ;
76
85
var genericMethod = method . MakeGenericMethod ( genericType ) ;
77
86
genericMethod . Invoke ( this , new [ ] { ( object ) index } ) ;
78
87
}
79
88
else
80
89
{
81
90
EditorGUILayout . LabelField ( "Type not renderable" ) ;
91
+
92
+ GUILayout . Label ( m_NetworkVariableLabelGuiContent , EditorStyles . miniLabel , GUILayout . Width ( EditorStyles . miniLabel . CalcSize ( m_NetworkVariableLabelGuiContent ) . x ) ) ;
93
+ EditorGUILayout . EndHorizontal ( ) ;
94
+ }
95
+ }
96
+
97
+ private void RenderNetworkContainerValueType < T > ( int index ) where T : unmanaged, IEquatable < T >
98
+ {
99
+ try
100
+ {
101
+ var networkVariable = ( NetworkVariable < T > ) m_NetworkVariableFields [ m_NetworkVariableNames [ index ] ] . GetValue ( target ) ;
102
+ RenderNetworkVariableValueType ( index , networkVariable ) ;
103
+ }
104
+ catch ( Exception )
105
+ {
106
+ try
107
+ {
108
+ var networkList = ( NetworkList < T > ) m_NetworkVariableFields [ m_NetworkVariableNames [ index ] ] . GetValue ( target ) ;
109
+ RenderNetworkListValueType ( index , networkList ) ;
110
+ }
111
+ catch ( Exception e )
112
+ {
113
+ Debug . Log ( e ) ;
114
+ throw ;
115
+ }
82
116
}
83
117
84
- GUILayout . Label ( m_NetworkVariableLabelGuiContent , EditorStyles . miniLabel , GUILayout . Width ( EditorStyles . miniLabel . CalcSize ( m_NetworkVariableLabelGuiContent ) . x ) ) ;
85
118
EditorGUILayout . EndHorizontal ( ) ;
86
119
}
87
120
88
- private void RenderNetworkVariableValueType < T > ( int index ) where T : unmanaged
121
+ private void RenderNetworkVariableValueType < T > ( int index , NetworkVariable < T > networkVariable ) where T : unmanaged
89
122
{
90
- var networkVariable = ( NetworkVariable < T > ) m_NetworkVariableFields [ m_NetworkVariableNames [ index ] ] . GetValue ( target ) ;
91
123
var type = typeof ( T ) ;
92
124
object val = networkVariable . Value ;
93
- string name = m_NetworkVariableNames [ index ] ;
125
+ string variableName = m_NetworkVariableNames [ index ] ;
94
126
95
127
var behaviour = ( NetworkBehaviour ) target ;
96
128
@@ -99,47 +131,47 @@ private void RenderNetworkVariableValueType<T>(int index) where T : unmanaged
99
131
{
100
132
if ( type == typeof ( int ) )
101
133
{
102
- val = EditorGUILayout . IntField ( name , ( int ) val ) ;
134
+ val = EditorGUILayout . IntField ( variableName , ( int ) val ) ;
103
135
}
104
136
else if ( type == typeof ( uint ) )
105
137
{
106
- val = ( uint ) EditorGUILayout . LongField ( name , ( long ) ( ( uint ) val ) ) ;
138
+ val = ( uint ) EditorGUILayout . LongField ( variableName , ( long ) ( ( uint ) val ) ) ;
107
139
}
108
140
else if ( type == typeof ( short ) )
109
141
{
110
- val = ( short ) EditorGUILayout . IntField ( name , ( int ) ( ( short ) val ) ) ;
142
+ val = ( short ) EditorGUILayout . IntField ( variableName , ( int ) ( ( short ) val ) ) ;
111
143
}
112
144
else if ( type == typeof ( ushort ) )
113
145
{
114
- val = ( ushort ) EditorGUILayout . IntField ( name , ( int ) ( ( ushort ) val ) ) ;
146
+ val = ( ushort ) EditorGUILayout . IntField ( variableName , ( int ) ( ( ushort ) val ) ) ;
115
147
}
116
148
else if ( type == typeof ( sbyte ) )
117
149
{
118
- val = ( sbyte ) EditorGUILayout . IntField ( name , ( int ) ( ( sbyte ) val ) ) ;
150
+ val = ( sbyte ) EditorGUILayout . IntField ( variableName , ( int ) ( ( sbyte ) val ) ) ;
119
151
}
120
152
else if ( type == typeof ( byte ) )
121
153
{
122
- val = ( byte ) EditorGUILayout . IntField ( name , ( int ) ( ( byte ) val ) ) ;
154
+ val = ( byte ) EditorGUILayout . IntField ( variableName , ( int ) ( ( byte ) val ) ) ;
123
155
}
124
156
else if ( type == typeof ( long ) )
125
157
{
126
- val = EditorGUILayout . LongField ( name , ( long ) val ) ;
158
+ val = EditorGUILayout . LongField ( variableName , ( long ) val ) ;
127
159
}
128
160
else if ( type == typeof ( ulong ) )
129
161
{
130
- val = ( ulong ) EditorGUILayout . LongField ( name , ( long ) ( ( ulong ) val ) ) ;
162
+ val = ( ulong ) EditorGUILayout . LongField ( variableName , ( long ) ( ( ulong ) val ) ) ;
131
163
}
132
164
else if ( type == typeof ( bool ) )
133
165
{
134
- val = EditorGUILayout . Toggle ( name , ( bool ) val ) ;
166
+ val = EditorGUILayout . Toggle ( variableName , ( bool ) val ) ;
135
167
}
136
168
else if ( type == typeof ( string ) )
137
169
{
138
- val = EditorGUILayout . TextField ( name , ( string ) val ) ;
170
+ val = EditorGUILayout . TextField ( variableName , ( string ) val ) ;
139
171
}
140
172
else if ( type . IsEnum )
141
173
{
142
- val = EditorGUILayout . EnumPopup ( name , ( Enum ) val ) ;
174
+ val = EditorGUILayout . EnumPopup ( variableName , ( Enum ) val ) ;
143
175
}
144
176
else
145
177
{
@@ -150,11 +182,31 @@ private void RenderNetworkVariableValueType<T>(int index) where T : unmanaged
150
182
}
151
183
else
152
184
{
153
- EditorGUILayout . LabelField ( name , EditorStyles . wordWrappedLabel ) ;
185
+ EditorGUILayout . LabelField ( variableName , EditorStyles . wordWrappedLabel ) ;
154
186
EditorGUILayout . SelectableLabel ( val . ToString ( ) , EditorStyles . wordWrappedLabel ) ;
155
187
}
188
+ GUILayout . Label ( m_NetworkVariableLabelGuiContent , EditorStyles . miniLabel , GUILayout . Width ( EditorStyles . miniLabel . CalcSize ( m_NetworkVariableLabelGuiContent ) . x ) ) ;
156
189
}
157
190
191
+ private void RenderNetworkListValueType < T > ( int index , NetworkList < T > networkList )
192
+ where T : unmanaged, IEquatable < T >
193
+ {
194
+ string variableName = m_NetworkVariableNames [ index ] ;
195
+
196
+ string value = "" ;
197
+ bool addComma = false ;
198
+ foreach ( var v in networkList )
199
+ {
200
+ if ( addComma )
201
+ {
202
+ value += ", " ;
203
+ }
204
+ value += v . ToString ( ) ;
205
+ addComma = true ;
206
+ }
207
+ EditorGUILayout . LabelField ( variableName , value ) ;
208
+ GUILayout . Label ( m_NetworkListLabelGuiContent , EditorStyles . miniLabel , GUILayout . Width ( EditorStyles . miniLabel . CalcSize ( m_NetworkListLabelGuiContent ) . x ) ) ;
209
+ }
158
210
159
211
/// <inheritdoc/>
160
212
public override void OnInspectorGUI ( )
0 commit comments