From db098074c699936115aace56e228b8a6706209f0 Mon Sep 17 00:00:00 2001 From: Dylan Smit Date: Wed, 17 Sep 2025 09:29:07 +0200 Subject: [PATCH 1/9] Improve Performance - Merge looped Add calls into AddRange - Optimize empty string checks - Merge position & rotation calls into one - Short circuit operators for bools - Optimize string generation - Use native Count instead of LINQ --- .../Editor/CodeGen/NetworkBehaviourILPP.cs | 10 ++-------- .../NetcodeForGameObjectsProjectSettings.cs | 2 +- .../Configuration/NetcodeSettingsProvider.cs | 2 +- .../Editor/HiddenScriptEditor.cs | 2 +- .../Editor/NetworkManagerEditor.cs | 2 +- .../Components/AnticipatedNetworkTransform.cs | 15 +++++---------- .../Runtime/Components/NetworkTransform.cs | 13 ++++++------- .../Runtime/Configuration/NetworkPrefabs.cs | 7 ++----- .../Runtime/Core/NetworkObject.cs | 4 ++-- .../Messaging/Messages/ParentSyncMessage.cs | 6 ++---- .../Runtime/Spawning/NetworkSpawnManager.cs | 12 ++++-------- .../NetworkTransformOwnershipTests.cs | 12 ++++-------- .../NetworkVariableCollectionsTests.cs | 2 +- .../Tests/Runtime/PlayerObjectTests.cs | 3 +-- .../Runtime/Prefabs/NetworkPrefabHandlerTests.cs | 3 +-- 15 files changed, 34 insertions(+), 61 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index 894aaf76d5..017ada087b 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -1432,10 +1432,7 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] ass if (typeDefinition.HasGenericParameters) { var genericTypes = new List(); - foreach (var parameter in typeDefinition.GenericParameters) - { - genericTypes.Add(parameter); - } + genericTypes.AddRange(typeDefinition.GenericParameters); callMethod = callMethod.MakeGeneric(genericTypes.ToArray()); } @@ -3102,10 +3099,7 @@ private MethodDefinition GenerateStaticHandler(MethodDefinition methodDefinition if (castType.HasGenericParameters) { var genericTypes = new List(); - foreach (var parameter in castType.GenericParameters) - { - genericTypes.Add(parameter); - } + genericTypes.AddRange(castType.GenericParameters); castType = castType.MakeGenericInstanceType(genericTypes.ToArray()); callMethod = callMethod.MakeGeneric(genericTypes.ToArray()); } diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs index 52bd0ef011..63aad22d09 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs @@ -22,7 +22,7 @@ public class NetcodeForGameObjectsProjectSettings : ScriptableSingleton /// Useful to know if we should or should not send a message /// - internal bool HasRemoteObservers => !(Observers.Count() == 0 || (Observers.Contains(NetworkManager.LocalClientId) && Observers.Count() == 1)); + internal bool HasRemoteObservers => !(Observers.Count == 0 || (Observers.Contains(NetworkManager.LocalClientId) && Observers.Count == 1)); /// /// Distributed Authority Mode Only @@ -1085,7 +1085,7 @@ internal void SendOwnershipStatusUpdate() } else { - changeOwnership.ClientIdCount = Observers.Count(); + changeOwnership.ClientIdCount = Observers.Count; changeOwnership.ClientIds = Observers.ToArray(); NetworkManager.ConnectionManager.SendMessage(ref changeOwnership, NetworkDelivery.Reliable, NetworkManager.ServerClientId); } diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ParentSyncMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ParentSyncMessage.cs index c2965d4b31..7b4739369d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ParentSyncMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ParentSyncMessage.cs @@ -130,13 +130,11 @@ public void Handle(ref NetworkContext context) // the values of the server-side post-parenting transform values if (!WorldPositionStays) { - networkObject.transform.localPosition = Position; - networkObject.transform.localRotation = Rotation; + networkObject.transform.SetLocalPositionAndRotation(Position, Rotation); } else { - networkObject.transform.position = Position; - networkObject.transform.rotation = Rotation; + networkObject.transform.SetPositionAndRotation(Position, Rotation); } networkObject.transform.localScale = Scale; } diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 69376d8ed4..5cbd710f46 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -801,8 +801,7 @@ internal NetworkObject InstantiateAndSpawnNoParameterChecks(NetworkObject networ return null; } networkObject.IsPlayerObject = isPlayerObject; - networkObject.transform.position = position; - networkObject.transform.rotation = rotation; + networkObject.transform.SetPositionAndRotation(position, rotation); // If spawning as a player, then invoke SpawnAsPlayerObject if (isPlayerObject) { @@ -901,8 +900,7 @@ internal NetworkObject GetNetworkObjectToSpawn(uint globalObjectIdHash, ulong ow internal NetworkObject InstantiateNetworkPrefab(GameObject networkPrefab, uint prefabGlobalObjectIdHash, Vector3? position, Quaternion? rotation) { var networkObject = UnityEngine.Object.Instantiate(networkPrefab).GetComponent(); - networkObject.transform.position = position ?? networkObject.transform.position; - networkObject.transform.rotation = rotation ?? networkObject.transform.rotation; + networkObject.transform.SetPositionAndRotation(position ?? networkObject.transform.position, rotation ?? networkObject.transform.rotation); networkObject.NetworkManagerOwner = NetworkManager; networkObject.PrefabGlobalObjectIdHash = prefabGlobalObjectIdHash; return networkObject; @@ -996,13 +994,11 @@ internal NetworkObject CreateLocalNetworkObject(NetworkObject.SceneObject sceneO // then we want to apply the position and rotation values world space relative if ((worldPositionStays && !nonNetworkObjectParent) || !networkObject.AutoObjectParentSync) { - networkObject.transform.position = position; - networkObject.transform.rotation = rotation; + networkObject.transform.SetPositionAndRotation(position, rotation); } else { - networkObject.transform.localPosition = position; - networkObject.transform.localRotation = rotation; + networkObject.transform.SetLocalPositionAndRotation(position, rotation); } // SPECIAL CASE: diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformOwnershipTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformOwnershipTests.cs index 1c80fc61c5..22f9bc3a21 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformOwnershipTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformOwnershipTests.cs @@ -53,8 +53,7 @@ protected override void OnServerAndClientsCreated() rigidBody.detectCollisions = false; rigidBody.position = Vector3.zero; rigidBody.rotation = Quaternion.identity; - rigidBody.transform.position = Vector3.zero; - rigidBody.transform.rotation = Quaternion.identity; + rigidBody.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity); // NOTE: We don't use a sphere collider for this integration test because by the time we can // assure they don't collide and skew the results the NetworkObjects are already synchronized // with skewed results @@ -77,8 +76,7 @@ protected override void OnServerAndClientsCreated() rigidBody.detectCollisions = false; rigidBody.position = Vector3.zero; rigidBody.rotation = Quaternion.identity; - rigidBody.transform.position = Vector3.zero; - rigidBody.transform.rotation = Quaternion.identity; + rigidBody.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity); // NOTE: We don't use a sphere collider for this integration test because by the time we can // assure they don't collide and skew the results the NetworkObjects are already synchronized // with skewed results @@ -302,8 +300,7 @@ void LogOwnerRigidBody(int stage) } else { - ownerInstance.transform.position = valueSetByOwner; - ownerInstance.transform.rotation = rotation; + ownerInstance.transform.SetPositionAndRotation(valueSetByOwner, rotation); ownerInstance.transform.localScale = valueSetByOwner; } @@ -392,8 +389,7 @@ void LogOwnerRigidBody(int stage) else { m_UseAdjustedVariance = false; - ownerInstance.transform.position = valueSetByOwner; - ownerInstance.transform.rotation = rotation; + ownerInstance.transform.SetPositionAndRotation(valueSetByOwner, rotation); } LogOwnerRigidBody(3); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableCollectionsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableCollectionsTests.cs index 85d283df3c..224b82cf32 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableCollectionsTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableCollectionsTests.cs @@ -726,7 +726,7 @@ private IEnumerator ValidateClients(NetworkManager clientBeingTested, bool initi if (initialize) { - clientsInitialized.Add(client.LocalClientId, ownerInitialized & serverInitialized); + clientsInitialized.Add(client.LocalClientId, ownerInitialized && serverInitialized); } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/PlayerObjectTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/PlayerObjectTests.cs index e011d94c8a..a3207c5a3c 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/PlayerObjectTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/PlayerObjectTests.cs @@ -141,8 +141,7 @@ protected override void OnCreatePlayerPrefab() var playerNetworkObject = m_PlayerPrefab.GetComponent(); m_PlayerPosition = GetRandomVector3(-10.0f, 10.0f); m_PlayerRotation = Quaternion.Euler(GetRandomVector3(-180.0f, 180.0f)); - playerNetworkObject.transform.position = m_PlayerPosition; - playerNetworkObject.transform.rotation = m_PlayerRotation; + playerNetworkObject.transform.SetPositionAndRotation(m_PlayerPosition, m_PlayerRotation); base.OnCreatePlayerPrefab(); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs index 7460ea65fc..34b98001ca 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs @@ -225,8 +225,7 @@ internal class NetworkPrefaInstanceHandler : INetworkPrefabInstanceHandler public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation) { var networkObjectInstance = UnityEngine.Object.Instantiate(m_NetworkObject.gameObject).GetComponent(); - networkObjectInstance.transform.position = position; - networkObjectInstance.transform.rotation = rotation; + networkObjectInstance.transform.SetPositionAndRotation(position, rotation); m_Instances.Add(networkObjectInstance); return networkObjectInstance; } From 5af68c3932bc3f7419a1db2827a4abb385930121 Mon Sep 17 00:00:00 2001 From: Emma Date: Wed, 17 Sep 2025 15:30:09 -0400 Subject: [PATCH 2/9] Additional fixes --- .../Assets/Scripts/MoverScriptNoRigidbody.cs | 6 ++---- .../Assets/Scripts/MoverScriptNoRigidbody.cs | 10 ++++------ .../Assets/Scripts/NetworkManagerBootstrapper.cs | 9 ++++----- .../Assets/Scripts/NetworkPrefabOverrideHandler.cs | 4 +--- .../Documentation~/basics/object-spawning.md | 6 ++---- .../Runtime/Components/AnticipatedNetworkTransform.cs | 9 +++------ .../Transports/UnityTransportConnectionTests.cs | 1 - .../PrefabPool/NetworkPrefabHandlerObjectPool.cs | 3 +-- .../NetworkPrefabHandlerObjectPoolOverride.cs | 4 +--- .../LinearMotionHandler.cs | 4 ++-- .../InSceneParentChildHandler.cs | 4 ++-- .../Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs | 3 +-- .../Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs | 3 +-- 13 files changed, 24 insertions(+), 42 deletions(-) diff --git a/Examples/CharacterControllerMovingBodies/Assets/Scripts/MoverScriptNoRigidbody.cs b/Examples/CharacterControllerMovingBodies/Assets/Scripts/MoverScriptNoRigidbody.cs index 555ed20113..13423f4629 100644 --- a/Examples/CharacterControllerMovingBodies/Assets/Scripts/MoverScriptNoRigidbody.cs +++ b/Examples/CharacterControllerMovingBodies/Assets/Scripts/MoverScriptNoRigidbody.cs @@ -136,8 +136,7 @@ protected override void OnNetworkPreSpawn(ref NetworkManager networkManager) /// /// We are using post spawn to handle any final spawn initializations. - /// At this point we know all NetworkBehaviours on this instance has - /// been spawned. + /// At this point we know all NetworkBehaviours on this instance have been spawned. /// protected override void OnNetworkPostSpawn() { @@ -173,8 +172,7 @@ public override void OnNetworkDespawn() { m_CharacterController.enabled = false; Camera.main.transform.SetParent(null, false); - Camera.main.transform.position = m_CameraOriginalPosition; - Camera.main.transform.rotation = m_CameraOriginalRotation; + Camera.main.transform.SetPositionAndRotation(m_CameraOriginalPosition, m_CameraOriginalRotation); } base.OnNetworkDespawn(); } diff --git a/Examples/OverridingScenesAndPrefabs/Assets/Scripts/MoverScriptNoRigidbody.cs b/Examples/OverridingScenesAndPrefabs/Assets/Scripts/MoverScriptNoRigidbody.cs index 5cc3865bfd..6da9441570 100644 --- a/Examples/OverridingScenesAndPrefabs/Assets/Scripts/MoverScriptNoRigidbody.cs +++ b/Examples/OverridingScenesAndPrefabs/Assets/Scripts/MoverScriptNoRigidbody.cs @@ -5,7 +5,7 @@ using Random = UnityEngine.Random; using Debug = UnityEngine.Debug; -#region MoverScriptNoRigidbody Custom Editor +#region MoverScriptNoRigidbody Custom Editor #if UNITY_EDITOR using Unity.Netcode.Editor; using UnityEditor; @@ -144,8 +144,7 @@ protected override void OnNetworkPreSpawn(ref NetworkManager networkManager) /// /// We are using post spawn to handle any final spawn initializations. - /// At this point we know all NetworkBehaviours on this instance has - /// been spawned. + /// At this point we know all NetworkBehaviours on this instance have been spawned. /// protected override void OnNetworkPostSpawn() { @@ -182,14 +181,13 @@ protected override void OnNetworkPostSpawn() public override void OnNetworkDespawn() { - // Notify any client or server specific componant that this instance has despawned. + // Notify any client or server specific component that this instance has despawned. NotifySpawnStatusChanged?.Invoke(false); if (IsLocalPlayer) { m_CharacterController.enabled = false; Camera.main.transform.SetParent(null, false); - Camera.main.transform.position = m_CameraOriginalPosition; - Camera.main.transform.rotation = m_CameraOriginalRotation; + Camera.main.transform.SetPositionAndRotation(m_CameraOriginalPosition, m_CameraOriginalRotation); } base.OnNetworkDespawn(); } diff --git a/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkManagerBootstrapper.cs b/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkManagerBootstrapper.cs index da858b14ef..172d819c27 100644 --- a/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkManagerBootstrapper.cs +++ b/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkManagerBootstrapper.cs @@ -415,8 +415,7 @@ private void SetCameraDefaults() if (Camera.main != null && Camera.main.transform.parent != null) { Camera.main.transform.SetParent(null, false); - Camera.main.transform.position = m_CameraOriginalPosition; - Camera.main.transform.rotation = m_CameraOriginalRotation; + Camera.main.transform.SetPositionAndRotation(m_CameraOriginalPosition, m_CameraOriginalRotation); } } @@ -522,7 +521,7 @@ private void StartDedicatedServer() /// /// Register callbacks when the OnServerStarted callback is invoked. - /// This makes it easier to know you are registering for events only + /// This makes it easier to know you are registering for events only /// when the server successfully has started. /// private void ServerStarted() @@ -578,11 +577,11 @@ private void HandleEditorKeyCommands() #else private void HandleConsoleKeyCommands() { - if (Console.KeyAvailable) + if (Console.KeyAvailable) { var networkManager = NetworkManager.Singleton; var keyPressed = Console.ReadKey(true); - switch(keyPressed.Key) + switch(keyPressed.Key) { case ConsoleKey.X: { diff --git a/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkPrefabOverrideHandler.cs b/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkPrefabOverrideHandler.cs index 9bba90b13a..0784033889 100644 --- a/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkPrefabOverrideHandler.cs +++ b/Examples/OverridingScenesAndPrefabs/Assets/Scripts/NetworkPrefabOverrideHandler.cs @@ -45,8 +45,7 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni var gameObject = m_NetworkManager.IsClient ? Instantiate(NetworkPrefabOverride) : Instantiate(NetworkPrefab); // You could integrate spawn locations here and on the server side apply the spawn position at // this stage of the spawn process. - gameObject.transform.position = position; - gameObject.transform.rotation = rotation; + gameObject.transform.SetPositionAndRotation(position, rotation); return gameObject.GetComponent(); } @@ -64,4 +63,3 @@ public void Destroy(NetworkObject networkObject) Destroy(networkObject.gameObject); } } - diff --git a/com.unity.netcode.gameobjects/Documentation~/basics/object-spawning.md b/com.unity.netcode.gameobjects/Documentation~/basics/object-spawning.md index d9b7bff794..56202b919f 100644 --- a/com.unity.netcode.gameobjects/Documentation~/basics/object-spawning.md +++ b/com.unity.netcode.gameobjects/Documentation~/basics/object-spawning.md @@ -153,8 +153,7 @@ This type of dynamically spawned `NetworkObject` typically is a simple wrapper c m_prefabInstance = Instantiate(prefabToSpawn); // Optional, this example applies the spawner's position and rotation to the new instance - m_prefabInstance.transform.position = transform.position; - m_prefabInstance.transform.rotation = transform.rotation; + m_prefabInstance.transform.SetPositionAndRotation(transform.position, transform.rotation); // Get the instance's NetworkObject and Spawn m_SpawnedNetworkObject = m_prefabInstance.GetComponent(); @@ -233,8 +232,7 @@ public class SinglePooledDynamicSpawner : NetworkBehaviour, INetworkprefabInstan public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation) { m_prefabInstance.SetActive(true); - m_prefabInstance.transform.position = transform.position; - m_prefabInstance.transform.rotation = transform.rotation; + m_prefabInstance.transform.position.SetPositionAndRotation(transform.position, transform.rotation); return m_SpawnedNetworkObject; } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/AnticipatedNetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/AnticipatedNetworkTransform.cs index 1a7564f8a4..9f0545fc6c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/AnticipatedNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/AnticipatedNetworkTransform.cs @@ -277,9 +277,8 @@ private void ProcessSmoothing() m_PreviousAnticipatedTransform = m_AnticipatedTransform; if (!CanCommitToTransform) { - transform_.position = m_AnticipatedTransform.Position; + transform_.SetPositionAndRotation(m_AnticipatedTransform.Position, m_AnticipatedTransform.Rotation); transform_.localScale = m_AnticipatedTransform.Scale; - transform_.rotation = m_AnticipatedTransform.Rotation; } } } @@ -549,18 +548,16 @@ protected override void OnTransformUpdated() if (!m_OutstandingAuthorityChange) { // Keep the anticipated value unchanged, we have no updates from the server at all. - transform_.position = previousAnticipatedTransform.Position; + transform_.SetPositionAndRotation(previousAnticipatedTransform.Position, previousAnticipatedTransform.Rotation); transform_.localScale = previousAnticipatedTransform.Scale; - transform_.rotation = previousAnticipatedTransform.Rotation; return; } if (StaleDataHandling == StaleDataHandling.Ignore && m_LastAnticipaionCounter > m_LastAuthorityUpdateCounter) { // Keep the anticipated value unchanged because it is more recent than the authoritative one. - transform_.position = previousAnticipatedTransform.Position; + transform_.SetPositionAndRotation(previousAnticipatedTransform.Position, previousAnticipatedTransform.Rotation); transform_.localScale = previousAnticipatedTransform.Scale; - transform_.rotation = previousAnticipatedTransform.Rotation; return; } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs index d94e7ef0b9..bb22902312 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs @@ -5,7 +5,6 @@ using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using Unity.Netcode.Transports.UTP; -using Unity.Networking.Transport; using UnityEngine; using UnityEngine.TestTools; using static Unity.Netcode.RuntimeTests.UnityTransportTestHelpers; diff --git a/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs b/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs index f065a214c3..1879a4612d 100644 --- a/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs +++ b/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs @@ -71,8 +71,7 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni { var gameObject = GetNextSpawnObject(); gameObject.SetActive(true); - gameObject.transform.position = position; - gameObject.transform.rotation = rotation; + gameObject.transform.SetPositionAndRotation(position, rotation); return gameObject.GetComponent(); } diff --git a/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPoolOverride.cs b/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPoolOverride.cs index 8dcc706559..0a3dcee572 100644 --- a/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPoolOverride.cs +++ b/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPoolOverride.cs @@ -128,8 +128,7 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni { var gameObject = GetNextSpawnObject(); gameObject.SetActive(true); - gameObject.transform.position = position; - gameObject.transform.rotation = rotation; + gameObject.transform.SetPositionAndRotation(position, rotation); return gameObject.GetComponent(); } @@ -180,4 +179,3 @@ private IEnumerator SpawnObjects() } } } - diff --git a/testproject/Assets/Tests/Manual/DeltaPositionNetworkTransform/LinearMotionHandler.cs b/testproject/Assets/Tests/Manual/DeltaPositionNetworkTransform/LinearMotionHandler.cs index 542de6d6de..d9b1567093 100644 --- a/testproject/Assets/Tests/Manual/DeltaPositionNetworkTransform/LinearMotionHandler.cs +++ b/testproject/Assets/Tests/Manual/DeltaPositionNetworkTransform/LinearMotionHandler.cs @@ -396,8 +396,8 @@ private void LateUpdate() SetNextDirection(); } - ClientPositionVisual.transform.position = m_ClientPosition; - ClientPositionVisual.transform.rotation = InLocalSpace ? transform.localRotation : transform.rotation; + var rotation = InLocalSpace ? transform.localRotation : transform.rotation; + ClientPositionVisual.transform.SetPositionAndRotation(m_ClientPosition, rotation); } private Vector3 m_ServerPosition; diff --git a/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/InSceneParentChildHandler.cs b/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/InSceneParentChildHandler.cs index 61d6f53b1f..2acd84bf43 100644 --- a/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/InSceneParentChildHandler.cs +++ b/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/InSceneParentChildHandler.cs @@ -231,8 +231,8 @@ public override void OnNetworkObjectParentChanged(NetworkObject parentNetworkObj m_TargetLocalRotation = GenerateVector3(RotationMin, RotationMax); var scale = Random.Range(ScaleMin, ScaleMax); m_TargetLocalScale = Vector3.one * scale; - transform.position = m_TargetLocalPosition; - transform.rotation = Quaternion.Euler(m_TargetLocalRotation); + + transform.SetPositionAndRotation(m_TargetLocalPosition, Quaternion.Euler(m_TargetLocalRotation)); transform.localScale = m_TargetLocalScale; base.OnNetworkObjectParentChanged(parentNetworkObject); diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs index 3035cfcfc0..cd8a832954 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs @@ -612,8 +612,7 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni var obj = GetObject(); if (obj != null) { - obj.transform.position = position; - obj.transform.rotation = rotation; + obj.transform.SetPositionAndRotation(position, rotation); return obj.GetComponent(); } return null; diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs index ea2dfc2416..f714d937de 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs @@ -432,8 +432,7 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni var obj = GetObject(); if (obj != null) { - obj.transform.position = position; - obj.transform.rotation = rotation; + obj.transform.SetPositionAndRotation(position, rotation); return obj.GetComponent(); } return null; From bb7a85ae682e6293c50f7bc5099cb4e43bbb725f Mon Sep 17 00:00:00 2001 From: Emma Date: Wed, 17 Sep 2025 15:47:56 -0400 Subject: [PATCH 3/9] Remove invalid null checks --- .../Configuration/NetcodeForGameObjectsProjectSettings.cs | 2 +- .../Editor/Configuration/NetcodeSettingsProvider.cs | 2 +- com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs | 5 ++--- .../Editor/NetworkManagerEditor.cs | 6 +++--- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs index 63aad22d09..48ddd77fde 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs @@ -22,7 +22,7 @@ public class NetcodeForGameObjectsProjectSettings : ScriptableSingleton @@ -129,7 +128,7 @@ public override void OnInspectorGUI() overrideIp = EditorGUILayout.TextField("Override Bind IP (optional)", overrideIp); if (allowRemoteConnections) { - if (overrideIp?.Length == 0) + if (overrideIp.Length == 0) { if (isIpV6) { diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs index 9b73e3b08c..a72c9482e8 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs @@ -251,12 +251,12 @@ private void DisplayNetworkManagerProperties() // Default directory var directory = "Assets/"; var assetPath = AssetDatabase.GetAssetPath(m_NetworkManager); - if (assetPath?.Length == 0) + if (assetPath.Length == 0) { assetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(m_NetworkManager); } - if (assetPath != "") + if (assetPath.Length > 0) { directory = Path.GetDirectoryName(assetPath); } @@ -270,7 +270,7 @@ private void DisplayNetworkManagerProperties() if (prefabStage != null) { var prefabPath = prefabStage.assetPath; - if (!string.IsNullOrEmpty(prefabPath)) + if (prefabPath.Length > 0) { directory = Path.GetDirectoryName(prefabPath); } From 3acee45c18f7fef34e38d202208ddf4639581acb Mon Sep 17 00:00:00 2001 From: Emma Date: Wed, 17 Sep 2025 17:32:52 -0400 Subject: [PATCH 4/9] update CHANGELOG --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index c3c3d9f73e..e2e69665ff 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -23,6 +23,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Fixed +- Made a variety of small performance improvements. (#3683) ### Security From 7579be9370ecd27715f785aaf325ce170e34b5ea Mon Sep 17 00:00:00 2001 From: Emma Date: Wed, 17 Sep 2025 19:49:26 -0400 Subject: [PATCH 5/9] Fix standards check --- .../Runtime/Transports/UnityTransportConnectionTests.cs | 3 +++ testproject/Assets/AddressableAssetsData/Windows.meta | 8 -------- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 testproject/Assets/AddressableAssetsData/Windows.meta diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs index bb22902312..47e9d610df 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs @@ -5,6 +5,9 @@ using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using Unity.Netcode.Transports.UTP; +#if HOSTNAME_RESOLUTION_AVAILABLE +using Unity.Networking.Transport; +#endif using UnityEngine; using UnityEngine.TestTools; using static Unity.Netcode.RuntimeTests.UnityTransportTestHelpers; diff --git a/testproject/Assets/AddressableAssetsData/Windows.meta b/testproject/Assets/AddressableAssetsData/Windows.meta deleted file mode 100644 index 24d59b91eb..0000000000 --- a/testproject/Assets/AddressableAssetsData/Windows.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: acf26035dc7bf2f4f9dce266b9d3f2fc -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 3cf7e7a8fcae96797310844279d515c427b749ce Mon Sep 17 00:00:00 2001 From: Emma Date: Fri, 19 Sep 2025 17:59:07 -0400 Subject: [PATCH 6/9] Final fixes --- .../Editor/CodeGen/NetworkBehaviourILPP.cs | 6 ++---- .../Runtime/Components/Helpers/AttachableBehaviour.cs | 3 +-- .../Manual/InSceneObjectParentingTests/ChildObjectScript.cs | 5 ++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index 017ada087b..5396087381 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -1431,8 +1431,7 @@ private void ProcessNetworkBehaviour(TypeDefinition typeDefinition, string[] ass MethodReference callMethod = rpcHandler; if (typeDefinition.HasGenericParameters) { - var genericTypes = new List(); - genericTypes.AddRange(typeDefinition.GenericParameters); + var genericTypes = new List(typeDefinition.GenericParameters); callMethod = callMethod.MakeGeneric(genericTypes.ToArray()); } @@ -3098,8 +3097,7 @@ private MethodDefinition GenerateStaticHandler(MethodDefinition methodDefinition var callMethod = (MethodReference)methodDefinition; if (castType.HasGenericParameters) { - var genericTypes = new List(); - genericTypes.AddRange(castType.GenericParameters); + var genericTypes = new List(castType.GenericParameters); castType = castType.MakeGenericInstanceType(genericTypes.ToArray()); callMethod = callMethod.MakeGeneric(genericTypes.ToArray()); } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/AttachableBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/AttachableBehaviour.cs index 0d1a85d516..14c72673a3 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/AttachableBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/AttachableBehaviour.cs @@ -463,8 +463,7 @@ internal void InternalDetach() { // Set the original parent and origianl local position and rotation transform.SetParent(m_DefaultParent.transform, false); - transform.localPosition = m_OriginalLocalPosition; - transform.localRotation = m_OriginalLocalRotation; + transform.SetLocalPositionAndRotation(m_OriginalLocalPosition, m_OriginalLocalRotation); } m_AttachState = AttachState.Detached; } diff --git a/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/ChildObjectScript.cs b/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/ChildObjectScript.cs index e3413a4ec1..decc21ab13 100644 --- a/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/ChildObjectScript.cs +++ b/testproject/Assets/Tests/Manual/InSceneObjectParentingTests/ChildObjectScript.cs @@ -65,10 +65,9 @@ public override void OnNetworkObjectParentChanged(NetworkObject parentNetworkObj { // This preserves the original position offset of the object when parented with // WorldPositionStays set to false. - transform.localPosition = m_OriginalLocalPosition; + transform.SetLocalPositionAndRotation(m_OriginalLocalPosition, m_OriginalLocalRotation); - // Optionally, you can also make other modifications to rotation or scale - transform.localRotation = m_OriginalLocalRotation; + // Optionally, you can also make other modifications to scale transform.localScale = m_OriginalLocalScale; } else if (parentNetworkObject == null && m_LastParent) From 4cc0beb7e75d22bb56c871450c27ff8224d74c02 Mon Sep 17 00:00:00 2001 From: Emma Date: Mon, 29 Sep 2025 12:53:16 -0400 Subject: [PATCH 7/9] Remove unneeded code from HiddenScriptEditor --- com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs b/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs index 5161f43aee..e6dc823e4e 100644 --- a/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs @@ -75,7 +75,6 @@ private void Initialize() m_ServerAddressProperty = connectionDataProperty.FindPropertyRelative(nameof(UnityTransport.ConnectionAddressData.Address)); m_ServerPortProperty = connectionDataProperty.FindPropertyRelative(nameof(UnityTransport.ConnectionAddressData.Port)); - connectionDataProperty.FindPropertyRelative(nameof(UnityTransport.ConnectionAddressData.ServerListenAddress)); } /// From a89dca55cd1d1442ff5ad930921cbe8f3936f737 Mon Sep 17 00:00:00 2001 From: Emma Date: Wed, 1 Oct 2025 15:30:21 -0400 Subject: [PATCH 8/9] Remove the toolchain package --- testproject/Packages/manifest.json | 1 - testproject/Packages/packages-lock.json | 26 ------------------------- 2 files changed, 27 deletions(-) diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 093b170b97..1895c93dcc 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -14,7 +14,6 @@ "com.unity.test-framework": "1.4.6", "com.unity.test-framework.performance": "3.0.3", "com.unity.timeline": "1.8.7", - "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.10", "com.unity.ugui": "2.0.0", "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.ai": "1.0.0", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 4788651e18..dd5f6204a3 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -154,22 +154,6 @@ }, "url": "https://packages.unity.com" }, - "com.unity.sysroot": { - "version": "2.0.10", - "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.sysroot.linux-x86_64": { - "version": "2.0.9", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.sysroot": "2.0.10" - }, - "url": "https://packages.unity.com" - }, "com.unity.test-framework": { "version": "1.4.6", "depth": 0, @@ -203,16 +187,6 @@ }, "url": "https://packages.unity.com" }, - "com.unity.toolchain.win-x86_64-linux-x86_64": { - "version": "2.0.10", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.sysroot": "2.0.10", - "com.unity.sysroot.linux-x86_64": "2.0.9" - }, - "url": "https://packages.unity.com" - }, "com.unity.transport": { "version": "2.4.0", "depth": 1, From 76c884d85152969e2f2baa413385c5f218d2c2ce Mon Sep 17 00:00:00 2001 From: Emma Date: Thu, 2 Oct 2025 11:38:17 -0400 Subject: [PATCH 9/9] Fix HelpURL tests on ios --- com.unity.netcode.gameobjects/Tests/Runtime/HelpUrlTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/HelpUrlTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/HelpUrlTests.cs index 4d3a6d608f..97e98f28f6 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/HelpUrlTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/HelpUrlTests.cs @@ -21,7 +21,9 @@ internal class HelpUrlTests private bool m_VerboseLogging = false; + // IOS platform can't run this test for some reason. [UnityTest] + [UnityPlatform(exclude = new[] { RuntimePlatform.IPhonePlayer })] public IEnumerator ValidateUrlsAreValid() { var names = new List();