Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a1fac91
chore: optimization
noellie-velez Dec 24, 2025
b1b85ac
chore: optimize NetworkManager accessors
noellie-velez Dec 29, 2025
0a28480
Merge branch 'develop-2.0.0' into chore/simplify-accessors-network-ob…
noellie-velez Dec 29, 2025
606c9f7
Using m_CachedNetworkObject instead of NetworkObject
noellie-velez Dec 29, 2025
18a1805
Using m_CachedNetworkManager instead of NetworkManager
noellie-velez Dec 29, 2025
7a49a9a
Convert "==" to explicit Unity engine object lifetime check
noellie-velez Dec 29, 2025
7d9ffd5
Fix wording
noellie-velez Dec 29, 2025
b255749
Use m_CachedParent and Scene
noellie-velez Dec 29, 2025
0ebab51
Changed parentObject scope
noellie-velez Dec 29, 2025
a166482
Removing comments (added in PR)
noellie-velez Dec 29, 2025
f817796
Revert null check removal for Log
noellie-velez Dec 29, 2025
e8d6053
Avoiding breaking change
noellie-velez Jan 5, 2026
43cc1cd
Reverting NetworkManager changes
noellie-velez Jan 5, 2026
25e9577
Address PR feedback
noellie-velez Jan 6, 2026
73a0bf8
Fix opposite null check
noellie-velez Jan 7, 2026
3f17e83
Address PR feedback
noellie-velez Jan 8, 2026
e02e462
Cleanup NetworkObject: use cached NetworkManager
noellie-velez Jan 8, 2026
690cabb
Cached NetworkManager instead of lazy instantiation
noellie-velez Jan 8, 2026
6860816
Merge branch 'develop-2.0.0' into chore/simplify-accessors-network-ob…
noellie-velez Jan 8, 2026
db9b406
Merge branch 'chore/simplify-accessors-network-object' into chore/sim…
noellie-velez Jan 9, 2026
815d310
Comments
noellie-velez Jan 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ internal void DeregisterUpdate()
internal NetworkAnimatorStateChangeHandler(NetworkAnimator networkAnimator)
{
m_NetworkAnimator = networkAnimator;
// TODO can we use m_LocalNetworkManager here or other cached var?
m_IsServer = networkAnimator.NetworkManager.IsServer;
NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate);
}
Expand Down Expand Up @@ -1505,7 +1506,7 @@ internal void UpdateAnimationState(AnimationState animationState)
}
}
// 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!");
//}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -971,6 +971,7 @@ protected override void OnOwnershipChanged(ulong previous, ulong current)
/// </remarks>
internal void UpdateOwnershipAuthority()
{
// TODO do we have a cached NetworkManager here? Should we create one?
if (NetworkManager.DistributedAuthorityMode)
{
// When in distributed authority mode, always use HasAuthority
Expand All @@ -980,6 +981,7 @@ internal void UpdateOwnershipAuthority()
{
if (NetworkTransform.IsServerAuthoritative())
{
// TODO do we have a cached NetworkManager here? Should we create one
m_IsAuthority = NetworkManager.IsServer;
}
else
Expand All @@ -997,6 +999,7 @@ internal void UpdateOwnershipAuthority()
/// <inheritdoc />
public override void OnNetworkSpawn()
{
// TODO do we have a cached NetworkManager here? Should we create one
m_TickFrequency = 1.0f / NetworkManager.NetworkConfig.TickRate;
m_TickRate = NetworkManager.NetworkConfig.TickRate;
UpdateOwnershipAuthority();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1619,7 +1619,7 @@ internal bool SynchronizeScale
public bool CanCommitToTransform { get; protected set; }

/// <summary>
/// Internally used by <see cref="NetworkTransform"/> to keep track of the <see cref="NetworkManager"/> instance assigned to this
/// Internally used by <see cref="NetworkTransform"/> to keep track of the <see cref="NetworkManager"/> instance assigned to
/// this <see cref="NetworkBehaviour"/> derived class instance.
/// </summary>
protected NetworkManager m_CachedNetworkManager;
Expand Down Expand Up @@ -1850,6 +1850,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;
Expand Down Expand Up @@ -2092,12 +2093,14 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat
return CheckForStateChange(ref networkState);
}

//private int m_CachedTickRateValue;
/// <summary>
/// Applies the transform to the <see cref="NetworkTransformState"/> specified.
/// </summary>
[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
Expand All @@ -2112,9 +2115,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;
Expand Down Expand Up @@ -3297,7 +3299,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)
{
Expand Down Expand Up @@ -3526,7 +3528,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)
Expand Down Expand Up @@ -3554,7 +3556,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();
}
Expand All @@ -3569,6 +3571,7 @@ protected internal override void InternalOnNetworkPostSpawn()
internal static InterpolationTypes DefaultInterpolationType;

internal Transform CachedTransform;
private uint m_CachedNetworkTickRate;

/// <summary>
/// Create interpolators when first instantiated to avoid memory allocations if the
Expand Down Expand Up @@ -3599,6 +3602,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);
}
Expand All @@ -3607,7 +3611,6 @@ internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManag
public override void OnNetworkSpawn()
{
m_ParentedChildren.Clear();
m_CachedNetworkManager = NetworkManager;

Initialize();

Expand All @@ -3625,9 +3628,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);
Expand Down Expand Up @@ -3673,7 +3676,7 @@ protected virtual void OnInitialize(ref NetworkVariable<NetworkTransformState> r
/// </summary>
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();
Expand All @@ -3695,7 +3698,7 @@ private void ResetInterpolatedStateToCurrentAuthoritativeState()
}
private NetworkObject m_CachedNetworkObject;
/// <summary>
/// The internal initialzation method to allow for internal API adjustments
/// The internal initialization method to allow for internal API adjustments
/// </summary>
/// <param name="isOwnershipChange"></param>
private void InternalInitialization(bool isOwnershipChange = false)
Expand All @@ -3707,7 +3710,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)
{
Expand All @@ -3719,7 +3722,7 @@ private void InternalInitialization(bool isOwnershipChange = false)
{
if (CanCommitToTransform)
{
if (NetworkObject.HasParentNetworkObject(transform))
if (m_CachedNetworkObject.HasParentNetworkObject(transform))
{
InLocalSpace = true;
}
Expand All @@ -3736,9 +3739,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
Expand Down Expand Up @@ -3890,7 +3893,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);
Expand Down Expand Up @@ -3922,7 +3925,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;
Expand Down Expand Up @@ -3954,7 +3957,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;
Expand Down Expand Up @@ -4577,7 +4580,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
Expand Down Expand Up @@ -4638,13 +4641,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;
}
Expand Down Expand Up @@ -4690,6 +4693,7 @@ internal static float GetTickLatency(NetworkManager networkManager)
/// Only valid on clients.
/// </remarks>
/// <returns>Returns the tick latency and local offset in seconds and as a float value.</returns>
/// Can this be called before spawn?
public static float GetTickLatency()
{
return GetTickLatency(NetworkManager.Singleton);
Expand Down Expand Up @@ -4783,7 +4787,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)
Expand All @@ -4802,14 +4806,14 @@ private static void RegisterNetworkManagerForTickUpdate(NetworkManager networkMa
/// <param name="networkTransform"></param>
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);
}

/// <summary>
Expand All @@ -4819,16 +4823,17 @@ private static void RegisterForTickUpdate(NetworkTransform networkTransform)
/// <param name="networkTransform"></param>
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();
}
}
Expand Down
Loading