Skip to content

Commit ad42901

Browse files
fix
Adding the back to back network show and change ownership message fix. Adding the client synchronization network show fix.
1 parent 7ed7a52 commit ad42901

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ public void Handle(ref NetworkContext context)
3535
{
3636
var networkManager = (NetworkManager)context.SystemOwner;
3737
var networkObject = networkManager.SpawnManager.SpawnedObjects[NetworkObjectId];
38+
39+
// Sanity check that we are not sending duplicated or unnecessary change ownership messages
40+
if (networkObject.OwnerClientId == OwnerClientId)
41+
{
42+
// Log error and then ignore the message
43+
NetworkLog.LogError($"[Receiver: Client-{networkManager.LocalClientId}][Sender: Client-{context.SenderId}] Detected unnecessary ownership changed message for {networkObject.name} (NID:{NetworkObjectId}).");
44+
return;
45+
}
46+
3847
var originalOwner = networkObject.OwnerClientId;
3948

4049
networkObject.OwnerClientId = OwnerClientId;

com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,12 @@ internal void AddSpawnedNetworkObjects()
317317
m_NetworkObjectsSync.Clear();
318318
foreach (var sobj in m_NetworkManager.SpawnManager.SpawnedObjectsList)
319319
{
320+
var spawnedObject = sobj;
321+
// Don't synchronize objects that have pending visibility as that will be sent as a CreateObjectMessage towards the end of the current frame
322+
if (TargetClientId != NetworkManager.ServerClientId && m_NetworkManager.SpawnManager.IsObjectVisibilityPending(TargetClientId, ref spawnedObject))
323+
{
324+
continue;
325+
}
320326
if (sobj.Observers.Contains(TargetClientId))
321327
{
322328
m_NetworkObjectsSync.Add(sobj);

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,10 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId)
321321

322322
foreach (var client in NetworkManager.ConnectedClients)
323323
{
324+
if (IsObjectVisibilityPending(client.Key, ref networkObject))
325+
{
326+
continue;
327+
}
324328
if (networkObject.IsNetworkVisibleTo(client.Value.ClientId))
325329
{
326330
var size = NetworkManager.ConnectionManager.SendMessage(ref message, NetworkDelivery.ReliableSequenced, client.Value.ClientId);
@@ -343,6 +347,23 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId)
343347
m_LastChangeInOwnership[networkObject.NetworkObjectId] = Time.realtimeSinceStartup + (tickFrequency * k_MaximumTickOwnershipChangeMultiplier);
344348
}
345349

350+
/// <summary>
351+
/// Will determine if a client has been granted visibility for a NetworkObject but
352+
/// the <see cref="CreateObjectMessage"/> has yet to be generated for it. Under this case,
353+
/// the client might not need to be sent a message (i.e. <see cref="ChangeOwnershipMessage")
354+
/// </summary>
355+
/// <param name="clientId">the client to check</param>
356+
/// <param name="networkObject">the <see cref="NetworkObject"/> to check if it is pending show</param>
357+
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
358+
internal bool IsObjectVisibilityPending(ulong clientId, ref NetworkObject networkObject)
359+
{
360+
if (ObjectsToShowToClient.ContainsKey(clientId))
361+
{
362+
return ObjectsToShowToClient[clientId].Contains(networkObject);
363+
}
364+
return false;
365+
}
366+
346367
internal bool HasPrefab(NetworkObject.SceneObject sceneObject)
347368
{
348369
if (!NetworkManager.NetworkConfig.EnableSceneManagement || !sceneObject.IsSceneObject)

0 commit comments

Comments
 (0)