11using System ;
2+ using System . Runtime . CompilerServices ;
23using UnityEngine ;
34
45namespace Unity . Netcode
@@ -42,7 +43,11 @@ public abstract class NetworkVariableBase : IDisposable
4243 /// </summary>
4344 private protected NetworkBehaviour m_NetworkBehaviour ;
4445
45- private NetworkManager m_InternalNetworkManager ;
46+ private protected NetworkManager m_NetworkManager ;
47+
48+ private protected NetworkObject m_NetworkObject ;
49+
50+ private bool m_UseServerTime ;
4651
4752 // Determines if this NetworkVariable has been "initialized" to prevent initializing more than once which can happen when first
4853 // instantiated and spawned. If this NetworkVariable instance is on an in-scene placed NetworkObject =or= a pooled NetworkObject
@@ -60,8 +65,6 @@ internal void LogWritePermissionError()
6065 Debug . LogError ( GetWritePermissionError ( ) ) ;
6166 }
6267
63- private protected NetworkManager m_NetworkManager => m_InternalNetworkManager ;
64-
6568 /// <summary>
6669 /// Gets the NetworkBehaviour instance associated with this network variable
6770 /// </summary>
@@ -108,31 +111,35 @@ public void Initialize(NetworkBehaviour networkBehaviour)
108111 return ;
109112 }
110113
111- if ( ! m_NetworkBehaviour . NetworkObject . NetworkManagerOwner )
114+ m_NetworkObject = m_NetworkBehaviour . NetworkObject ;
115+
116+ if ( ! m_NetworkObject . NetworkManagerOwner )
112117 {
113118 // Exit early if there has yet to be a NetworkManagerOwner assigned
114119 // to the NetworkObject. This is ok because Initialize is invoked
115120 // multiple times until it is considered "initialized".
116121 return ;
117122 }
118- m_InternalNetworkManager = m_NetworkBehaviour . NetworkObject . NetworkManagerOwner ;
123+ m_NetworkManager = m_NetworkObject . NetworkManagerOwner ;
124+
125+ m_UseServerTime = m_NetworkManager . CMBServiceConnection || ! m_NetworkManager . IsServer ;
119126
120127 // When in distributed authority mode, there is no such thing as server write permissions
121- InternalWritePerm = m_InternalNetworkManager . DistributedAuthorityMode ? NetworkVariableWritePermission . Owner : InternalWritePerm ;
128+ InternalWritePerm = m_NetworkManager . DistributedAuthorityMode ? NetworkVariableWritePermission . Owner : InternalWritePerm ;
122129
123130 OnInitialize ( ) ;
124131
125132 // Some unit tests don't operate with a running NetworkManager.
126133 // Only update the last time if there is a NetworkTimeSystem.
127- if ( m_InternalNetworkManager . NetworkTimeSystem != null )
134+ if ( m_NetworkManager . NetworkTimeSystem != null )
128135 {
129136 // Update our last sent time relative to when this was initialized
130137 UpdateLastSentTime ( ) ;
131138
132139 // At this point, this instance is considered initialized
133140 HasBeenInitialized = true ;
134141 }
135- else if ( m_InternalNetworkManager . LogLevel == LogLevel . Developer )
142+ else if ( m_NetworkManager . LogLevel == LogLevel . Developer )
136143 {
137144 Debug . LogWarning ( $ "[{ m_NetworkBehaviour . name } ][{ m_NetworkBehaviour . GetType ( ) . Name } ][{ GetType ( ) . Name } ][Initialize] { nameof ( NetworkManager ) } has no { nameof ( NetworkTimeSystem ) } assigned!") ;
138145 }
@@ -251,7 +258,7 @@ public virtual void SetDirty(bool isDirty)
251258 internal bool CanSend ( )
252259 {
253260 // When connected to a service or not the server, always use the synchronized server time as opposed to the local time
254- var time = m_InternalNetworkManager . CMBServiceConnection || ! m_InternalNetworkManager . IsServer ? m_NetworkBehaviour . NetworkManager . ServerTime . Time : m_NetworkBehaviour . NetworkManager . NetworkTimeSystem . LocalTime ;
261+ var time = m_UseServerTime ? m_NetworkManager . ServerTime . Time : m_NetworkManager . NetworkTimeSystem . LocalTime ;
255262 var timeSinceLastUpdate = time - LastUpdateSent ;
256263 return
257264 (
@@ -267,7 +274,7 @@ internal bool CanSend()
267274 internal void UpdateLastSentTime ( )
268275 {
269276 // When connected to a service or not the server, always use the synchronized server time as opposed to the local time
270- LastUpdateSent = m_InternalNetworkManager . CMBServiceConnection || ! m_InternalNetworkManager . IsServer ? m_NetworkBehaviour . NetworkManager . ServerTime . Time : m_NetworkBehaviour . NetworkManager . NetworkTimeSystem . LocalTime ;
277+ LastUpdateSent = m_UseServerTime ? m_NetworkManager . ServerTime . Time : m_NetworkManager . NetworkTimeSystem . LocalTime ;
271278 }
272279
273280 internal static bool IgnoreInitializeWarning ;
@@ -286,27 +293,27 @@ protected void MarkNetworkBehaviourDirty()
286293 }
287294 return ;
288295 }
289- if ( m_NetworkBehaviour . NetworkManager . ShutdownInProgress )
296+ if ( m_NetworkManager . ShutdownInProgress )
290297 {
291- if ( m_NetworkBehaviour . NetworkManager . LogLevel <= LogLevel . Developer )
298+ if ( m_NetworkManager . LogLevel <= LogLevel . Developer )
292299 {
293300 Debug . LogWarning ( $ "NetworkVariable is written to during the NetworkManager shutdown! " +
294301 "Are you modifying a NetworkVariable within a NetworkBehaviour.OnDestroy or NetworkBehaviour.OnDespawn method?" ) ;
295302 }
296303 return ;
297304 }
298305
299- if ( ! m_NetworkBehaviour . NetworkManager . IsListening )
306+ if ( ! m_NetworkManager . IsListening )
300307 {
301- if ( m_NetworkBehaviour . NetworkManager . LogLevel <= LogLevel . Developer )
308+ if ( m_NetworkManager . LogLevel <= LogLevel . Developer )
302309 {
303310 Debug . LogWarning ( $ "NetworkVariable is written to after the NetworkManager has already shutdown! " +
304311 "Are you modifying a NetworkVariable within a NetworkBehaviour.OnDestroy or NetworkBehaviour.OnDespawn method?" ) ;
305312 }
306313 return ;
307314 }
308315
309- m_NetworkBehaviour . NetworkManager . BehaviourUpdater ? . AddForUpdate ( m_NetworkBehaviour . NetworkObject ) ;
316+ m_NetworkManager . BehaviourUpdater ? . AddForUpdate ( m_NetworkObject ) ;
310317 }
311318
312319 /// <summary>
@@ -345,7 +352,7 @@ public bool CanClientRead(ulong clientId)
345352 }
346353
347354 // When in distributed authority mode, everyone can read (but only the owner can write)
348- if ( m_NetworkManager != null && m_NetworkManager . DistributedAuthorityMode )
355+ if ( m_NetworkManager . DistributedAuthorityMode )
349356 {
350357 return true ;
351358 }
@@ -355,7 +362,7 @@ public bool CanClientRead(ulong clientId)
355362 case NetworkVariableReadPermission . Everyone :
356363 return true ;
357364 case NetworkVariableReadPermission . Owner :
358- return clientId == m_NetworkBehaviour . NetworkObject . OwnerClientId || NetworkManager . ServerClientId == clientId ;
365+ return clientId == m_NetworkObject . OwnerClientId || NetworkManager . ServerClientId == clientId ;
359366 }
360367 }
361368
@@ -377,26 +384,26 @@ public bool CanClientWrite(ulong clientId)
377384 case NetworkVariableWritePermission . Server :
378385 return clientId == NetworkManager . ServerClientId ;
379386 case NetworkVariableWritePermission . Owner :
380- return clientId == m_NetworkBehaviour . NetworkObject . OwnerClientId ;
387+ return clientId == m_NetworkObject . OwnerClientId ;
381388 }
382389 }
383390
384391 /// <summary>
385392 /// Returns true if the current <see cref="NetworkManager.LocalClientId"/> can write to this variable; otherwise false.
386393 /// </summary>
387- internal bool CanWrite => m_NetworkManager && CanClientWrite ( m_NetworkManager . LocalClientId ) ;
394+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
395+ internal bool CanWrite ( )
396+ {
397+ return m_NetworkManager && CanClientWrite ( m_NetworkManager . LocalClientId ) ;
398+ }
388399
389400 /// <summary>
390401 /// Returns false if the current <see cref="NetworkManager.LocalClientId"/> can write to this variable; otherwise true.
391402 /// </summary>
392- internal bool CannotWrite => m_NetworkManager && ! CanClientWrite ( m_NetworkManager . LocalClientId ) ;
393-
394- /// <summary>
395- /// Returns the ClientId of the owning client
396- /// </summary>
397- internal ulong OwnerClientId ( )
403+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
404+ internal bool CannotWrite ( )
398405 {
399- return m_NetworkBehaviour . NetworkObject . OwnerClientId ;
406+ return m_NetworkManager && ! CanClientWrite ( m_NetworkManager . LocalClientId ) ;
400407 }
401408
402409 /// <summary>
@@ -467,7 +474,10 @@ internal virtual void WriteFieldSynchronization(FastBufferWriter writer)
467474 /// </summary>
468475 public virtual void Dispose ( )
469476 {
470- m_InternalNetworkManager = null ;
477+ HasBeenInitialized = false ;
478+ m_NetworkBehaviour = null ;
479+ m_NetworkObject = null ;
480+ m_NetworkManager = null ;
471481 }
472482 }
473483}
0 commit comments