Skip to content

Commit 1049865

Browse files
authored
fix: Not sending ChangeOwnership messages to clients that have an object hidden (#2251)
* fix: Not sending ChangeOwnership messages to clients that have an object hidden
1 parent adc06f6 commit 1049865

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
2828

2929
### Fixed
3030

31+
- Fixed issue caused when changing ownership of objects hidden to some clients (#2242)
3132
- Fixed issue where an in-scene placed NetworkObject would not invoke NetworkBehaviour.OnNetworkSpawn if the GameObject was disabled when it was despawned. (#2239)
3233
- Fixed issue where clients were not rebuilding the `NetworkConfig` hash value for each unique connection request. (#2226)
3334
- Fixed the issue where player objects were not taking the `DontDestroyWithOwner` property into consideration when a client disconnected. (#2225)

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,14 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId)
278278
NetworkObjectId = networkObject.NetworkObjectId,
279279
OwnerClientId = networkObject.OwnerClientId
280280
};
281-
var size = NetworkManager.SendMessage(ref message, NetworkDelivery.ReliableSequenced, NetworkManager.ConnectedClientsIds);
282281

283282
foreach (var client in NetworkManager.ConnectedClients)
284283
{
285-
NetworkManager.NetworkMetrics.TrackOwnershipChangeSent(client.Key, networkObject, size);
284+
if (networkObject.IsNetworkVisibleTo(client.Value.ClientId))
285+
{
286+
var size = NetworkManager.SendMessage(ref message, NetworkDelivery.ReliableSequenced, client.Value.ClientId);
287+
NetworkManager.NetworkMetrics.TrackOwnershipChangeSent(client.Key, networkObject, size);
288+
}
286289
}
287290
}
288291

com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ public IEnumerator TrackOwnershipChangeSentMetric()
6161
var ownershipChangeSent = metricValues.First();
6262
Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeSent.NetworkId.NetworkId);
6363
Assert.AreEqual(Server.LocalClientId, ownershipChangeSent.Connection.Id);
64+
Assert.AreEqual(0, ownershipChangeSent.BytesCount);
65+
66+
// The first metric is to the server(self), so its size is now correctly reported as 0.
67+
// Let's check the last one instead, to have a valid value
68+
ownershipChangeSent = metricValues.Last();
69+
Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeSent.NetworkId.NetworkId);
70+
Assert.AreEqual(Client.LocalClientId, ownershipChangeSent.Connection.Id);
6471
Assert.AreEqual(FastBufferWriter.GetWriteSize<ChangeOwnershipMessage>() + k_MessageHeaderSize, ownershipChangeSent.BytesCount);
6572
}
6673

com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,5 +306,37 @@ public IEnumerator NetworkHideDespawnTest()
306306

307307
LogAssert.NoUnexpectedReceived();
308308
}
309+
310+
[UnityTest]
311+
public IEnumerator NetworkHideChangeOwnership()
312+
{
313+
ShowHideObject.ClientTargetedNetworkObjects.Clear();
314+
ShowHideObject.ClientIdToTarget = m_ClientNetworkManagers[1].LocalClientId;
315+
ShowHideObject.Silent = true;
316+
317+
var spawnedObject1 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager);
318+
m_NetSpawnedObject1 = spawnedObject1.GetComponent<NetworkObject>();
319+
320+
m_NetSpawnedObject1.GetComponent<ShowHideObject>().MyNetworkVariable.Value++;
321+
// Hide an object to a client
322+
m_NetSpawnedObject1.NetworkHide(m_ClientNetworkManagers[1].LocalClientId);
323+
324+
yield return WaitForConditionOrTimeOut(() => ShowHideObject.ClientTargetedNetworkObjects.Count == 0);
325+
326+
// Change ownership while the object is hidden to some
327+
m_NetSpawnedObject1.ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
328+
329+
// The two-second wait is actually needed as there's a potential warning of unhandled message after 1 second
330+
yield return new WaitForSeconds(1.25f);
331+
332+
LogAssert.NoUnexpectedReceived();
333+
334+
// Show the object again to check nothing unexpected happens
335+
m_NetSpawnedObject1.NetworkShow(m_ClientNetworkManagers[1].LocalClientId);
336+
337+
yield return WaitForConditionOrTimeOut(() => ShowHideObject.ClientTargetedNetworkObjects.Count == 1);
338+
339+
Assert.True(ShowHideObject.ClientTargetedNetworkObjects[0].OwnerClientId == m_ClientNetworkManagers[0].LocalClientId);
340+
}
309341
}
310342
}

0 commit comments

Comments
 (0)