@@ -20,6 +20,7 @@ public class NetworkBehaviourEditor : UnityEditor.Editor
2020 private readonly Dictionary < string , object > m_NetworkVariableObjects = new Dictionary < string , object > ( ) ;
2121
2222 private GUIContent m_NetworkVariableLabelGuiContent ;
23+ private GUIContent m_NetworkListLabelGuiContent ;
2324
2425 private void Init ( MonoScript script )
2526 {
@@ -30,6 +31,7 @@ private void Init(MonoScript script)
3031 m_NetworkVariableObjects . Clear ( ) ;
3132
3233 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." ) ;
3335
3436 var fields = script . GetClass ( ) . GetFields ( BindingFlags . Public | BindingFlags . Instance | BindingFlags . FlattenHierarchy ) ;
3537 for ( int i = 0 ; i < fields . Length ; i ++ )
@@ -39,6 +41,13 @@ private void Init(MonoScript script)
3941 {
4042 m_NetworkVariableNames . Add ( ObjectNames . NicifyVariableName ( fields [ i ] . Name ) ) ;
4143 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 } ") ;
4251 }
4352 }
4453 }
@@ -72,25 +81,48 @@ private void RenderNetworkVariable(int index)
7281 EditorGUILayout . BeginHorizontal ( ) ;
7382 if ( genericType . IsValueType )
7483 {
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 ) ;
7685 var genericMethod = method . MakeGenericMethod ( genericType ) ;
7786 genericMethod . Invoke ( this , new [ ] { ( object ) index } ) ;
7887 }
7988 else
8089 {
8190 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+ }
82116 }
83117
84- GUILayout . Label ( m_NetworkVariableLabelGuiContent , EditorStyles . miniLabel , GUILayout . Width ( EditorStyles . miniLabel . CalcSize ( m_NetworkVariableLabelGuiContent ) . x ) ) ;
85118 EditorGUILayout . EndHorizontal ( ) ;
86119 }
87120
88- private void RenderNetworkVariableValueType < T > ( int index ) where T : unmanaged
121+ private void RenderNetworkVariableValueType < T > ( int index , NetworkVariable < T > networkVariable ) where T : unmanaged
89122 {
90- var networkVariable = ( NetworkVariable < T > ) m_NetworkVariableFields [ m_NetworkVariableNames [ index ] ] . GetValue ( target ) ;
91123 var type = typeof ( T ) ;
92124 object val = networkVariable . Value ;
93- string name = m_NetworkVariableNames [ index ] ;
125+ string variableName = m_NetworkVariableNames [ index ] ;
94126
95127 var behaviour = ( NetworkBehaviour ) target ;
96128
@@ -99,47 +131,47 @@ private void RenderNetworkVariableValueType<T>(int index) where T : unmanaged
99131 {
100132 if ( type == typeof ( int ) )
101133 {
102- val = EditorGUILayout . IntField ( name , ( int ) val ) ;
134+ val = EditorGUILayout . IntField ( variableName , ( int ) val ) ;
103135 }
104136 else if ( type == typeof ( uint ) )
105137 {
106- val = ( uint ) EditorGUILayout . LongField ( name , ( long ) ( ( uint ) val ) ) ;
138+ val = ( uint ) EditorGUILayout . LongField ( variableName , ( long ) ( ( uint ) val ) ) ;
107139 }
108140 else if ( type == typeof ( short ) )
109141 {
110- val = ( short ) EditorGUILayout . IntField ( name , ( int ) ( ( short ) val ) ) ;
142+ val = ( short ) EditorGUILayout . IntField ( variableName , ( int ) ( ( short ) val ) ) ;
111143 }
112144 else if ( type == typeof ( ushort ) )
113145 {
114- val = ( ushort ) EditorGUILayout . IntField ( name , ( int ) ( ( ushort ) val ) ) ;
146+ val = ( ushort ) EditorGUILayout . IntField ( variableName , ( int ) ( ( ushort ) val ) ) ;
115147 }
116148 else if ( type == typeof ( sbyte ) )
117149 {
118- val = ( sbyte ) EditorGUILayout . IntField ( name , ( int ) ( ( sbyte ) val ) ) ;
150+ val = ( sbyte ) EditorGUILayout . IntField ( variableName , ( int ) ( ( sbyte ) val ) ) ;
119151 }
120152 else if ( type == typeof ( byte ) )
121153 {
122- val = ( byte ) EditorGUILayout . IntField ( name , ( int ) ( ( byte ) val ) ) ;
154+ val = ( byte ) EditorGUILayout . IntField ( variableName , ( int ) ( ( byte ) val ) ) ;
123155 }
124156 else if ( type == typeof ( long ) )
125157 {
126- val = EditorGUILayout . LongField ( name , ( long ) val ) ;
158+ val = EditorGUILayout . LongField ( variableName , ( long ) val ) ;
127159 }
128160 else if ( type == typeof ( ulong ) )
129161 {
130- val = ( ulong ) EditorGUILayout . LongField ( name , ( long ) ( ( ulong ) val ) ) ;
162+ val = ( ulong ) EditorGUILayout . LongField ( variableName , ( long ) ( ( ulong ) val ) ) ;
131163 }
132164 else if ( type == typeof ( bool ) )
133165 {
134- val = EditorGUILayout . Toggle ( name , ( bool ) val ) ;
166+ val = EditorGUILayout . Toggle ( variableName , ( bool ) val ) ;
135167 }
136168 else if ( type == typeof ( string ) )
137169 {
138- val = EditorGUILayout . TextField ( name , ( string ) val ) ;
170+ val = EditorGUILayout . TextField ( variableName , ( string ) val ) ;
139171 }
140172 else if ( type . IsEnum )
141173 {
142- val = EditorGUILayout . EnumPopup ( name , ( Enum ) val ) ;
174+ val = EditorGUILayout . EnumPopup ( variableName , ( Enum ) val ) ;
143175 }
144176 else
145177 {
@@ -150,11 +182,31 @@ private void RenderNetworkVariableValueType<T>(int index) where T : unmanaged
150182 }
151183 else
152184 {
153- EditorGUILayout . LabelField ( name , EditorStyles . wordWrappedLabel ) ;
185+ EditorGUILayout . LabelField ( variableName , EditorStyles . wordWrappedLabel ) ;
154186 EditorGUILayout . SelectableLabel ( val . ToString ( ) , EditorStyles . wordWrappedLabel ) ;
155187 }
188+ GUILayout . Label ( m_NetworkVariableLabelGuiContent , EditorStyles . miniLabel , GUILayout . Width ( EditorStyles . miniLabel . CalcSize ( m_NetworkVariableLabelGuiContent ) . x ) ) ;
156189 }
157190
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+ }
158210
159211 /// <inheritdoc/>
160212 public override void OnInspectorGUI ( )
0 commit comments