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 .