diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs index c8db9b0d47..7d82872890 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs @@ -194,7 +194,7 @@ internal void DeregisterUpdate() internal NetworkAnimatorStateChangeHandler(NetworkAnimator networkAnimator) { m_NetworkAnimator = networkAnimator; - m_IsServer = networkAnimator.NetworkManager.IsServer; + m_IsServer = networkAnimator.LocalNetworkManager.IsServer; NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate); } } @@ -279,7 +279,7 @@ public Animator Animator private Dictionary> m_DestinationStateToTransitioninfo = new Dictionary>(); // Named differently to avoid serialization conflicts with NetworkBehaviour - private NetworkManager m_LocalNetworkManager; + internal NetworkManager LocalNetworkManager; internal bool DistributedAuthorityMode; @@ -915,8 +915,8 @@ internal AnimationMessage GetAnimationMessage() internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager) { // Save internal state references - m_LocalNetworkManager = networkManager; - DistributedAuthorityMode = m_LocalNetworkManager.DistributedAuthorityMode; + LocalNetworkManager = networkManager; + DistributedAuthorityMode = LocalNetworkManager.DistributedAuthorityMode; } /// @@ -1176,7 +1176,7 @@ internal void CheckForAnimatorChanges() if (m_Animator.runtimeAnimatorController == null) { - if (m_LocalNetworkManager.LogLevel == LogLevel.Developer) + if (LocalNetworkManager.LogLevel == LogLevel.Developer) { Debug.LogError($"[{GetType().Name}] Could not find an assigned {nameof(RuntimeAnimatorController)}! Cannot check {nameof(Animator)} for changes in state!"); } @@ -1211,9 +1211,9 @@ internal void CheckForAnimatorChanges() { // Just notify all remote clients and not the local server m_TargetGroup.Clear(); - foreach (var clientId in m_LocalNetworkManager.ConnectionManager.ConnectedClientIds) + foreach (var clientId in LocalNetworkManager.ConnectionManager.ConnectedClientIds) { - if (clientId == m_LocalNetworkManager.LocalClientId || !NetworkObject.Observers.Contains(clientId)) + if (clientId == LocalNetworkManager.LocalClientId || !NetworkObject.Observers.Contains(clientId)) { continue; } @@ -1241,7 +1241,7 @@ private void SendParametersUpdate(RpcParams rpcParams = default, bool sendDirect } else { - Debug.LogError($"[{name}][Client-{m_LocalNetworkManager.LocalClientId}] Attempting to send parameter updates but not the owner!"); + Debug.LogError($"[{name}][Client-{LocalNetworkManager.LocalClientId}] Attempting to send parameter updates but not the owner!"); } } else @@ -1491,18 +1491,18 @@ internal void UpdateAnimationState(AnimationState animationState) // Cross fade from the current to the destination state for the transitions duration while starting at the server's current normalized time of the transition m_Animator.CrossFade(transitionStateInfo.DestinationState, transitionStateInfo.TransitionDuration, transitionStateInfo.Layer, 0.0f, animationState.NormalizedTime); } - else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer) + else if (LocalNetworkManager.LogLevel == LogLevel.Developer) { NetworkLog.LogWarning($"Current State Hash ({currentState.fullPathHash}) != AnimationState.StateHash ({animationState.StateHash})"); } } - else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer) + else if (LocalNetworkManager.LogLevel == LogLevel.Developer) { NetworkLog.LogError($"[DestinationState To Transition Info] Layer ({animationState.Layer}) sub-table does not contain destination state ({animationState.DestinationStateHash})!"); } } // For reference, it is valid to have no transition information - //else if (NetworkManager.LogLevel == LogLevel.Developer) + //else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer) //{ // NetworkLog.LogError($"[DestinationState To Transition Info] Layer ({animationState.Layer}) does not exist!"); //} @@ -1539,7 +1539,7 @@ private unsafe void SendServerParametersUpdateRpc(ParametersUpdateMessage parame return; } UpdateParameters(ref parametersUpdate); - var connectedClientIds = m_LocalNetworkManager.ConnectionManager.ConnectedClientIds; + var connectedClientIds = LocalNetworkManager.ConnectionManager.ConnectedClientIds; if (connectedClientIds.Count <= (IsHost ? 2 : 1)) { return; @@ -1605,7 +1605,7 @@ private void SendServerAnimStateRpc(AnimationMessage animationMessage, RpcParams UpdateAnimationState(animationState); } - var connectedClientIds = m_LocalNetworkManager.ConnectionManager.ConnectedClientIds; + var connectedClientIds = LocalNetworkManager.ConnectionManager.ConnectedClientIds; if (connectedClientIds.Count <= (IsHost ? 2 : 1)) { return; @@ -1652,7 +1652,7 @@ private void ProcessAnimStates(AnimationMessage animationMessage) { if (HasAuthority) { - if (m_LocalNetworkManager.LogLevel == LogLevel.Developer) + if (LocalNetworkManager.LogLevel == LogLevel.Developer) { var hostOrOwner = DistributedAuthorityMode ? "Owner" : "Host"; var clientServerOrDAMode = DistributedAuthorityMode ? "distributed authority" : "client-server"; @@ -1677,7 +1677,7 @@ internal void SendServerAnimTriggerRpc(AnimationTriggerMessage animationTriggerM // Ignore if a non-owner sent this. if (rpcParams.Receive.SenderClientId != OwnerClientId) { - if (m_LocalNetworkManager.LogLevel == LogLevel.Developer) + if (LocalNetworkManager.LogLevel == LogLevel.Developer) { NetworkLog.LogWarning($"[Owner Authoritative] Detected the a non-authoritative client is sending the server animation trigger updates. If you recently changed ownership of the {name} object, then this could be the reason."); } @@ -1687,7 +1687,7 @@ internal void SendServerAnimTriggerRpc(AnimationTriggerMessage animationTriggerM // set the trigger locally on the server InternalSetTrigger(animationTriggerMessage.Hash, animationTriggerMessage.IsTriggerSet); - var connectedClientIds = m_LocalNetworkManager.ConnectionManager.ConnectedClientIds; + var connectedClientIds = LocalNetworkManager.ConnectionManager.ConnectedClientIds; m_TargetGroup.Clear(); foreach (var clientId in connectedClientIds) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs index 9fbf8a26c9..0d0de9afa8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs @@ -52,6 +52,7 @@ public abstract class NetworkRigidbodyBase : NetworkBehaviour #endif + private NetworkManager m_LocalNetworkManager; // Used to cache the authority state of this Rigidbody during the last frame private bool m_IsAuthority; @@ -971,7 +972,7 @@ protected override void OnOwnershipChanged(ulong previous, ulong current) /// internal void UpdateOwnershipAuthority() { - if (NetworkManager.DistributedAuthorityMode) + if (m_LocalNetworkManager.DistributedAuthorityMode) { // When in distributed authority mode, always use HasAuthority m_IsAuthority = HasAuthority; @@ -980,7 +981,7 @@ internal void UpdateOwnershipAuthority() { if (NetworkTransform.IsServerAuthoritative()) { - m_IsAuthority = NetworkManager.IsServer; + m_IsAuthority = m_LocalNetworkManager.IsServer; } else { @@ -994,11 +995,16 @@ internal void UpdateOwnershipAuthority() } } + internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager) + { + m_LocalNetworkManager = networkManager; + } + /// public override void OnNetworkSpawn() { - m_TickFrequency = 1.0f / NetworkManager.NetworkConfig.TickRate; - m_TickRate = NetworkManager.NetworkConfig.TickRate; + m_TickFrequency = 1.0f / m_LocalNetworkManager.NetworkConfig.TickRate; + m_TickRate = m_LocalNetworkManager.NetworkConfig.TickRate; UpdateOwnershipAuthority(); } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs index 64e9bc0b95..bb7fc5362d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs @@ -1621,7 +1621,7 @@ internal bool SynchronizeScale public bool CanCommitToTransform { get; protected set; } /// - /// Internally used by to keep track of the instance assigned to this + /// Internally used by to keep track of the instance assigned to /// this derived class instance. /// protected NetworkManager m_CachedNetworkManager; @@ -1852,6 +1852,7 @@ private bool ShouldSynchronizeHalfFloat(ulong targetClientId) if (!IsServerAuthoritative() && NetworkObject.OwnerClientId == targetClientId) { // In distributed authority mode we want to synchronize the half float if we are the owner. + // TODO do we have a cached NetworkManager here? Should we create one? return (!NetworkManager.DistributedAuthorityMode && NetworkObject.IsOwnedByServer) || (NetworkManager.DistributedAuthorityMode); } return true; @@ -2116,12 +2117,14 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat return CheckForStateChange(ref networkState); } + //private int m_CachedTickRateValue; /// /// Applies the transform to the specified. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool CheckForStateChange(ref NetworkTransformState networkState, bool isSynchronization = false, ulong targetClientId = 0, bool forceState = false) { + var cachedTickRateValue = (int)m_CachedNetworkManager.NetworkConfig.TickRate; var flagStates = networkState.FlagStates; // As long as we are not doing our first synchronization and we are sending unreliable deltas, each @@ -2136,9 +2139,8 @@ private bool CheckForStateChange(ref NetworkTransformState networkState, bool is // We compare against the NetworkTickSystem version since ServerTime is set when updating ticks if (UseUnreliableDeltas && !isSynchronization && m_DeltaSynch && m_NextTickSync <= CurrentTick) { - // TODO-CACHE: m_CachedNetworkManager.NetworkConfig.TickRate value // Increment to the next frame synch tick position for this instance - m_NextTickSync += (int)m_CachedNetworkManager.NetworkConfig.TickRate; + m_NextTickSync += cachedTickRateValue; // If we are teleporting, we do not need to send a frame synch for this tick slot // as a "frame synch" really is effectively just a teleport. isAxisSync = !flagStates.IsTeleportingNextFrame; @@ -3321,7 +3323,7 @@ private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransf } // Get the time when this new state was sent - newState.SentTime = new NetworkTime(m_CachedNetworkManager.NetworkTickSystem.TickRate, newState.NetworkTick).Time; + newState.SentTime = new NetworkTime(m_CachedNetworkTickRate, newState.NetworkTick).Time; if (LogStateUpdate) { @@ -3550,7 +3552,7 @@ protected internal override void InternalOnNetworkPostSpawn() // Then we want to: // - Force the "IsSynchronizing" flag so the NetworkTransform has its state updated properly and runs through the initialization again. // - Make sure the SynchronizingState is updated to the instantiated prefab's default flags/settings. - if (NetworkManager.IsServer && !NetworkManager.DistributedAuthorityMode && !IsOwner && !OnIsServerAuthoritative() && !SynchronizeState.IsSynchronizing) + if (m_CachedNetworkManager.IsServer && !m_CachedNetworkManager.DistributedAuthorityMode && !IsOwner && !OnIsServerAuthoritative() && !SynchronizeState.IsSynchronizing) { // Handle the first/root NetworkTransform slightly differently to have a sequenced synchronization of like authority nested NetworkTransform components if (m_IsFirstNetworkTransform) @@ -3578,7 +3580,7 @@ protected internal override void InternalOnNetworkPostSpawn() } // Standard non-authority synchronization is handled here - if (!CanCommitToTransform && NetworkManager.IsConnectedClient && SynchronizeState.IsSynchronizing) + if (!CanCommitToTransform && m_CachedNetworkManager.IsConnectedClient && SynchronizeState.IsSynchronizing) { NonAuthorityFinalizeSynchronization(); } @@ -3593,6 +3595,7 @@ protected internal override void InternalOnNetworkPostSpawn() internal static InterpolationTypes DefaultInterpolationType; internal Transform CachedTransform; + private uint m_CachedNetworkTickRate; /// /// Create interpolators when first instantiated to avoid memory allocations if the @@ -3623,6 +3626,7 @@ protected virtual void Awake() internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager) { m_CachedNetworkManager = networkManager; + m_CachedNetworkTickRate = m_CachedNetworkManager.NetworkTickSystem.TickRate; CachedTransform = transform; base.InternalOnNetworkPreSpawn(ref networkManager); } @@ -3631,7 +3635,6 @@ internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManag public override void OnNetworkSpawn() { m_ParentedChildren.Clear(); - m_CachedNetworkManager = NetworkManager; Initialize(); @@ -3649,9 +3652,9 @@ private void CleanUpOnDestroyOrDespawn() #else var forUpdate = true; #endif - if (m_CachedNetworkObject != null) + if (m_CachedNetworkObject) { - NetworkManager?.NetworkTransformRegistration(m_CachedNetworkObject, forUpdate, false); + m_CachedNetworkManager?.NetworkTransformRegistration(m_CachedNetworkObject, forUpdate, false); } DeregisterForTickUpdate(this); @@ -3697,7 +3700,7 @@ protected virtual void OnInitialize(ref NetworkVariable r /// private void ResetInterpolatedStateToCurrentAuthoritativeState() { - var serverTime = NetworkManager.ServerTime.Time; + var serverTime = m_CachedNetworkManager.ServerTime.Time; #if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D var position = m_UseRigidbodyForMotion ? m_NetworkRigidbodyInternal.GetPosition() : GetSpaceRelativePosition(); var rotation = m_UseRigidbodyForMotion ? m_NetworkRigidbodyInternal.GetRotation() : GetSpaceRelativeRotation(); @@ -3719,7 +3722,7 @@ private void ResetInterpolatedStateToCurrentAuthoritativeState() } private NetworkObject m_CachedNetworkObject; /// - /// The internal initialzation method to allow for internal API adjustments + /// The internal initialization method to allow for internal API adjustments /// /// private void InternalInitialization(bool isOwnershipChange = false) @@ -3731,7 +3734,7 @@ private void InternalInitialization(bool isOwnershipChange = false) m_CachedNetworkObject = NetworkObject; // Determine if this is the first NetworkTransform in the associated NetworkObject's list - m_IsFirstNetworkTransform = NetworkObject.NetworkTransforms[0] == this; + m_IsFirstNetworkTransform = m_CachedNetworkObject.NetworkTransforms[0] == this; if (m_CachedNetworkManager && m_CachedNetworkManager.DistributedAuthorityMode) { @@ -3755,9 +3758,9 @@ private void InternalInitialization(bool isOwnershipChange = false) var currentPosition = GetSpaceRelativePosition(); var currentRotation = GetSpaceRelativeRotation(); - if (NetworkManager.DistributedAuthorityMode) + if (m_CachedNetworkManager.DistributedAuthorityMode) { - RegisterNetworkManagerForTickUpdate(NetworkManager); + RegisterNetworkManagerForTickUpdate(m_CachedNetworkManager); } #if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D @@ -3909,7 +3912,7 @@ private void DefaultParentChanged() m_RotationInterpolator.Clear(); // Always use NetworkManager here as this can be invoked prior to spawning - var tempTime = new NetworkTime(NetworkManager.NetworkConfig.TickRate, NetworkManager.ServerTime.Tick).Time; + var tempTime = new NetworkTime(NetworkManager.NetworkConfig.TickRate, m_CachedNetworkManager.ServerTime.Tick).Time; UpdatePositionInterpolator(m_InternalCurrentPosition, tempTime, true); m_ScaleInterpolator.ResetTo(m_InternalCurrentScale, tempTime); m_RotationInterpolator.ResetTo(m_InternalCurrentRotation, tempTime); @@ -3941,7 +3944,7 @@ internal override void InternalOnNetworkObjectParentChanged(NetworkObject parent if (LastTickSync == m_LocalAuthoritativeNetworkState.GetNetworkTick()) { m_InternalCurrentPosition = m_LastStateTargetPosition = GetSpaceRelativePosition(); - m_PositionInterpolator.ResetTo(m_PositionInterpolator.Parent, m_InternalCurrentPosition, NetworkManager.ServerTime.Time); + m_PositionInterpolator.ResetTo(m_PositionInterpolator.Parent, m_InternalCurrentPosition, m_CachedNetworkManager.ServerTime.Time); if (InLocalSpace) { transform.localPosition = m_InternalCurrentPosition; @@ -3973,7 +3976,7 @@ internal override void InternalOnNetworkObjectParentChanged(NetworkObject parent { m_InternalCurrentRotation = GetSpaceRelativeRotation(); m_TargetRotation = m_InternalCurrentRotation.eulerAngles; - m_RotationInterpolator.ResetTo(m_RotationInterpolator.Parent, m_InternalCurrentRotation, NetworkManager.ServerTime.Time); + m_RotationInterpolator.ResetTo(m_RotationInterpolator.Parent, m_InternalCurrentRotation, m_CachedNetworkManager.ServerTime.Time); if (InLocalSpace) { transform.localRotation = m_InternalCurrentRotation; @@ -4596,7 +4599,7 @@ internal void TransformStateUpdate() { // TODO: Investigate where this state should be applied or just discarded. // For now, discard the state if we assumed ownership. - // Debug.Log($"[Client-{NetworkManager.LocalClientId}] Ignoring inbound update from Client-{0} and parentUpdated:{isParentingDirective}!"); + // Debug.Log($"[Client-{m_CachedNetworkManager.LocalClientId}] Ignoring inbound update from Client-{0} and parentUpdated:{isParentingDirective}!"); return; } // Store the previous/old state @@ -4657,13 +4660,13 @@ private void UpdateTransformState() { continue; } - NetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, clientId); + m_CachedNetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, clientId); } } else { // Clients (owner authoritative) send messages to the server-host - NetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, NetworkManager.ServerClientId); + m_CachedNetworkManager.MessageManager.SendMessage(ref m_OutboundMessage, networkDelivery, NetworkManager.ServerClientId); } m_LocalAuthoritativeNetworkState.LastSerializedSize = m_OutboundMessage.BytesWritten; } @@ -4802,7 +4805,7 @@ public NetworkTransformTickRegistration(NetworkManager networkManager) internal void RegisterForTickSynchronization() { s_TickSynchPosition++; - m_NextTickSync = NetworkManager.ServerTime.Tick + (s_TickSynchPosition % (int)NetworkManager.NetworkConfig.TickRate); + m_NextTickSync = m_CachedNetworkManager.ServerTime.Tick + (s_TickSynchPosition % (int)NetworkManager.NetworkConfig.TickRate); } private static void RegisterNetworkManagerForTickUpdate(NetworkManager networkManager) @@ -4821,14 +4824,14 @@ private static void RegisterNetworkManagerForTickUpdate(NetworkManager networkMa /// private static void RegisterForTickUpdate(NetworkTransform networkTransform) { - - if (!networkTransform.NetworkManager.DistributedAuthorityMode && !s_NetworkTickRegistration.ContainsKey(networkTransform.NetworkManager)) + var networkManager = networkTransform.NetworkManager; + if (!networkManager.DistributedAuthorityMode && !s_NetworkTickRegistration.ContainsKey(networkManager)) { - s_NetworkTickRegistration.Add(networkTransform.NetworkManager, new NetworkTransformTickRegistration(networkTransform.NetworkManager)); + s_NetworkTickRegistration.Add(networkManager, new NetworkTransformTickRegistration(networkManager)); } networkTransform.RegisterForTickSynchronization(); - s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Add(networkTransform); + s_NetworkTickRegistration[networkManager].NetworkTransforms.Add(networkTransform); } /// @@ -4838,16 +4841,17 @@ private static void RegisterForTickUpdate(NetworkTransform networkTransform) /// private static void DeregisterForTickUpdate(NetworkTransform networkTransform) { - if (networkTransform.NetworkManager == null) + var networkManager = networkTransform.NetworkManager; + if (!networkManager) { return; } - if (s_NetworkTickRegistration.ContainsKey(networkTransform.NetworkManager)) + if (s_NetworkTickRegistration.ContainsKey(networkManager)) { - s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Remove(networkTransform); - if (!networkTransform.NetworkManager.DistributedAuthorityMode && s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Count == 0) + s_NetworkTickRegistration[networkManager].NetworkTransforms.Remove(networkTransform); + if (!networkManager.DistributedAuthorityMode && s_NetworkTickRegistration[networkManager].NetworkTransforms.Count == 0) { - var registrationEntry = s_NetworkTickRegistration[networkTransform.NetworkManager]; + var registrationEntry = s_NetworkTickRegistration[networkManager]; registrationEntry.Remove(); } } diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index 3d3c919986..273a5b2826 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -90,6 +90,7 @@ internal FastBufferWriter __beginSendServerRpc(uint rpcMethodId, ServerRpcParams internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery) #pragma warning restore IDE1006 // restore naming rule violation check { + // Getting this ahead of time actually improves performance var networkManager = m_NetworkManager; var serverRpcMessage = new ServerRpcMessage { @@ -169,6 +170,7 @@ internal FastBufferWriter __beginSendClientRpc(uint rpcMethodId, ClientRpcParams internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery) #pragma warning restore IDE1006 // restore naming rule violation check { + // Getting this ahead of time actually improves performance var networkManager = m_NetworkManager; var clientRpcMessage = new ClientRpcMessage { @@ -217,7 +219,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth NetworkLog.LogError(GenerateObserverErrorMessage(clientRpcParams, targetClientId)); } } - rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, in clientRpcParams.Send.TargetClientIds); + rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, in clientRpcParams.Send.TargetClientIds); } else if (clientRpcParams.Send.TargetClientIdsNativeArray != null) { @@ -351,6 +353,7 @@ internal FastBufferWriter __beginSendRpc(uint rpcMethodId, RpcParams rpcParams, internal void __endSendRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, RpcParams rpcParams, RpcAttribute.RpcAttributeParams attributeParams, SendTo defaultTarget, RpcDelivery rpcDelivery) #pragma warning restore IDE1006 // restore naming rule violation check { + // Sould we create a local networkManager var to improve performance instead of using 2 times m_NetworkManager? var rpcMessage = new RpcMessage { Metadata = new RpcMetadata @@ -576,7 +579,7 @@ public NetworkObject NetworkObject { get { - if (m_NetworkObject != null) + if (m_NetworkObject) { return m_NetworkObject; } @@ -596,7 +599,7 @@ public NetworkObject NetworkObject // or NetworkBehaviour.IsSpawned (i.e. to early exit if not spawned) which, in turn, could generate several Warning messages // per spawned NetworkObject. Checking for ShutdownInProgress prevents these unnecessary LogWarning messages. // We must check IsSpawned, otherwise a warning will be logged under certain valid conditions (see OnDestroy) - if (IsSpawned && m_NetworkObject == null && (m_NetworkManager == null || !m_NetworkManager.ShutdownInProgress)) + if (IsSpawned && !m_NetworkObject && (!m_NetworkManager || !m_NetworkManager.ShutdownInProgress)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { @@ -652,6 +655,7 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId) /// internal void UpdateNetworkProperties() { + // Getting these ahead of time actually improves performance var networkObject = m_NetworkObject; var networkManager = m_NetworkManager; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index fe8cea525e..de6ea42802 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -390,8 +390,8 @@ private void CheckForInScenePlaced() /// Defaults to true, determines whether the will be destroyed. public void DeferDespawn(int tickOffset, bool destroy = true) { - // Ensure we log the DAMode message first as locking ownership is not allowed if not DA so the DA message is the most relevant. - if (!NetworkManager.DistributedAuthorityMode) + // Ensure we log the DAMode message first as locking ownership is not allowed if not in DAMode. + if (!NetworkManagerOwner.DistributedAuthorityMode) { if (NetworkManager.LogLevel <= LogLevel.Error) { @@ -606,7 +606,7 @@ internal void RemoveOwnershipExtended(OwnershipStatusExtended extended) /// true or false depending upon lock operation's success public bool SetOwnershipLock(bool lockOwnership = true) { - // Ensure we log the DAMode message first as locking ownership is not allowed if not DA so the DA message is the most relevant. + // Ensure we log the DAMode message first as locking ownership is not allowed if not in DAMode. if (!NetworkManager.DistributedAuthorityMode) { if (NetworkManager.LogLevel <= LogLevel.Error) @@ -1154,8 +1154,11 @@ public bool HasOwnershipStatus(OwnershipStatus status) [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool InternalHasAuthority() { - var networkManager = NetworkManager; - return networkManager.DistributedAuthorityMode ? OwnerClientId == networkManager.LocalClientId : networkManager.IsServer; + if (!IsSpawned) + { + return false; + } + return NetworkManagerOwner.DistributedAuthorityMode ? OwnerClientId == NetworkManagerOwner.LocalClientId : NetworkManagerOwner.IsServer; } /// @@ -2227,6 +2230,7 @@ internal bool InternalTrySetParent(NetworkObject parent, bool worldPositionStays } m_CachedWorldPositionStays = worldPositionStays; + if (parent == null) CurrentParent = parent; transform.SetParent(CurrentParent?.transform, worldPositionStays); @@ -3487,7 +3491,7 @@ internal void SceneChangedUpdate(Scene scene, bool notify = false) OnMigratedToNewScene?.Invoke(); // Only the authority side will notify clients of non-parented NetworkObject scene changes - if (isAuthority && notify && !transform.parent) + if (isAuthority && notify && transform.parent == null) { NetworkManagerOwner.SceneManager.NotifyNetworkObjectSceneChanged(this); } diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index d4768692ec..52c4b27a59 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -529,6 +529,7 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId, bool throw new NotServerException("Only the server can change ownership"); } + //Should this go at the beginning of the function? if (!networkObject.IsSpawned) { throw new SpawnStateException("Object is not spawned");