Skip to content

Commit c0dcef7

Browse files
committed
Update object destroying on resynchronize
1 parent 90f0077 commit c0dcef7

2 files changed

Lines changed: 17 additions & 30 deletions

File tree

com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,7 @@ internal void ReadClientReSynchronizationData(FastBufferReader reader)
919919
var networkObjectIdToNetworkObject = new Dictionary<ulong, NetworkObject>();
920920
foreach (var networkObject in networkObjects)
921921
{
922+
// If the NetworkObject isn't spawned then we don't need to destroy it
922923
if (networkObject.IsSpawned)
923924
{
924925
networkObjectIdToNetworkObject.TryAdd(networkObject.NetworkObjectId, networkObject);
@@ -927,28 +928,13 @@ internal void ReadClientReSynchronizationData(FastBufferReader reader)
927928

928929
foreach (var networkObjectId in networkObjectsToRemove)
929930
{
930-
if (networkObjectIdToNetworkObject.ContainsKey(networkObjectId))
931+
if (networkObjectIdToNetworkObject.TryGetValue(networkObjectId, out var networkObject))
931932
{
932-
var networkObject = networkObjectIdToNetworkObject[networkObjectId];
933-
networkObjectIdToNetworkObject.Remove(networkObjectId);
934-
935-
networkObject.IsSpawned = false;
936-
if (m_NetworkManager.PrefabHandler.ContainsHandler(networkObject))
937-
{
938-
if (m_NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId))
939-
{
940-
m_NetworkManager.SpawnManager.SpawnedObjects.Remove(networkObjectId);
941-
}
942-
if (m_NetworkManager.SpawnManager.SpawnedObjectsList.Contains(networkObject))
943-
{
944-
m_NetworkManager.SpawnManager.SpawnedObjectsList.Remove(networkObject);
945-
}
946-
m_NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(networkObject);
947-
}
948-
else
933+
if (m_NetworkManager.LogLevel <= LogLevel.Developer)
949934
{
950-
UnityEngine.Object.DestroyImmediate(networkObject.gameObject);
935+
NetworkLog.LogWarning($"[ReadClientReSynchronizationData][{networkObject.name}] Despawning and destroying {nameof(NetworkObject)}.");
951936
}
937+
m_NetworkManager.SpawnManager.OnDespawnObject(networkObject, true, true);
952938
}
953939
}
954940
}

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,8 @@ internal bool NonAuthorityLocalSpawn(in NetworkObject.SerializedObject serialize
12871287
/// <returns>boolean indicating whether the spawn succeeded. Internal dev note: THIS IS A CATCH FOR OURSELVES. DON'T PULL OUT</returns>
12881288
internal bool SpawnNetworkObjectLocallyCommon(NetworkObject networkObject, ulong networkId, bool sceneObject, bool playerObject, ulong ownerClientId, bool destroyWithScene)
12891289
{
1290+
// TODO: Replace the following checks with internal Netcode asserts
1291+
// We want our tests to double check this without impacting users.
12901292
if (networkObject.NetworkManagerOwner == null)
12911293
{
12921294
if (NetworkManager.LogLevel <= LogLevel.Error)
@@ -1296,6 +1298,15 @@ internal bool SpawnNetworkObjectLocallyCommon(NetworkObject networkObject, ulong
12961298
return false;
12971299
}
12981300

1301+
if (networkObject.NetworkObjectId == default)
1302+
{
1303+
if (NetworkManager.LogLevel <= LogLevel.Error)
1304+
{
1305+
NetworkLog.LogError($"[{networkObject.name}] Trying to spawn {nameof(NetworkObject)} with invalid {nameof(NetworkObject.NetworkObjectId)} {networkObject.NetworkObjectId}. This should not happen!");
1306+
}
1307+
return false;
1308+
}
1309+
12991310
networkObject.IsSceneObject = sceneObject;
13001311

13011312
// Always check to make sure our scene of origin is properly set for in-scene placed NetworkObjects
@@ -1725,23 +1736,13 @@ internal void OnDespawnNonAuthorityObject([NotNull] NetworkObject networkObject,
17251736
/// <param name="networkObject">The <see cref="NetworkObject"/> to despawn.</param>
17261737
/// <param name="destroyGameObject">Whether to destroy the underlying game object, or to simply despawn the object.</param>
17271738
/// <param name="authorityOverride">Gives the DAHost server permissions. Otherwise, DAHost only has authority on objects it owns.</param>
1728-
internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObject, bool authorityOverride = false)
1739+
internal void OnDespawnObject([NotNull] NetworkObject networkObject, bool destroyGameObject, bool authorityOverride = false)
17291740
{
17301741
if (!NetworkManager)
17311742
{
17321743
return;
17331744
}
17341745

1735-
// We have to do this check first as subsequent checks assume we can access NetworkObjectId.
1736-
if (!networkObject)
1737-
{
1738-
if (NetworkManager.LogLevel <= LogLevel.Normal)
1739-
{
1740-
NetworkLog.LogWarning("Trying to destroy network object but it is null");
1741-
}
1742-
return;
1743-
}
1744-
17451746
// Removal of spawned object
17461747
if (!SpawnedObjects.ContainsKey(networkObject.NetworkObjectId))
17471748
{

0 commit comments

Comments
 (0)