@@ -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