Skip to content

Commit 21a0a1b

Browse files
authored
feat: Better support for container types in NetworkVariable, including delta computation to save bandwidth. (#2813)
1 parent 697b078 commit 21a0a1b

18 files changed

+6246
-709
lines changed

com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs

Lines changed: 133 additions & 20 deletions
Large diffs are not rendered by default.

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -505,12 +505,14 @@ public NetworkObject NetworkObject
505505
{
506506
get
507507
{
508+
if (m_NetworkObject != null)
509+
{
510+
return m_NetworkObject;
511+
}
512+
508513
try
509514
{
510-
if (m_NetworkObject == null)
511-
{
512-
m_NetworkObject = GetComponentInParent<NetworkObject>();
513-
}
515+
m_NetworkObject = GetComponentInParent<NetworkObject>();
514516
}
515517
catch (Exception)
516518
{

com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public void RegisterNamedMessageHandler(string name, HandleNamedMessageDelegate
204204
{
205205
if (m_NetworkManager.LogLevel <= LogLevel.Error)
206206
{
207-
Debug.LogError($"[{nameof(CustomMessagingManager.RegisterNamedMessageHandler)}] Cannot register a named message of type null or empty!");
207+
Debug.LogError($"[{nameof(RegisterNamedMessageHandler)}] Cannot register a named message of type null or empty!");
208208
}
209209
return;
210210
}
@@ -228,7 +228,7 @@ public void UnregisterNamedMessageHandler(string name)
228228
{
229229
if (m_NetworkManager.LogLevel <= LogLevel.Error)
230230
{
231-
Debug.LogError($"[{nameof(CustomMessagingManager.UnregisterNamedMessageHandler)}] Cannot unregister a named message of type null or empty!");
231+
Debug.LogError($"[{nameof(UnregisterNamedMessageHandler)}] Cannot unregister a named message of type null or empty!");
232232
}
233233
return;
234234
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkVariableDeltaMessage.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
3030
throw new OverflowException($"Not enough space in the buffer to write {nameof(NetworkVariableDeltaMessage)}");
3131
}
3232

33+
var obj = NetworkBehaviour.NetworkObject;
34+
var networkManager = obj.NetworkManagerOwner;
35+
3336
BytePacker.WriteValueBitPacked(writer, NetworkObjectId);
3437
BytePacker.WriteValueBitPacked(writer, NetworkBehaviourIndex);
3538

@@ -38,7 +41,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
3841
if (!DeliveryMappedNetworkVariableIndex.Contains(i))
3942
{
4043
// This var does not belong to the currently iterating delivery group.
41-
if (NetworkBehaviour.NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
44+
if (networkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
4245
{
4346
BytePacker.WriteValueBitPacked(writer, (ushort)0);
4447
}
@@ -54,7 +57,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
5457
var networkVariable = NetworkBehaviour.NetworkVariableFields[i];
5558
var shouldWrite = networkVariable.IsDirty() &&
5659
networkVariable.CanClientRead(TargetClientId) &&
57-
(NetworkBehaviour.NetworkManager.IsServer || networkVariable.CanClientWrite(NetworkBehaviour.NetworkManager.LocalClientId));
60+
(networkManager.IsServer || networkVariable.CanClientWrite(networkManager.LocalClientId));
5861

5962
// Prevent the server from writing to the client that owns a given NetworkVariable
6063
// Allowing the write would send an old value to the client and cause jitter
@@ -67,14 +70,14 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
6770
// The object containing the behaviour we're about to process is about to be shown to this client
6871
// As a result, the client will get the fully serialized NetworkVariable and would be confused by
6972
// an extraneous delta
70-
if (NetworkBehaviour.NetworkManager.SpawnManager.ObjectsToShowToClient.ContainsKey(TargetClientId) &&
71-
NetworkBehaviour.NetworkManager.SpawnManager.ObjectsToShowToClient[TargetClientId]
72-
.Contains(NetworkBehaviour.NetworkObject))
73+
if (networkManager.SpawnManager.ObjectsToShowToClient.ContainsKey(TargetClientId) &&
74+
networkManager.SpawnManager.ObjectsToShowToClient[TargetClientId]
75+
.Contains(obj))
7376
{
7477
shouldWrite = false;
7578
}
7679

77-
if (NetworkBehaviour.NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
80+
if (networkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
7881
{
7982
if (!shouldWrite)
8083
{
@@ -88,9 +91,9 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
8891

8992
if (shouldWrite)
9093
{
91-
if (NetworkBehaviour.NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
94+
if (networkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
9295
{
93-
var tempWriter = new FastBufferWriter(NetworkBehaviour.NetworkManager.MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkBehaviour.NetworkManager.MessageManager.FragmentedMessageMaxSize);
96+
var tempWriter = new FastBufferWriter(networkManager.MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, networkManager.MessageManager.FragmentedMessageMaxSize);
9497
NetworkBehaviour.NetworkVariableFields[i].WriteDelta(tempWriter);
9598
BytePacker.WriteValueBitPacked(writer, tempWriter.Length);
9699

@@ -105,9 +108,9 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
105108
{
106109
networkVariable.WriteDelta(writer);
107110
}
108-
NetworkBehaviour.NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(
111+
networkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(
109112
TargetClientId,
110-
NetworkBehaviour.NetworkObject,
113+
obj,
111114
networkVariable.Name,
112115
NetworkBehaviour.__getTypeName(),
113116
writer.Length - startingSize);

0 commit comments

Comments
 (0)