mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
fix: #3785 NetworkIdentity.OnDestroy verifies spawned[netId] before removing
This commit is contained in:
parent
c4f803fcf6
commit
a9d280cd4b
@ -671,8 +671,25 @@ void OnDestroy()
|
|||||||
|
|
||||||
// if an identity is still in .spawned, remove it too.
|
// if an identity is still in .spawned, remove it too.
|
||||||
// fixes: https://github.com/MirrorNetworking/Mirror/issues/3324
|
// fixes: https://github.com/MirrorNetworking/Mirror/issues/3324
|
||||||
|
//
|
||||||
|
// however, verify that spawned[netId] is this NetworkIdentity
|
||||||
|
// fixes: https://github.com/MirrorNetworking/Mirror/issues/3785
|
||||||
|
// - server: netId=42 walks out of and back into AOI range in same frame
|
||||||
|
// - client frame 1:
|
||||||
|
// on_destroymsg(42) -> NetworkClient.DestroyObject -> GameObject.Destroy(42) // next frame
|
||||||
|
// on_spawnmsg(42) -> NetworkClient.SpawnPrefab -> Instantiate(42) -> spawned[42]=new_identity
|
||||||
|
// - client frame 2:
|
||||||
|
// Unity destroys the old 42
|
||||||
|
// NetworkIdentity.OnDestroy removes .spawned[42] which is new_identity not old_identity
|
||||||
|
// new_identity becomes orphaned
|
||||||
|
//
|
||||||
|
// solution: only remove if spawned[netId] is this NetworkIdentity or null
|
||||||
|
if (NetworkClient.spawned.TryGetValue(netId, out NetworkIdentity entry))
|
||||||
|
{
|
||||||
|
if (entry == this || entry == null)
|
||||||
NetworkClient.spawned.Remove(netId);
|
NetworkClient.spawned.Remove(netId);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// workaround for cyclid NI<->NB reference causing memory leaks
|
// workaround for cyclid NI<->NB reference causing memory leaks
|
||||||
// after Destroy. [Credits: BigBoxVR/R.S.]
|
// after Destroy. [Credits: BigBoxVR/R.S.]
|
||||||
|
Loading…
Reference in New Issue
Block a user