From c0d9087daec647c20f8abe4c8fdcdceadd8f2d64 Mon Sep 17 00:00:00 2001 From: Jeffrey Rainy Date: Tue, 2 May 2023 11:27:00 -0400 Subject: [PATCH] fix: fixing an exception and error logging when two different objects are shown and hidden on the same frame [MTT-6303] (#2535) * fix: fixing an exception and error logging when two different objects are shown and hidden on the same frame (#2524) * changelog entry --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 + .../Runtime/Spawning/NetworkSpawnManager.cs | 5 +++- .../Tests/Runtime/NetworkShowHideTests.cs | 30 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index ecfcaaec67..7caca1f82d 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -17,6 +17,7 @@ Additional documentation and release notes are available at [Multiplayer Documen - Fixed issue where a client could throw an exception if abruptly disconnected from a network session with one or more spawned `NetworkObject`(s). (#2510) - Fixed issue where invalid endpoint addresses were not being detected and returning false from NGO UnityTransport. (#2496) - Fixed some errors that could occur if a connection is lost and the loss is detected when attempting to write to the socket. (#2495) +- Fixed an exception and error logging when two different objects are shown and hidden on the same frame (#2524) ## Changed diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 40303ae503..0cb3c9db9a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -67,7 +67,10 @@ internal bool RemoveObjectFromShowingTo(NetworkObject networkObject, ulong clien ret = true; } - networkObject.Observers.Remove(clientId); + if (ret) + { + networkObject.Observers.Remove(clientId); + } return ret; } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs index 4f239cdd94..a68a0412dd 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs @@ -286,6 +286,36 @@ public IEnumerator NetworkShowHideTest() } } + [UnityTest] + public IEnumerator ConcurrentShowAndHideOnDifferentObjects() + { + m_ClientId0 = m_ClientNetworkManagers[0].LocalClientId; + ShowHideObject.ClientTargetedNetworkObjects.Clear(); + ShowHideObject.ClientIdToTarget = m_ClientId0; + + + // create 3 objects + var spawnedObject1 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager); + var spawnedObject2 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager); + var spawnedObject3 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager); + m_NetSpawnedObject1 = spawnedObject1.GetComponent(); + m_NetSpawnedObject2 = spawnedObject2.GetComponent(); + m_NetSpawnedObject3 = spawnedObject3.GetComponent(); + + // get the NetworkObject on a client instance + yield return WaitForConditionOrTimeOut(RefreshNetworkObjects); + AssertOnTimeout($"Could not refresh all NetworkObjects!"); + + m_NetSpawnedObject1.NetworkHide(m_ClientId0); + + yield return WaitForTicks(m_ServerNetworkManager, 5); + + m_NetSpawnedObject1.NetworkShow(m_ClientId0); + m_NetSpawnedObject2.NetworkHide(m_ClientId0); + + yield return WaitForTicks(m_ServerNetworkManager, 5); + } + [UnityTest] public IEnumerator NetworkShowHideQuickTest() {