From f890d7e194b573ddb4cd3ac730e58c41b49b4af3 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 30 Aug 2023 12:46:08 -0500 Subject: [PATCH] fix: SpawnWithObservers not honored when EnableSceneManagement is disabled [MTT-7237] (#2682) * fix MTT-7237 Include the SpawnWithObservers check when scene management is disabled. * test Extending the ObserverSpawnTests to run a pass with scene management disabled. * update Adding change log entry. --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 + .../Messages/ConnectionApprovedMessage.cs | 5 ++- .../NetworkObjectOnSpawnTests.cs | 42 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 049891c6b0..a6c19709f3 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -11,6 +11,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Fixed +- Fixed issue where `SpawnWithObservers` was not being honored when `NetworkConfig.EnableSceneManagement` was disabled. (#2682) - Fixed issue where `NetworkAnimator` was not internally tracking changes to layer weights which prevented proper layer weight synchronization back to the original layer weight value. (#2674) - Fixed "writing past the end of the buffer" error when calling ResetDirty() on managed network variables that are larger than 256 bytes when serialized. (#2670) - Fixed issue where generation of the `DefaultNetworkPrefabs` asset was not enabled by default. (#2662) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs index 648573ed3a..0a0b398c53 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs @@ -37,6 +37,9 @@ public void Serialize(FastBufferWriter writer, int targetVersion) BytePacker.WriteValueBitPacked(writer, NetworkTick); uint sceneObjectCount = 0; + + // When SpawnedObjectsList is not null then scene management is disabled. Provide a list of + // all observed and spawned NetworkObjects that the approved client needs to synchronize. if (SpawnedObjectsList != null) { var pos = writer.Position; @@ -45,7 +48,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion) // Serialize NetworkVariable data foreach (var sobj in SpawnedObjectsList) { - if (sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(OwnerClientId)) + if (sobj.SpawnWithObservers && (sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(OwnerClientId))) { sobj.Observers.Add(OwnerClientId); var sceneObject = sobj.GetMessageSceneObject(OwnerClientId); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs index ee01794d98..17b618a0a1 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs @@ -74,6 +74,7 @@ protected override void OnNewClientCreated(NetworkManager networkManager) networkManager.NetworkConfig.Prefabs.Add(networkPrefab); } } + networkManager.NetworkConfig.EnableSceneManagement = m_ServerNetworkManager.NetworkConfig.EnableSceneManagement; base.OnNewClientCreated(networkManager); } @@ -82,8 +83,46 @@ protected override void OnNewClientCreated(NetworkManager networkManager) /// /// whether to spawn with or without observers [UnityTest] - public IEnumerator ObserverSpawnTests([Values] ObserverTestTypes observerTestTypes) + public IEnumerator ObserverSpawnTests([Values] ObserverTestTypes observerTestTypes, [Values] bool sceneManagement) { + if (!sceneManagement) + { + // Disable prefabs to prevent them from being destroyed + foreach (var networkPrefab in m_ServerNetworkManager.NetworkConfig.Prefabs.Prefabs) + { + networkPrefab.Prefab.SetActive(false); + } + + // Shutdown and clean up the current client NetworkManager instances + foreach (var networkManager in m_ClientNetworkManagers) + { + m_PlayerNetworkObjects[networkManager.LocalClientId].Clear(); + m_PlayerNetworkObjects.Remove(networkManager.LocalClientId); + yield return StopOneClient(networkManager, true); + } + + // Shutdown and clean up the server NetworkManager instance + m_PlayerNetworkObjects[m_ServerNetworkManager.LocalClientId].Clear(); + yield return StopOneClient(m_ServerNetworkManager); + + // Set the prefabs to active again + foreach (var networkPrefab in m_ServerNetworkManager.NetworkConfig.Prefabs.Prefabs) + { + networkPrefab.Prefab.SetActive(true); + } + + // Disable scene management and start the host + m_ServerNetworkManager.NetworkConfig.EnableSceneManagement = false; + m_ServerNetworkManager.StartHost(); + yield return s_DefaultWaitForTick; + + // Create 2 new clients and connect them + for (int i = 0; i < NumberOfClients; i++) + { + yield return CreateAndStartNewClient(); + } + } + m_ObserverTestType = observerTestTypes; var prefabNetworkObject = m_ObserverPrefab.GetComponent(); prefabNetworkObject.SpawnWithObservers = observerTestTypes == ObserverTestTypes.WithObservers; @@ -129,6 +168,7 @@ public IEnumerator ObserverSpawnTests([Values] ObserverTestTypes observerTestTyp AssertOnTimeout($"{k_WithObserversError} {k_ObserverTestObjName} object!"); } } + /// /// Tests that instantiating a and destroying without spawning it /// does not run or .