Skip to content

Commit f890d7e

Browse files
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.
1 parent 47f9d65 commit f890d7e

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

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

1212
### Fixed
1313

14+
- Fixed issue where `SpawnWithObservers` was not being honored when `NetworkConfig.EnableSceneManagement` was disabled. (#2682)
1415
- 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)
1516
- 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)
1617
- Fixed issue where generation of the `DefaultNetworkPrefabs` asset was not enabled by default. (#2662)

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
3737
BytePacker.WriteValueBitPacked(writer, NetworkTick);
3838

3939
uint sceneObjectCount = 0;
40+
41+
// When SpawnedObjectsList is not null then scene management is disabled. Provide a list of
42+
// all observed and spawned NetworkObjects that the approved client needs to synchronize.
4043
if (SpawnedObjectsList != null)
4144
{
4245
var pos = writer.Position;
@@ -45,7 +48,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
4548
// Serialize NetworkVariable data
4649
foreach (var sobj in SpawnedObjectsList)
4750
{
48-
if (sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(OwnerClientId))
51+
if (sobj.SpawnWithObservers && (sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(OwnerClientId)))
4952
{
5053
sobj.Observers.Add(OwnerClientId);
5154
var sceneObject = sobj.GetMessageSceneObject(OwnerClientId);

com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectOnSpawnTests.cs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ protected override void OnNewClientCreated(NetworkManager networkManager)
7474
networkManager.NetworkConfig.Prefabs.Add(networkPrefab);
7575
}
7676
}
77+
networkManager.NetworkConfig.EnableSceneManagement = m_ServerNetworkManager.NetworkConfig.EnableSceneManagement;
7778
base.OnNewClientCreated(networkManager);
7879
}
7980

@@ -82,8 +83,46 @@ protected override void OnNewClientCreated(NetworkManager networkManager)
8283
/// </summary>
8384
/// <param name="observerTestTypes">whether to spawn with or without observers</param>
8485
[UnityTest]
85-
public IEnumerator ObserverSpawnTests([Values] ObserverTestTypes observerTestTypes)
86+
public IEnumerator ObserverSpawnTests([Values] ObserverTestTypes observerTestTypes, [Values] bool sceneManagement)
8687
{
88+
if (!sceneManagement)
89+
{
90+
// Disable prefabs to prevent them from being destroyed
91+
foreach (var networkPrefab in m_ServerNetworkManager.NetworkConfig.Prefabs.Prefabs)
92+
{
93+
networkPrefab.Prefab.SetActive(false);
94+
}
95+
96+
// Shutdown and clean up the current client NetworkManager instances
97+
foreach (var networkManager in m_ClientNetworkManagers)
98+
{
99+
m_PlayerNetworkObjects[networkManager.LocalClientId].Clear();
100+
m_PlayerNetworkObjects.Remove(networkManager.LocalClientId);
101+
yield return StopOneClient(networkManager, true);
102+
}
103+
104+
// Shutdown and clean up the server NetworkManager instance
105+
m_PlayerNetworkObjects[m_ServerNetworkManager.LocalClientId].Clear();
106+
yield return StopOneClient(m_ServerNetworkManager);
107+
108+
// Set the prefabs to active again
109+
foreach (var networkPrefab in m_ServerNetworkManager.NetworkConfig.Prefabs.Prefabs)
110+
{
111+
networkPrefab.Prefab.SetActive(true);
112+
}
113+
114+
// Disable scene management and start the host
115+
m_ServerNetworkManager.NetworkConfig.EnableSceneManagement = false;
116+
m_ServerNetworkManager.StartHost();
117+
yield return s_DefaultWaitForTick;
118+
119+
// Create 2 new clients and connect them
120+
for (int i = 0; i < NumberOfClients; i++)
121+
{
122+
yield return CreateAndStartNewClient();
123+
}
124+
}
125+
87126
m_ObserverTestType = observerTestTypes;
88127
var prefabNetworkObject = m_ObserverPrefab.GetComponent<NetworkObject>();
89128
prefabNetworkObject.SpawnWithObservers = observerTestTypes == ObserverTestTypes.WithObservers;
@@ -129,6 +168,7 @@ public IEnumerator ObserverSpawnTests([Values] ObserverTestTypes observerTestTyp
129168
AssertOnTimeout($"{k_WithObserversError} {k_ObserverTestObjName} object!");
130169
}
131170
}
171+
132172
/// <summary>
133173
/// Tests that instantiating a <see cref="NetworkObject"/> and destroying without spawning it
134174
/// does not run <see cref="NetworkBehaviour.OnNetworkSpawn"/> or <see cref="NetworkBehaviour.OnNetworkSpawn"/>.

0 commit comments

Comments
 (0)