Skip to content

Commit 0a417e1

Browse files
EmandMNoelStephensUnity
authored andcommitted
ensure internal state is completely reset on behaviour despawn
1 parent 4d52d3b commit 0a417e1

File tree

1 file changed

+48
-18
lines changed

1 file changed

+48
-18
lines changed

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

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -496,23 +496,11 @@ public NetworkManager NetworkManager
496496
/// </summary>
497497
public bool HasAuthority { get; internal set; }
498498

499-
internal NetworkClient LocalClient { get; private set; }
500499

501500
/// <summary>
502501
/// Gets whether the client is the distributed authority mode session owner.
503502
/// </summary>
504-
public bool IsSessionOwner
505-
{
506-
get
507-
{
508-
if (LocalClient == null)
509-
{
510-
return false;
511-
}
512-
513-
return LocalClient.IsSessionOwner;
514-
}
515-
}
503+
public bool IsSessionOwner { get; private set; }
516504

517505
/// <summary>
518506
/// Gets whether the server (local or remote) is a host.
@@ -677,12 +665,41 @@ internal void UpdateNetworkProperties()
677665
IsHost = networkManager.IsListening && networkManager.IsHost;
678666
IsClient = networkManager.IsListening && networkManager.IsClient;
679667
IsServer = networkManager.IsListening && networkManager.IsServer;
680-
LocalClient = networkManager.LocalClient;
668+
IsSessionOwner = networkManager.IsListening && networkManager.LocalClient.IsSessionOwner;
681669
HasAuthority = networkObject.HasAuthority;
682670
ServerIsHost = networkManager.IsListening && networkManager.ServerIsHost;
683671
}
684672
}
685673

674+
private void ResetAllFields()
675+
{
676+
m_NetworkObject = null;
677+
m_NetworkManager = null;
678+
RpcTarget = null;
679+
680+
// Set identification related properties
681+
NetworkObjectId = default;
682+
IsLocalPlayer = false;
683+
684+
// This is "OK" because GetNetworkBehaviourOrderIndex uses the order of
685+
// NetworkObject.ChildNetworkBehaviours which is set once when first
686+
// accessed.
687+
NetworkBehaviourId = default;
688+
689+
// Set ownership related properties
690+
IsOwnedByServer = false;
691+
IsOwner = false;
692+
OwnerClientId = default;
693+
694+
// Set NetworkManager dependent properties
695+
IsHost = false;
696+
IsClient = false;
697+
IsServer = false;
698+
IsSessionOwner = false;
699+
HasAuthority = false;
700+
ServerIsHost = false;
701+
}
702+
686703
/// <summary>
687704
/// Only for use in distributed authority mode.
688705
/// Invoked only on the authority instance when a <see cref="NetworkObject"/> is deferring its despawn on non-authoritative instances.
@@ -763,6 +780,9 @@ public virtual void OnNetworkPreDespawn() { }
763780
internal void NetworkPreSpawn(ref NetworkManager networkManager, NetworkObject networkObject)
764781
{
765782
m_NetworkObject = networkObject;
783+
m_NetworkManager = networkManager;
784+
RpcTarget = networkManager.RpcTarget;
785+
766786
UpdateNetworkProperties();
767787

768788
try
@@ -872,6 +892,8 @@ internal void InternalOnNetworkDespawn()
872892
{
873893
NetworkVariableFields[i].Deinitialize();
874894
}
895+
896+
ResetAllFields();
875897
}
876898

877899
/// <summary>
@@ -1553,7 +1575,15 @@ internal virtual void InternalOnDestroy()
15531575
/// </summary>
15541576
public virtual void OnDestroy()
15551577
{
1556-
InternalOnDestroy();
1578+
try
1579+
{
1580+
InternalOnDestroy();
1581+
}
1582+
catch (Exception ex)
1583+
{
1584+
Debug.LogException(ex);
1585+
}
1586+
15571587
if (m_NetworkObject != null && m_NetworkObject.IsSpawned && IsSpawned)
15581588
{
15591589
// If the associated NetworkObject is still spawned then this
@@ -1574,12 +1604,12 @@ public virtual void OnDestroy()
15741604
}
15751605

15761606

1577-
for (int i = 0; i < NetworkVariableFields.Count; i++)
1607+
foreach (var networkVar in NetworkVariableFields)
15781608
{
1579-
NetworkVariableFields[i].Dispose();
1609+
networkVar.Dispose();
15801610
}
15811611

1582-
m_NetworkObject = null;
1612+
ResetAllFields();
15831613
}
15841614
}
15851615
}

0 commit comments

Comments
 (0)