Skip to content

Commit 4fac723

Browse files
committed
Ensure spawn count is reset on NetworkManager shutdown
1 parent 233cf70 commit 4fac723

3 files changed

Lines changed: 16 additions & 7 deletions

File tree

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1872,7 +1872,7 @@ private void SpawnInternal(bool destroyWithScene, ulong ownerClientId, bool play
18721872
// The scene object was never automatically spawned when the scene was loaded.
18731873
// Count this object as a dynamically spawned object.
18741874
// TODO-[MTT-15388]: Actually support disabled/not spawned InScenePlaced NetworkObjects
1875-
if (InScenePlaced && m_SpawnCount == 0)
1875+
if (InScenePlaced && !HasBeenSpawned)
18761876
{
18771877
if (NetworkManagerOwner.NetworkConfig.EnableSceneManagement && NetworkManagerOwner.LogLevel <= LogLevel.Developer)
18781878
{
@@ -2124,6 +2124,17 @@ internal void SetupOnSpawn(ulong networkId, bool isPlayerObject, ulong ownerClie
21242124
}
21252125
}
21262126

2127+
/// <summary>
2128+
/// Resets this NetworkObject at the end of a session.
2129+
/// Ensures scene objects are ready to be reused
2130+
/// </summary>
2131+
internal void ResetOnShutdown()
2132+
{
2133+
NetworkLog.InternalAssert(NetworkManager.ShutdownInProgress, "This method should only be called while the NetworkManager is shutting down");
2134+
m_SpawnCount = 0;
2135+
ResetOnDespawn();
2136+
}
2137+
21272138
internal void ResetOnDespawn()
21282139
{
21292140
// Always clear out the observers list when despawned

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,13 +1446,12 @@ internal void DespawnObject(NetworkObject networkObject, bool destroyObject = fa
14461446
internal void ServerResetShutdownStateForSceneObjects()
14471447
{
14481448
var networkObjects = FindObjects.ByType<NetworkObject>(orderByIdentifier: true, includeInactive: true);
1449-
foreach (var sobj in networkObjects)
1449+
foreach (var obj in networkObjects)
14501450
{
1451-
if (!sobj.InScenePlaced)
1451+
if (obj.HasBeenSpawned)
14521452
{
1453-
continue;
1453+
obj.ResetOnShutdown();
14541454
}
1455-
sobj.ResetOnDespawn();
14561455
}
14571456
}
14581457

com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerSynchronizationTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ public IEnumerator NetworkPrefabHandlerSpawnAndSynchronizeTests()
4646
LogAssert.Expect(LogType.Error, new Regex("Failed to spawn NetworkObject!"));
4747
// Authority should receive an error from non-authority and should use the globalObjectIdHash to find the failing object
4848
LogAssert.Expect(LogType.Error, new Regex($@"SenderId:{nonAuthority.LocalClientId}\]\[{Regex.Escape(exceptionObject.name)}"));
49-
// LogAssert.Expect(LogType.Error, new Regex(Regex.Escape(exceptionObject.name)));
50-
// LogAssert.Expect(LogType.Error, "[Netcode] [Received log from client][SenderId:1][ClientSideExceptionPrefab{3}-OnServer{0}][NetworkObjectId:3] [NonAuthorityLocalSpawn][GlobalObjectIdHash:111115] Failed to spawn NetworkObject!");
49+
5150
yield return WaitForConditionOrTimeOut(() => exceptionObject.IsSpawned);
5251
AssertOnTimeout("Failed to spawn object on authority!");
5352

0 commit comments

Comments
 (0)