Skip to content

Commit 65e176e

Browse files
authored
fix: Showing the NetworkLists too in the inspector, not just the NetworkVariables (#2364)
fix: Showing the NetworkList too in the inspector, not just the NetworkVariables
1 parent 368a9a2 commit 65e176e

File tree

1 file changed

+69
-17
lines changed

1 file changed

+69
-17
lines changed

com.unity.netcode.gameobjects/Editor/NetworkBehaviourEditor.cs

Lines changed: 69 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)