From b5bff0216a51048e7b48eb9583f89cdfc53b3b09 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 14:41:47 -0600 Subject: [PATCH 01/14] update Funneling all find object related calls into a single static method in order to simplify the current, and any future, updates/changes to FindObjectsByType. --- .../Editor/NetworkManagerHelper.cs | 2 +- .../Runtime/Core/FindObjects.cs | 22 +++++++++++++ .../Runtime/Core/FindObjects.cs.meta | 2 ++ .../SceneManagement/NetworkSceneManager.cs | 7 +---- .../Runtime/SceneManagement/SceneEventData.cs | 21 ++----------- .../Runtime/Spawning/NetworkSpawnManager.cs | 24 +++----------- .../Runtime/Unity.Netcode.Runtime.asmdef | 5 +++ .../Tests/Runtime/DeferredMessagingTests.cs | 13 ++------ .../Tests/Runtime/IntegrationTestExamples.cs | 21 ++----------- ...orkObjectNetworkClientOwnedObjectsTests.cs | 7 +---- .../NetworkTransformAnticipationTests.cs | 7 +++-- .../NetworkVariableAnticipationTests.cs | 8 +++-- .../NetworkVariableTraitsTests.cs | 2 +- .../Tests/Runtime/NetworkVisibilityTests.cs | 10 +++--- .../Runtime/Prefabs/AddNetworkPrefabTests.cs | 6 +--- .../Prefabs/NetworkPrefabHandlerTests.cs | 9 ++---- .../Tests/Runtime/Rpc/UniversalRpcTests.cs | 6 ++-- .../IntegrationTestSceneHandler.cs | 13 ++------ .../TestHelpers/NetcodeIntegrationTest.cs | 31 ++++++------------- .../NetworkManagerMonitor.cs | 6 +--- .../Tests/Manual/Scripts/NetworkPrefabPool.cs | 6 +--- .../Assets/Tests/Runtime/AddressablesTests.cs | 19 ++---------- .../Tests/Runtime/NetworkManagerTests.cs | 2 +- ...ariableInitializationOnNetworkSpawnTest.cs | 12 ++----- .../SceneObjectsNotDestroyedOnShutdownTest.cs | 13 ++++---- 25 files changed, 90 insertions(+), 184 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs.meta diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs index 5cba906f2a..cdd4b06186 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs @@ -92,7 +92,7 @@ private static void ScenesInBuildActiveSceneCheck() var activeScene = SceneManager.GetActiveScene(); var isSceneInBuildSettings = scenesList.Count((c) => c.path == activeScene.path) == 1; #if UNITY_2023_1_OR_NEWER - var networkManager = Object.FindFirstObjectByType(); + var networkManager = Object.FindAnyObjectByType(); #else var networkManager = Object.FindObjectOfType(); #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs new file mode 100644 index 0000000000..1300839e25 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +namespace Unity.Netcode +{ + public static class FindObjects + { + public static T[] FindObjectsByType() where T : Object + { +#if NGO_FINDOBJECTS_NOSORTING + var results = Object.FindObjectsByType(); +#else +#if UNITY_2023_1_OR_NEWER + var results = Object.FindObjectsByType(FindObjectsSortMode.None); +#else + var results = Object.FindObjectsOfType(); +#endif +#endif + return results; + } + + } +} diff --git a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs.meta b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs.meta new file mode 100644 index 0000000000..be409d580c --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3611778bb9b546442a815265407eff81 \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs index 2a57291dec..b228f2ddf9 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs @@ -2729,12 +2729,7 @@ internal void PopulateScenePlacedObjects(Scene sceneToFilterBy, bool clearSceneP { ScenePlacedObjects.Clear(); } - -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); // Just add every NetworkObject found that isn't already in the list // With additive scenes, we can have multiple in-scene placed NetworkObjects with the same GlobalObjectIdHash value diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 165a70fa33..e8464c2d20 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -368,12 +368,7 @@ internal void AddDespawnedInSceneNetworkObjects() { m_DespawnedInSceneObjectsSync.Clear(); // Find all active and non-active in-scene placed NetworkObjects -#if UNITY_2023_1_OR_NEWER - var inSceneNetworkObjects = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.InstanceID).Where((c) => c.NetworkManager == m_NetworkManager); -#else - var inSceneNetworkObjects = UnityEngine.Object.FindObjectsOfType(includeInactive: true).Where((c) => c.NetworkManager == m_NetworkManager); - -#endif + var inSceneNetworkObjects = FindObjects.FindObjectsByType().Where((c) => c.NetworkManager == m_NetworkManager); foreach (var sobj in inSceneNetworkObjects) { if (sobj.IsSceneObject.HasValue && sobj.IsSceneObject.Value && !sobj.IsSpawned) @@ -917,11 +912,7 @@ internal void ReadClientReSynchronizationData(FastBufferReader reader) if (networkObjectsToRemove.Length > 0) { -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsSortMode.InstanceID); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); var networkObjectIdToNetworkObject = new Dictionary(); foreach (var networkObject in networkObjects) { @@ -1049,14 +1040,8 @@ private void DeserializeDespawnedInScenePlacedNetworkObjects() var objectRelativeScene = m_NetworkManager.SceneManager.ScenesLoaded[localSceneHandle]; // Find all active and non-active in-scene placed NetworkObjects -#if UNITY_2023_1_OR_NEWER - var inSceneNetworkObjects = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Include, UnityEngine.FindObjectsSortMode.InstanceID).Where((c) => - c.GetSceneOriginHandle() == localSceneHandle && (c.IsSceneObject != false)).ToList(); -#else - var inSceneNetworkObjects = UnityEngine.Object.FindObjectsOfType(includeInactive: true).Where((c) => + var inSceneNetworkObjects = FindObjects.FindObjectsByType().Where((c) => c.GetSceneOriginHandle() == localSceneHandle && (c.IsSceneObject != false)).ToList(); -#endif - foreach (var inSceneObject in inSceneNetworkObjects) { diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 3efd90779d..631445955b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1369,11 +1369,7 @@ internal void DespawnObject(NetworkObject networkObject, bool destroyObject = fa // Makes scene objects ready to be reused internal void ServerResetShudownStateForSceneObjects() { -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType().Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); -#endif + var networkObjects = FindObjects.FindObjectsByType().Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); foreach (var sobj in networkObjects) { sobj.IsSpawned = false; @@ -1404,11 +1400,7 @@ internal void ServerDestroySpawnedSceneObjects() internal void DespawnAndDestroyNetworkObjects() { -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); for (int i = 0; i < networkObjects.Length; i++) { @@ -1456,11 +1448,7 @@ internal void DespawnAndDestroyNetworkObjects() internal void DestroySceneObjects() { -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); for (int i = 0; i < networkObjects.Length; i++) { @@ -1491,11 +1479,7 @@ internal void DestroySceneObjects() internal void ServerSpawnSceneObjectsOnStartSweep() { -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); var networkObjectsToSpawn = new List(); for (int i = 0; i < networkObjects.Length; i++) { diff --git a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef index c43f102051..fdc763b83a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -87,6 +87,11 @@ "name": "Unity", "expression": "6000.5.0a1", "define": "SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG" + }, + { + "name": "Unity", + "expression": "6000.4.0b5", + "define": "NGO_FINDOBJECTS_NOSORTING" } ], "noEngineReferences": false diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs index 5c2b0ca1d4..a74a29fa92 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs @@ -278,12 +278,7 @@ private void SpawnClients(bool clearTestDeferredMessageManagerCallFlags = true) private T GetComponentForClient(ulong clientId) where T : NetworkBehaviour { -#if UNITY_2023_1_OR_NEWER - var componentsToFind = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var componentsToFind = Object.FindObjectsOfType(); -#endif - + var componentsToFind = FindObjects.FindObjectsByType(); foreach (var component in componentsToFind) { if (component.IsSpawned && component.NetworkManager.LocalClientId == clientId) @@ -761,11 +756,7 @@ bool HaveAllClientsSpawned() { var found1 = false; var found2 = false; -#if UNITY_2023_1_OR_NEWER - var deferredMessageTestRpcComponents = Object.FindObjectsByType(FindObjectsSortMode.None); -#else - var deferredMessageTestRpcComponents = Object.FindObjectsOfType(); -#endif + var deferredMessageTestRpcComponents = FindObjects.FindObjectsByType(); foreach (var component in deferredMessageTestRpcComponents) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs b/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs index 0318e79433..f699aae230 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs @@ -29,15 +29,7 @@ public IEnumerator MyFirstIntegationTest() { // Check the condition for this test and automatically handle varying processing // environments and conditions -#if UNITY_2023_1_OR_NEWER - yield return WaitForConditionOrTimeOut(() => - Object.FindObjectsByType(FindObjectsSortMode.None).Where( - (c) => c.IsSpawned).Count() == 2); -#else - yield return WaitForConditionOrTimeOut(() => - Object.FindObjectsOfType().Where( - (c) => c.IsSpawned).Count() == 2); -#endif + yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == 2); Assert.False(s_GlobalTimeoutHelper.TimedOut, "Timed out waiting for instances " + "to be detected!"); } @@ -69,16 +61,7 @@ public IEnumerator MyFirstIntegationTest() { // Check the condition for this test and automatically handle varying processing // environments and conditions -#if UNITY_2023_1_OR_NEWER - yield return WaitForConditionOrTimeOut(() => - Object.FindObjectsByType(FindObjectsSortMode.None).Where( - (c) => c.IsSpawned).Count() == 2); -#else - yield return WaitForConditionOrTimeOut(() => - Object.FindObjectsOfType().Where( - (c) => c.IsSpawned).Count() == 2); -#endif - + yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == 2); Assert.False(s_GlobalTimeoutHelper.TimedOut, "Timed out waiting for instances " + "to be detected!"); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs index d9b0521e56..6a9de8d4d7 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs @@ -75,12 +75,7 @@ public IEnumerator WhenOwnershipIsChanged_OwnershipValuesUpdateCorrectly() Assert.IsFalse(serverBehaviour.IsOwnedByServer); Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, serverBehaviour.OwnerClientId); -#if UNITY_2023_1_OR_NEWER - var clientObject = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); -#else - var clientObject = Object.FindObjectsOfType().Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); -#endif - + var clientObject = FindObjects.FindObjectsByType().Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); Assert.IsNotNull(clientObject); Assert.IsTrue(clientObject.IsOwner); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs index b9a361ef03..76a84a480d 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs @@ -6,7 +6,6 @@ using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; using UnityEngine.TestTools.Utils; -using Object = UnityEngine.Object; namespace Unity.Netcode.RuntimeTests { @@ -90,7 +89,8 @@ public AnticipatedNetworkTransform GetTestComponent() public AnticipatedNetworkTransform GetServerComponent() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var anticipatedNetworkTransforms = FindObjects.FindObjectsByType(); + foreach (var obj in anticipatedNetworkTransforms) { if (obj.NetworkManager == m_ServerNetworkManager && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) { @@ -103,7 +103,8 @@ public AnticipatedNetworkTransform GetServerComponent() public AnticipatedNetworkTransform GetOtherClientComponent() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var anticipatedNetworkTransforms = FindObjects.FindObjectsByType(); + foreach (var obj in anticipatedNetworkTransforms) { if (obj.NetworkManager == m_ClientNetworkManagers[1] && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs index 66d2d8d90f..c18a50f6dd 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs @@ -3,7 +3,7 @@ using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; -using Object = UnityEngine.Object; + namespace Unity.Netcode.RuntimeTests { @@ -79,7 +79,8 @@ public NetworkVariableAnticipationComponent GetTestComponent() public NetworkVariableAnticipationComponent GetServerComponent() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var objects = FindObjects.FindObjectsByType(); + foreach (var obj in objects) { if (obj.NetworkManager == m_ServerNetworkManager && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) { @@ -92,7 +93,8 @@ public NetworkVariableAnticipationComponent GetServerComponent() public NetworkVariableAnticipationComponent GetOtherClientComponent() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var objects = FindObjects.FindObjectsByType(); + foreach (var obj in objects) { if (obj.NetworkManager == m_ClientNetworkManagers[1] && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTraitsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTraitsTests.cs index fd7c886ab4..97d3e7a499 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTraitsTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTraitsTests.cs @@ -104,7 +104,7 @@ public IEnumerator WhenNewValueIsLessThanThresholdButMaxTimeHasPassed_VariableIs authorityComponent.TheVariable.Value = newValue; // We expect a timeout for this condition yield return WaitForConditionOrTimeOut(() => AllAuthorityInstanceValuesMatch(newValue), timeoutHelper); - Assert.True(timeoutHelper.TimedOut, $"Non-authority instances recieved changes when they should not have!"); + Assert.True(timeoutHelper.TimedOut, $"Non-authority instances recieved changes when they should not have!\n {m_ErrorLog.ToString()}"); // Now we expect this to not timeout yield return WaitForConditionOrTimeOut(() => AllAuthorityInstanceValuesMatch(newValue), timeoutHelper); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs index faee1f721f..b2690399c8 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs @@ -49,21 +49,21 @@ protected override IEnumerator OnServerAndClientsConnected() [UnityTest] public IEnumerator HiddenObjectsTest() { - yield return WaitForConditionOrTimeOut(() => Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsSpawned).Count() == TotalClients); - AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}!Actual count {Object.FindObjectsByType(FindObjectsSortMode.None).Count(c => c.IsSpawned)}"); + yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == TotalClients); + AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}!Actual count {FindObjects.FindObjectsByType().Count(c => c.IsSpawned)}"); } [UnityTest] public IEnumerator HideShowAndDeleteTest() { - yield return WaitForConditionOrTimeOut(() => Object.FindObjectsByType(FindObjectsSortMode.None).Count(c => c.IsSpawned) == TotalClients); + yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Count(c => c.IsSpawned) == TotalClients); - AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}! Actual count {Object.FindObjectsByType(FindObjectsSortMode.None).Count(c => c.IsSpawned)}"); + AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}! Actual count {FindObjects.FindObjectsByType().Count(c => c.IsSpawned)}"); var sessionOwnerNetworkObject = m_SpawnedObject.GetComponent(); var nonAuthority = GetNonAuthorityNetworkManager(); sessionOwnerNetworkObject.NetworkHide(nonAuthority.LocalClientId); - yield return WaitForConditionOrTimeOut(() => Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsSpawned).Count() == TotalClients - 1); + yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == TotalClients - 1); AssertOnTimeout($"Timed out waiting for {m_SpawnedObject.name} to be hidden from client!"); var networkObjectId = sessionOwnerNetworkObject.NetworkObjectId; sessionOwnerNetworkObject.NetworkShow(nonAuthority.LocalClientId); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs index 4627143c22..a0c610d591 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs @@ -45,11 +45,7 @@ protected override void OnServerAndClientsCreated() private EmptyComponent GetObjectForClient(ulong clientId) { -#if UNITY_2023_1_OR_NEWER - var emptyComponents = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var emptyComponents = Object.FindObjectsOfType(); -#endif + var emptyComponents = FindObjects.FindObjectsByType(); foreach (var component in emptyComponents) { if (component.IsSpawned && component.NetworkManager.LocalClientId == clientId) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs index 34b98001ca..6417e08fca 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; +using static Unity.Netcode.RuntimeTests.AddNetworkPrefabTest; namespace Unity.Netcode.RuntimeTests { @@ -198,13 +199,7 @@ public void TearDown() { //Stop, shutdown, and destroy NetworkManagerHelper.ShutdownNetworkManager(); - -#if UNITY_2023_1_OR_NEWER - var networkObjects = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.InstanceID).ToList(); -#else - var networkObjects = UnityEngine.Object.FindObjectsOfType().ToList(); -#endif - + var networkObjects = FindObjects.FindObjectsByType(); var networkObjectsList = networkObjects.Where(c => c.name.Contains(k_PrefabObjectName)); foreach (var networkObject in networkObjectsList) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs index e7073a8f80..3edb8030e2 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs @@ -585,7 +585,8 @@ protected override void OnInlineTearDown() protected void Clear() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var objects = FindObjects.FindObjectsByType(); + foreach (var obj in objects) { obj.Received = string.Empty; obj.ReceivedCount = 0; @@ -609,7 +610,8 @@ protected UniversalRpcNetworkBehaviour LegacyGetPlayerObject(ulong ownerClientId { if (ownerClientId == NetworkManager.ServerClientId && !m_ServerNetworkManager.IsHost) { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var objects = FindObjects.FindObjectsByType(); + foreach (var obj in objects) { if (obj.name.StartsWith("Server Object") && obj.OwnerClientId == ownerClientId && obj.NetworkManager.LocalClientId == onClient) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs index 7786dba6c2..797701aa4d 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs @@ -159,12 +159,7 @@ private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode loadScen private static void ProcessInSceneObjects(Scene scene, NetworkManager networkManager) { // Get all in-scene placed NeworkObjects that were instantiated when this scene loaded -#if UNITY_2023_1_OR_NEWER - var inSceneNetworkObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); -#else - var inSceneNetworkObjects = Object.FindObjectsOfType().Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); -#endif - + var inSceneNetworkObjects = FindObjects.FindObjectsByType().Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); foreach (var sobj in inSceneNetworkObjects) { ProcessInSceneObject(sobj, networkManager); @@ -713,11 +708,7 @@ public void MoveObjectsFromSceneToDontDestroyOnLoad(ref NetworkManager networkMa { // Create a local copy of the spawned objects list since the spawn manager will adjust the list as objects // are despawned. -#if UNITY_2023_1_OR_NEWER - var networkObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.IsSpawned); -#else - var networkObjects = Object.FindObjectsOfType().Where((c) => c.IsSpawned); -#endif + var networkObjects = FindObjects.FindObjectsByType().Where((c) => c.IsSpawned); var distributedAuthority = networkManager.DistributedAuthorityMode; foreach (var networkObject in networkObjects) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index da86d8a527..06bc640101 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -1167,7 +1167,7 @@ private void ClientNetworkManagerPostStart(NetworkManager networkManager) } // Get all player instances for the current client NetworkManager instance - var clientPlayerClones = Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsPlayerObject && c.OwnerClientId == networkManager.LocalClientId).ToList(); + var clientPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == networkManager.LocalClientId).ToList(); // Add this player instance to each client player entry foreach (var playerNetworkObject in clientPlayerClones) { @@ -1183,7 +1183,7 @@ private void ClientNetworkManagerPostStart(NetworkManager networkManager) } } // For late joining clients, add the remaining (if any) cloned versions of each client's player - clientPlayerClones = Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsPlayerObject && c.NetworkManager == networkManager).ToList(); + clientPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.NetworkManager == networkManager).ToList(); foreach (var playerNetworkObject in clientPlayerClones) { if (!m_PlayerNetworkObjects[networkManager.LocalClientId].ContainsKey(playerNetworkObject.OwnerClientId)) @@ -1207,7 +1207,7 @@ protected void ClientNetworkManagerPostStartInit() if (m_UseHost) { - var clientSideServerPlayerClones = Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsPlayerObject && c.OwnerClientId == NetworkManager.ServerClientId); + var clientSideServerPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == NetworkManager.ServerClientId); foreach (var playerNetworkObject in clientSideServerPlayerClones) { // When the server is not the host this needs to be done @@ -1316,7 +1316,7 @@ protected IEnumerator StartServerAndClients() if (m_UseHost || authorityManager.IsHost) { // Add the server player instance to all m_ClientSidePlayerNetworkObjects entries - var serverPlayerClones = Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); + var serverPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); foreach (var playerNetworkObject in serverPlayerClones) { if (!m_PlayerNetworkObjects.ContainsKey(playerNetworkObject.NetworkManager.LocalClientId)) @@ -1404,13 +1404,7 @@ protected void StartServerAndClientsWithTimeTravel() if (m_UseHost || authorityManager.IsHost) { -#if UNITY_2023_1_OR_NEWER - // Add the server player instance to all m_ClientSidePlayerNetworkObjects entries - var serverPlayerClones = Object.FindObjectsByType(FindObjectsSortMode.None).Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); -#else - // Add the server player instance to all m_ClientSidePlayerNetworkObjects entries - var serverPlayerClones = Object.FindObjectsOfType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); -#endif + var serverPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); foreach (var playerNetworkObject in serverPlayerClones) { if (!m_PlayerNetworkObjects.ContainsKey(playerNetworkObject.NetworkManager.LocalClientId)) @@ -1664,7 +1658,7 @@ public IEnumerator TearDown() /// private void DestroyNetworkManagers() { - var networkManagers = Object.FindObjectsByType(FindObjectsSortMode.None); + var networkManagers = FindObjects.FindObjectsByType(); foreach (var networkManager in networkManagers) { Object.DestroyImmediate(networkManager.gameObject); @@ -1733,11 +1727,7 @@ protected virtual bool CanDestroyNetworkObject(NetworkObject networkObject) /// protected void DestroySceneNetworkObjects() { -#if UNITY_2023_1_OR_NEWER - var networkObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkObjects = Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); foreach (var networkObject in networkObjects) { // This can sometimes be null depending upon order of operations @@ -2643,11 +2633,8 @@ public static void SimulateOneFrame() if (!string.IsNullOrEmpty(methodName)) { -#if UNITY_2023_1_OR_NEWER - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.InstanceID)) -#else - foreach (var obj in Object.FindObjectsOfType()) -#endif + var networkObjects = FindObjects.FindObjectsByType(); + foreach (var obj in networkObjects) { var method = obj.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); method?.Invoke(obj, new object[] { }); diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs index 3186d99549..838cb8b381 100644 --- a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs +++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs @@ -10,11 +10,7 @@ public class NetworkManagerMonitor : MonoBehaviour // Start is called before the first frame update private void Start() { -#if UNITY_2023_1_OR_NEWER - var networkManagerInstances = FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkManagerInstances = FindObjectsOfType(); -#endif + var networkManagerInstances = FindObjects.FindObjectsByType(); foreach (var instance in networkManagerInstances) { if (instance.IsListening) diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs index cd8a832954..adee7ce406 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs @@ -348,11 +348,7 @@ private void ShowHideObjectIdLabelClientRpc(bool isVisible) { m_LabelEnabled = isVisible; NetworkObjectLabel.GlobalVisibility = m_LabelEnabled; -#if UNITY_2023_1_OR_NEWER - var labels = FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var labels = FindObjectsOfType(); -#endif + var labels = FindObjects.FindObjectsByType(); foreach (var label in labels) { diff --git a/testproject/Assets/Tests/Runtime/AddressablesTests.cs b/testproject/Assets/Tests/Runtime/AddressablesTests.cs index 0cab9cff2b..4e04c1e5fd 100644 --- a/testproject/Assets/Tests/Runtime/AddressablesTests.cs +++ b/testproject/Assets/Tests/Runtime/AddressablesTests.cs @@ -76,12 +76,7 @@ private void SpawnAndValidate(GameObject prefab, bool waitAndAddOnClient = false var serverObj = Object.Instantiate(prefab); serverObj.GetComponent().NetworkManagerOwner = m_ServerNetworkManager; serverObj.GetComponent().Spawn(); - -#if UNITY_2023_1_OR_NEWER - var objs = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var objs = Object.FindObjectsOfType(); -#endif + var objs = FindObjects.FindObjectsByType(); // Prefabs loaded by addressables actually don't show up in this search. // Unlike other tests that make prefabs programmatically, those aren't added to the scene until they're instantiated @@ -95,11 +90,7 @@ private void SpawnAndValidate(GameObject prefab, bool waitAndAddOnClient = false { // Since it's not added, after the CreateObjectMessage is received, it's not spawned yet // Verify that to be the case as a precondition. -#if UNITY_2023_1_OR_NEWER - objs = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - objs = Object.FindObjectsOfType(); -#endif + objs = FindObjects.FindObjectsByType(); Assert.AreEqual(1, objs.Length); WaitForConditionOrTimeOutWithTimeTravel(() => MockTimeProvider.StaticRealTimeSinceStartup - startTime >= m_ClientNetworkManagers[0].NetworkConfig.SpawnTimeout - 0.25); foreach (var client in m_ClientNetworkManagers) @@ -108,11 +99,7 @@ private void SpawnAndValidate(GameObject prefab, bool waitAndAddOnClient = false } } -#if UNITY_2023_1_OR_NEWER - objs = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - objs = Object.FindObjectsOfType(); -#endif + objs = FindObjects.FindObjectsByType(); Assert.AreEqual(NumberOfClients + 1, objs.Length); foreach (var obj in objs) { diff --git a/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs b/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs index 378b307ce5..411d7e6fec 100644 --- a/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs +++ b/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs @@ -77,7 +77,7 @@ private bool TestComponentFound() return false; } #if UNITY_2023_1_OR_NEWER - m_NetworkObjectTestComponent = Object.FindFirstObjectByType(); + m_NetworkObjectTestComponent = Object.FindAnyObjectByType(); #else m_NetworkObjectTestComponent = Object.FindObjectOfType(); #endif diff --git a/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs b/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs index e71979dfd7..92a932e53d 100644 --- a/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs +++ b/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs @@ -97,11 +97,7 @@ private IEnumerator RunTest() const int expectedNetworkObjects = numClients + 2; // +2 = one for prefab, one for server. const int maxFrames = 240; var doubleCheckTime = Time.realtimeSinceStartup + 5.0f; -#if UNITY_2023_1_OR_NEWER - var networkObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - var networkObjects = Object.FindObjectsOfType(); -#endif + var networkObjects = FindObjects.FindObjectsByType(); while (networkObjects.Length != expectedNetworkObjects) { @@ -117,11 +113,7 @@ private IEnumerator RunTest() } var nextFrameNumber = Time.frameCount + 1; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); -#if UNITY_2023_1_OR_NEWER - networkObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID); -#else - networkObjects = Object.FindObjectsOfType(); -#endif + networkObjects = FindObjects.FindObjectsByType(); } serverObject.GetComponent().Variable.Value = NetworkVariableInitOnNetworkSpawn.ExpectedSpawnValueOnClient; diff --git a/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs b/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs index 5e393d143f..bbd7c176e6 100644 --- a/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs +++ b/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs @@ -6,7 +6,6 @@ using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.TestTools; -using Object = UnityEngine.Object; namespace TestProject.RuntimeTests { @@ -32,7 +31,7 @@ public IEnumerator SceneObjectsNotDestroyedOnShutdown() yield return WaitForConditionOrTimeOut(() => m_TestScene.IsValid() && m_TestScene.isLoaded); AssertOnTimeout($"Timed out waiting for scene {k_TestScene} to load!"); - var loadedInSceneObject = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); + var loadedInSceneObject = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); Assert.IsNotNull(loadedInSceneObject, $"Failed to find {k_SceneObjectName} before starting client!"); AssertOnTimeout($"Timed out waiting to find {k_SceneObjectName} after scene load and before starting client!\""); @@ -40,11 +39,11 @@ public IEnumerator SceneObjectsNotDestroyedOnShutdown() var lateJoin = CreateNewClient(); yield return StartClient(lateJoin); - var loadedInSceneObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.name.Contains(k_SceneObjectName)); + var loadedInSceneObjects = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)); Assert.IsTrue(loadedInSceneObjects.Count() > 1, $"Only found one instance of {k_SceneObjectName} after client connected!"); lateJoin.Shutdown(); yield return m_DefaultWaitForTick; - loadedInSceneObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.name.Contains(k_SceneObjectName)); + loadedInSceneObjects = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)); Assert.IsTrue(loadedInSceneObjects.Count() > 1, $"Only found one instance of {k_SceneObjectName} after client shutdown!"); } @@ -59,7 +58,7 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown() yield return WaitForConditionOrTimeOut(() => m_TestScene.IsValid() && m_TestScene.isLoaded); AssertOnTimeout($"Timed out waiting for scene {k_TestScene} to load!"); - var loadedInSceneObject = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); + var loadedInSceneObject = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); Assert.IsNotNull(loadedInSceneObject, $"Failed to find {k_SceneObjectName} before starting client!"); var lateJoin = CreateNewClient(); @@ -71,7 +70,7 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown() yield return WaitForConditionOrTimeOut(() => PlayerHasChildren(clientId)); AssertOnTimeout($"Client-{clientId} player never parented {k_SceneObjectName}!"); - var loadedInSceneObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where((c) => c.name.Contains(k_SceneObjectName)); + var loadedInSceneObjects = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)); Assert.IsTrue(loadedInSceneObjects.Count() > 1, $"Only found one instance of {k_SceneObjectName} after client connected!"); lateJoin.Shutdown(); yield return m_DefaultWaitForTick; @@ -80,7 +79,7 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown() yield return WaitForConditionOrTimeOut(() => PlayerNoLongerExistsWithChildren(clientId)); AssertOnTimeout($"Client-{clientId} player still exits with children after client shutdown!"); - loadedInSceneObjects = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).Where(o => o.name.Contains(k_SceneObjectName)).ToArray(); + loadedInSceneObjects = FindObjects.FindObjectsByType().Where(o => o.name.Contains(k_SceneObjectName)).ToArray(); // Make sure any in-scene placed NetworkObject instantiated has no parent foreach (var inSceneObject in loadedInSceneObjects) { From 793bade9e8caede87721127874e7071fd0dffb6a Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 14:49:26 -0600 Subject: [PATCH 02/14] update Making FindObjects internal. --- com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs index 1300839e25..e3c56bf7eb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs @@ -2,7 +2,7 @@ namespace Unity.Netcode { - public static class FindObjects + internal static class FindObjects { public static T[] FindObjectsByType() where T : Object { From c8f54c9e43a655b230582e93bc09e5d6a00435d0 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 15:02:52 -0600 Subject: [PATCH 03/14] update Adjusted to explicit handling of the update within test project script to avoid having to make FindObjects public. --- .../NetworkManagerMonitor.cs | 11 ++++++++++- .../Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs | 10 +++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs index 838cb8b381..8f3de974e2 100644 --- a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs +++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs @@ -10,7 +10,16 @@ public class NetworkManagerMonitor : MonoBehaviour // Start is called before the first frame update private void Start() { - var networkManagerInstances = FindObjects.FindObjectsByType(); +#if UNITY_6000_4_OR_NEWER + var networkManagerInstances = FindObjectsByType(); +#else +#if UNITY_2023_1_OR_NEWER + var networkManagerInstances = FindObjectsByType(FindObjectsSortMode.None); +#else + var networkManagerInstances = FindObjectsOfType(); +#endif +#endif + foreach (var instance in networkManagerInstances) { if (instance.IsListening) diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs index adee7ce406..5fc6c04606 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs @@ -348,7 +348,15 @@ private void ShowHideObjectIdLabelClientRpc(bool isVisible) { m_LabelEnabled = isVisible; NetworkObjectLabel.GlobalVisibility = m_LabelEnabled; - var labels = FindObjects.FindObjectsByType(); +#if UNITY_6000_4_OR_NEWER + var labels = FindObjectsByType(); +#else +#if UNITY_2023_1_OR_NEWER + var labels = FindObjectsByType(FindObjectsSortMode.None); +#else + var labels = FindObjectsOfType(); +#endif +#endif foreach (var label in labels) { From a5719db14e042f63048dc6fe396a3ed7bf458a3a Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 15:12:16 -0600 Subject: [PATCH 04/14] update Adding [MethodImpl(MethodImplOptions.AggressiveInlining)] attribute to the T[] FindObjectsByType() method. --- com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs index e3c56bf7eb..f25e4656b2 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs @@ -1,9 +1,11 @@ +using System.Runtime.CompilerServices; using UnityEngine; namespace Unity.Netcode { internal static class FindObjects { + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[] FindObjectsByType() where T : Object { #if NGO_FINDOBJECTS_NOSORTING From fec5e651c01ccc11278649960313f0b72d7b348c Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 15:23:49 -0600 Subject: [PATCH 05/14] style Removing unused using directives. Removing CR. --- .../Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs | 1 - .../Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs index c18a50f6dd..251947aae9 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs @@ -4,7 +4,6 @@ using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; - namespace Unity.Netcode.RuntimeTests { internal class NetworkVariableAnticipationComponent : NetworkBehaviour diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs index 6417e08fca..ec20e6b2f8 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs @@ -4,7 +4,6 @@ using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; -using static Unity.Netcode.RuntimeTests.AddNetworkPrefabTest; namespace Unity.Netcode.RuntimeTests { From db390f587c5f38a5faaee1b197f52040bc25e353 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 16:07:58 -0600 Subject: [PATCH 06/14] Update com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs Co-authored-by: Emma --- com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs index f25e4656b2..d61590dfd9 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs @@ -10,12 +10,10 @@ public static T[] FindObjectsByType() where T : Object { #if NGO_FINDOBJECTS_NOSORTING var results = Object.FindObjectsByType(); -#else -#if UNITY_2023_1_OR_NEWER +#elif UNITY_2023_1_OR_NEWER var results = Object.FindObjectsByType(FindObjectsSortMode.None); #else var results = Object.FindObjectsOfType(); -#endif #endif return results; } From 9a5d04bf433fe3b366958f6a1bb0dd46b0af9240 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 26 Jan 2026 16:12:49 -0600 Subject: [PATCH 07/14] update Adding same condition define, NGO_FINDOBJECTS_NOSORTING, to the testproject.manualtests assembly define. --- .../NetworkManagerMonitor.cs | 42 +++++++++---------- .../Tests/Manual/Scripts/NetworkPrefabPool.cs | 7 +--- .../Manual/testproject.manualtests.asmdef | 12 +++++- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs index 8f3de974e2..24f52d6df4 100644 --- a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs +++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs @@ -1,33 +1,33 @@ using Unity.Netcode; using UnityEngine; -/// -/// This can be added to the same GameObject the NetworkManager component is assigned to in order to prevent -/// multiple NetworkManager instances from being instantiated if the same scene is loaded. -/// -public class NetworkManagerMonitor : MonoBehaviour +namespace TestProject.ManualTests { - // Start is called before the first frame update - private void Start() + /// + /// This can be added to the same GameObject the NetworkManager component is assigned to in order to prevent + /// multiple NetworkManager instances from being instantiated if the same scene is loaded. + /// + public class NetworkManagerMonitor : MonoBehaviour { -#if UNITY_6000_4_OR_NEWER - var networkManagerInstances = FindObjectsByType(); -#else -#if UNITY_2023_1_OR_NEWER - var networkManagerInstances = FindObjectsByType(FindObjectsSortMode.None); + // Start is called before the first frame update + private void Start() + { +#if NGO_FINDOBJECTS_NOSORTING + var networkManagerInstances = FindObjectsByType(); +#elif UNITY_2023_1_OR_NEWER + var networkManagerInstances = FindObjectsByType(FindObjectsSortMode.None); #else - var networkManagerInstances = FindObjectsOfType(); -#endif + var networkManagerInstances = FindObjectsOfType(); #endif - - foreach (var instance in networkManagerInstances) - { - if (instance.IsListening) + foreach (var instance in networkManagerInstances) { - if (gameObject != instance.gameObject) + if (instance.IsListening) { - var networkManager = GetComponent(); - Destroy(gameObject); + if (gameObject != instance.gameObject) + { + var networkManager = GetComponent(); + Destroy(gameObject); + } } } } diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs index 5fc6c04606..7821d2af27 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs @@ -348,16 +348,13 @@ private void ShowHideObjectIdLabelClientRpc(bool isVisible) { m_LabelEnabled = isVisible; NetworkObjectLabel.GlobalVisibility = m_LabelEnabled; -#if UNITY_6000_4_OR_NEWER +#if NGO_FINDOBJECTS_NOSORTING var labels = FindObjectsByType(); -#else -#if UNITY_2023_1_OR_NEWER +#elif UNITY_2023_1_OR_NEWER var labels = FindObjectsByType(FindObjectsSortMode.None); #else var labels = FindObjectsOfType(); #endif -#endif - foreach (var label in labels) { label.SetLabelVisibility(isVisible); diff --git a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef index 9297230e03..45a7cd9a12 100644 --- a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef +++ b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef @@ -7,5 +7,13 @@ "Unity.Netcode.Components", "Unity.Collections", "Unity.Mathematics" - ] -} + ], + "versionDefines": [ + { + "name": "Unity", + "expression": "6000.4.0b5", + "define": "NGO_FINDOBJECTS_NOSORTING" + } + ], + "noEngineReferences": false +} \ No newline at end of file From a5983f7ff0a326f3f6b703670cb5a706cff0decd Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 27 Jan 2026 13:13:18 -0600 Subject: [PATCH 08/14] update Added more precise Unity engine versions to asmdef files to assure earlier versions of 6000.4 and 6000.5 still use the previous API. Renamed FindObjects.FindObjectsByType to FindObjects.ByType Updated FindObject.ByType to be able to sort by identifier and include inactive objects. --- .../Runtime/Core/FindObjects.cs | 33 +++++++++++++++---- .../SceneManagement/NetworkSceneManager.cs | 2 +- .../Runtime/SceneManagement/SceneEventData.cs | 6 ++-- .../Runtime/Spawning/NetworkSpawnManager.cs | 8 ++--- .../Runtime/Unity.Netcode.Runtime.asmdef | 7 +++- .../Tests/Runtime/DeferredMessagingTests.cs | 4 +-- .../Tests/Runtime/IntegrationTestExamples.cs | 4 +-- ...orkObjectNetworkClientOwnedObjectsTests.cs | 2 +- .../NetworkTransformAnticipationTests.cs | 4 +-- .../NetworkVariableAnticipationTests.cs | 4 +-- .../Tests/Runtime/NetworkVisibilityTests.cs | 10 +++--- .../Runtime/Prefabs/AddNetworkPrefabTests.cs | 2 +- .../Prefabs/NetworkPrefabHandlerTests.cs | 2 +- .../Tests/Runtime/Rpc/UniversalRpcTests.cs | 4 +-- .../IntegrationTestSceneHandler.cs | 4 +-- .../TestHelpers/NetcodeIntegrationTest.cs | 16 ++++----- .../Manual/testproject.manualtests.asmdef | 7 +++- .../Assets/Tests/Runtime/AddressablesTests.cs | 6 ++-- ...ariableInitializationOnNetworkSpawnTest.cs | 4 +-- .../SceneObjectsNotDestroyedOnShutdownTest.cs | 12 +++---- 20 files changed, 85 insertions(+), 56 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs index d61590dfd9..849afe1b88 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs @@ -1,22 +1,41 @@ +#if NGO_FINDOBJECTS_NOSORTING +using System; +#endif using System.Runtime.CompilerServices; -using UnityEngine; +using Object = UnityEngine.Object; namespace Unity.Netcode { + /// + /// Helper class to handle the variations of FindObjectsByType. + /// + /// + /// It is intentional that we do not include the UnityEngine namespace in order to avoid + /// over-complicatd define wrapping between versions that do or don't support FindObjectsSortMode. + /// internal static class FindObjects { + /// + /// Replaces to have one place where these changes are applied. + /// + /// + /// When true, inactive objects will be included. + /// When true, the array returned will be sorted by identifier. + /// Resulst as an of type T [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static T[] FindObjectsByType() where T : Object + public static T[] ByType(bool includeInactive = false, bool orderByIdentifier = false) where T : Object { + var inactive = includeInactive ? UnityEngine.FindObjectsInactive.Include : UnityEngine.FindObjectsInactive.Exclude; #if NGO_FINDOBJECTS_NOSORTING - var results = Object.FindObjectsByType(); -#elif UNITY_2023_1_OR_NEWER - var results = Object.FindObjectsByType(FindObjectsSortMode.None); + var results = Object.FindObjectsByType(inactive); + if (orderByIdentifier) + { + Array.Sort(results, (a, b) => a.GetEntityId().CompareTo(b.GetEntityId())); + } #else - var results = Object.FindObjectsOfType(); + var results = Object.FindObjectsByType(inactive, orderByIdentifier ? UnityEngine.FindObjectsSortMode.InstanceID : UnityEngine.FindObjectsSortMode.None); #endif return results; } - } } diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs index b228f2ddf9..0e75f0c92f 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs @@ -2729,7 +2729,7 @@ internal void PopulateScenePlacedObjects(Scene sceneToFilterBy, bool clearSceneP { ScenePlacedObjects.Clear(); } - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); // Just add every NetworkObject found that isn't already in the list // With additive scenes, we can have multiple in-scene placed NetworkObjects with the same GlobalObjectIdHash value diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index e8464c2d20..26967c3928 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -368,7 +368,7 @@ internal void AddDespawnedInSceneNetworkObjects() { m_DespawnedInSceneObjectsSync.Clear(); // Find all active and non-active in-scene placed NetworkObjects - var inSceneNetworkObjects = FindObjects.FindObjectsByType().Where((c) => c.NetworkManager == m_NetworkManager); + var inSceneNetworkObjects = FindObjects.ByType(true, true).Where((c) => c.NetworkManager == m_NetworkManager); foreach (var sobj in inSceneNetworkObjects) { if (sobj.IsSceneObject.HasValue && sobj.IsSceneObject.Value && !sobj.IsSpawned) @@ -912,7 +912,7 @@ internal void ReadClientReSynchronizationData(FastBufferReader reader) if (networkObjectsToRemove.Length > 0) { - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); var networkObjectIdToNetworkObject = new Dictionary(); foreach (var networkObject in networkObjects) { @@ -1040,7 +1040,7 @@ private void DeserializeDespawnedInScenePlacedNetworkObjects() var objectRelativeScene = m_NetworkManager.SceneManager.ScenesLoaded[localSceneHandle]; // Find all active and non-active in-scene placed NetworkObjects - var inSceneNetworkObjects = FindObjects.FindObjectsByType().Where((c) => + var inSceneNetworkObjects = FindObjects.ByType(true, true).Where((c) => c.GetSceneOriginHandle() == localSceneHandle && (c.IsSceneObject != false)).ToList(); foreach (var inSceneObject in inSceneNetworkObjects) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 631445955b..4f1d732a12 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1369,7 +1369,7 @@ internal void DespawnObject(NetworkObject networkObject, bool destroyObject = fa // Makes scene objects ready to be reused internal void ServerResetShudownStateForSceneObjects() { - var networkObjects = FindObjects.FindObjectsByType().Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); + var networkObjects = FindObjects.ByType().Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); foreach (var sobj in networkObjects) { sobj.IsSpawned = false; @@ -1400,7 +1400,7 @@ internal void ServerDestroySpawnedSceneObjects() internal void DespawnAndDestroyNetworkObjects() { - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); for (int i = 0; i < networkObjects.Length; i++) { @@ -1448,7 +1448,7 @@ internal void DespawnAndDestroyNetworkObjects() internal void DestroySceneObjects() { - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); for (int i = 0; i < networkObjects.Length; i++) { @@ -1479,7 +1479,7 @@ internal void DestroySceneObjects() internal void ServerSpawnSceneObjectsOnStartSweep() { - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); var networkObjectsToSpawn = new List(); for (int i = 0; i < networkObjects.Length; i++) { diff --git a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef index fdc763b83a..f7c369f525 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -90,7 +90,12 @@ }, { "name": "Unity", - "expression": "6000.4.0b5", + "expression": "[6000.4.0b5,6000.5.0a1)", + "define": "NGO_FINDOBJECTS_NOSORTING" + }, + { + "name": "Unity", + "expression": "6000.5.0a6", "define": "NGO_FINDOBJECTS_NOSORTING" } ], diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs index a74a29fa92..32abcfc96c 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs @@ -278,7 +278,7 @@ private void SpawnClients(bool clearTestDeferredMessageManagerCallFlags = true) private T GetComponentForClient(ulong clientId) where T : NetworkBehaviour { - var componentsToFind = FindObjects.FindObjectsByType(); + var componentsToFind = FindObjects.ByType(); foreach (var component in componentsToFind) { if (component.IsSpawned && component.NetworkManager.LocalClientId == clientId) @@ -756,7 +756,7 @@ bool HaveAllClientsSpawned() { var found1 = false; var found2 = false; - var deferredMessageTestRpcComponents = FindObjects.FindObjectsByType(); + var deferredMessageTestRpcComponents = FindObjects.ByType(); foreach (var component in deferredMessageTestRpcComponents) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs b/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs index f699aae230..f9cad43c62 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/IntegrationTestExamples.cs @@ -29,7 +29,7 @@ public IEnumerator MyFirstIntegationTest() { // Check the condition for this test and automatically handle varying processing // environments and conditions - yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == 2); + yield return WaitForConditionOrTimeOut(() => FindObjects.ByType().Where((c) => c.IsSpawned).Count() == 2); Assert.False(s_GlobalTimeoutHelper.TimedOut, "Timed out waiting for instances " + "to be detected!"); } @@ -61,7 +61,7 @@ public IEnumerator MyFirstIntegationTest() { // Check the condition for this test and automatically handle varying processing // environments and conditions - yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == 2); + yield return WaitForConditionOrTimeOut(() => FindObjects.ByType().Where((c) => c.IsSpawned).Count() == 2); Assert.False(s_GlobalTimeoutHelper.TimedOut, "Timed out waiting for instances " + "to be detected!"); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs index 6a9de8d4d7..3fca981e4c 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs @@ -75,7 +75,7 @@ public IEnumerator WhenOwnershipIsChanged_OwnershipValuesUpdateCorrectly() Assert.IsFalse(serverBehaviour.IsOwnedByServer); Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, serverBehaviour.OwnerClientId); - var clientObject = FindObjects.FindObjectsByType().Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); + var clientObject = FindObjects.ByType().Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); Assert.IsNotNull(clientObject); Assert.IsTrue(clientObject.IsOwner); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs index 76a84a480d..61024d46da 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransformAnticipationTests.cs @@ -89,7 +89,7 @@ public AnticipatedNetworkTransform GetTestComponent() public AnticipatedNetworkTransform GetServerComponent() { - var anticipatedNetworkTransforms = FindObjects.FindObjectsByType(); + var anticipatedNetworkTransforms = FindObjects.ByType(); foreach (var obj in anticipatedNetworkTransforms) { if (obj.NetworkManager == m_ServerNetworkManager && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) @@ -103,7 +103,7 @@ public AnticipatedNetworkTransform GetServerComponent() public AnticipatedNetworkTransform GetOtherClientComponent() { - var anticipatedNetworkTransforms = FindObjects.FindObjectsByType(); + var anticipatedNetworkTransforms = FindObjects.ByType(); foreach (var obj in anticipatedNetworkTransforms) { if (obj.NetworkManager == m_ClientNetworkManagers[1] && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs index 251947aae9..09d37cb64a 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs @@ -78,7 +78,7 @@ public NetworkVariableAnticipationComponent GetTestComponent() public NetworkVariableAnticipationComponent GetServerComponent() { - var objects = FindObjects.FindObjectsByType(); + var objects = FindObjects.ByType(); foreach (var obj in objects) { if (obj.NetworkManager == m_ServerNetworkManager && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) @@ -92,7 +92,7 @@ public NetworkVariableAnticipationComponent GetServerComponent() public NetworkVariableAnticipationComponent GetOtherClientComponent() { - var objects = FindObjects.FindObjectsByType(); + var objects = FindObjects.ByType(); foreach (var obj in objects) { if (obj.NetworkManager == m_ClientNetworkManagers[1] && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs index b2690399c8..44f354b17b 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVisibilityTests.cs @@ -49,21 +49,21 @@ protected override IEnumerator OnServerAndClientsConnected() [UnityTest] public IEnumerator HiddenObjectsTest() { - yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == TotalClients); - AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}!Actual count {FindObjects.FindObjectsByType().Count(c => c.IsSpawned)}"); + yield return WaitForConditionOrTimeOut(() => FindObjects.ByType().Where((c) => c.IsSpawned).Count() == TotalClients); + AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}!Actual count {FindObjects.ByType().Count(c => c.IsSpawned)}"); } [UnityTest] public IEnumerator HideShowAndDeleteTest() { - yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Count(c => c.IsSpawned) == TotalClients); + yield return WaitForConditionOrTimeOut(() => FindObjects.ByType().Count(c => c.IsSpawned) == TotalClients); - AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}! Actual count {FindObjects.FindObjectsByType().Count(c => c.IsSpawned)}"); + AssertOnTimeout($"Timed out waiting for the visible object count to equal {TotalClients}! Actual count {FindObjects.ByType().Count(c => c.IsSpawned)}"); var sessionOwnerNetworkObject = m_SpawnedObject.GetComponent(); var nonAuthority = GetNonAuthorityNetworkManager(); sessionOwnerNetworkObject.NetworkHide(nonAuthority.LocalClientId); - yield return WaitForConditionOrTimeOut(() => FindObjects.FindObjectsByType().Where((c) => c.IsSpawned).Count() == TotalClients - 1); + yield return WaitForConditionOrTimeOut(() => FindObjects.ByType().Where((c) => c.IsSpawned).Count() == TotalClients - 1); AssertOnTimeout($"Timed out waiting for {m_SpawnedObject.name} to be hidden from client!"); var networkObjectId = sessionOwnerNetworkObject.NetworkObjectId; sessionOwnerNetworkObject.NetworkShow(nonAuthority.LocalClientId); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs index a0c610d591..baab984b82 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/AddNetworkPrefabTests.cs @@ -45,7 +45,7 @@ protected override void OnServerAndClientsCreated() private EmptyComponent GetObjectForClient(ulong clientId) { - var emptyComponents = FindObjects.FindObjectsByType(); + var emptyComponents = FindObjects.ByType(); foreach (var component in emptyComponents) { if (component.IsSpawned && component.NetworkManager.LocalClientId == clientId) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs index ec20e6b2f8..7e11d67998 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs @@ -198,7 +198,7 @@ public void TearDown() { //Stop, shutdown, and destroy NetworkManagerHelper.ShutdownNetworkManager(); - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); var networkObjectsList = networkObjects.Where(c => c.name.Contains(k_PrefabObjectName)); foreach (var networkObject in networkObjectsList) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs index 3edb8030e2..a0c17aab7d 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Rpc/UniversalRpcTests.cs @@ -585,7 +585,7 @@ protected override void OnInlineTearDown() protected void Clear() { - var objects = FindObjects.FindObjectsByType(); + var objects = FindObjects.ByType(); foreach (var obj in objects) { obj.Received = string.Empty; @@ -610,7 +610,7 @@ protected UniversalRpcNetworkBehaviour LegacyGetPlayerObject(ulong ownerClientId { if (ownerClientId == NetworkManager.ServerClientId && !m_ServerNetworkManager.IsHost) { - var objects = FindObjects.FindObjectsByType(); + var objects = FindObjects.ByType(); foreach (var obj in objects) { if (obj.name.StartsWith("Server Object") && obj.OwnerClientId == ownerClientId && obj.NetworkManager.LocalClientId == onClient) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs index 797701aa4d..b2e096e63c 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs @@ -159,7 +159,7 @@ private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode loadScen private static void ProcessInSceneObjects(Scene scene, NetworkManager networkManager) { // Get all in-scene placed NeworkObjects that were instantiated when this scene loaded - var inSceneNetworkObjects = FindObjects.FindObjectsByType().Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); + var inSceneNetworkObjects = FindObjects.ByType().Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); foreach (var sobj in inSceneNetworkObjects) { ProcessInSceneObject(sobj, networkManager); @@ -708,7 +708,7 @@ public void MoveObjectsFromSceneToDontDestroyOnLoad(ref NetworkManager networkMa { // Create a local copy of the spawned objects list since the spawn manager will adjust the list as objects // are despawned. - var networkObjects = FindObjects.FindObjectsByType().Where((c) => c.IsSpawned); + var networkObjects = FindObjects.ByType().Where((c) => c.IsSpawned); var distributedAuthority = networkManager.DistributedAuthorityMode; foreach (var networkObject in networkObjects) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index 06bc640101..9e439ba098 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -1167,7 +1167,7 @@ private void ClientNetworkManagerPostStart(NetworkManager networkManager) } // Get all player instances for the current client NetworkManager instance - var clientPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == networkManager.LocalClientId).ToList(); + var clientPlayerClones = FindObjects.ByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == networkManager.LocalClientId).ToList(); // Add this player instance to each client player entry foreach (var playerNetworkObject in clientPlayerClones) { @@ -1183,7 +1183,7 @@ private void ClientNetworkManagerPostStart(NetworkManager networkManager) } } // For late joining clients, add the remaining (if any) cloned versions of each client's player - clientPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.NetworkManager == networkManager).ToList(); + clientPlayerClones = FindObjects.ByType().Where((c) => c.IsPlayerObject && c.NetworkManager == networkManager).ToList(); foreach (var playerNetworkObject in clientPlayerClones) { if (!m_PlayerNetworkObjects[networkManager.LocalClientId].ContainsKey(playerNetworkObject.OwnerClientId)) @@ -1207,7 +1207,7 @@ protected void ClientNetworkManagerPostStartInit() if (m_UseHost) { - var clientSideServerPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == NetworkManager.ServerClientId); + var clientSideServerPlayerClones = FindObjects.ByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == NetworkManager.ServerClientId); foreach (var playerNetworkObject in clientSideServerPlayerClones) { // When the server is not the host this needs to be done @@ -1316,7 +1316,7 @@ protected IEnumerator StartServerAndClients() if (m_UseHost || authorityManager.IsHost) { // Add the server player instance to all m_ClientSidePlayerNetworkObjects entries - var serverPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); + var serverPlayerClones = FindObjects.ByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); foreach (var playerNetworkObject in serverPlayerClones) { if (!m_PlayerNetworkObjects.ContainsKey(playerNetworkObject.NetworkManager.LocalClientId)) @@ -1404,7 +1404,7 @@ protected void StartServerAndClientsWithTimeTravel() if (m_UseHost || authorityManager.IsHost) { - var serverPlayerClones = FindObjects.FindObjectsByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); + var serverPlayerClones = FindObjects.ByType().Where((c) => c.IsPlayerObject && c.OwnerClientId == authorityManager.LocalClientId); foreach (var playerNetworkObject in serverPlayerClones) { if (!m_PlayerNetworkObjects.ContainsKey(playerNetworkObject.NetworkManager.LocalClientId)) @@ -1658,7 +1658,7 @@ public IEnumerator TearDown() /// private void DestroyNetworkManagers() { - var networkManagers = FindObjects.FindObjectsByType(); + var networkManagers = FindObjects.ByType(); foreach (var networkManager in networkManagers) { Object.DestroyImmediate(networkManager.gameObject); @@ -1727,7 +1727,7 @@ protected virtual bool CanDestroyNetworkObject(NetworkObject networkObject) /// protected void DestroySceneNetworkObjects() { - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); foreach (var networkObject in networkObjects) { // This can sometimes be null depending upon order of operations @@ -2633,7 +2633,7 @@ public static void SimulateOneFrame() if (!string.IsNullOrEmpty(methodName)) { - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); foreach (var obj in networkObjects) { var method = obj.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); diff --git a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef index 45a7cd9a12..855d5b8860 100644 --- a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef +++ b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef @@ -11,7 +11,12 @@ "versionDefines": [ { "name": "Unity", - "expression": "6000.4.0b5", + "expression": "[6000.4.0b5,6000.5.0a1)", + "define": "NGO_FINDOBJECTS_NOSORTING" + }, + { + "name": "Unity", + "expression": "6000.5.0a6", "define": "NGO_FINDOBJECTS_NOSORTING" } ], diff --git a/testproject/Assets/Tests/Runtime/AddressablesTests.cs b/testproject/Assets/Tests/Runtime/AddressablesTests.cs index 4e04c1e5fd..4c9151c0f3 100644 --- a/testproject/Assets/Tests/Runtime/AddressablesTests.cs +++ b/testproject/Assets/Tests/Runtime/AddressablesTests.cs @@ -76,7 +76,7 @@ private void SpawnAndValidate(GameObject prefab, bool waitAndAddOnClient = false var serverObj = Object.Instantiate(prefab); serverObj.GetComponent().NetworkManagerOwner = m_ServerNetworkManager; serverObj.GetComponent().Spawn(); - var objs = FindObjects.FindObjectsByType(); + var objs = FindObjects.ByType(); // Prefabs loaded by addressables actually don't show up in this search. // Unlike other tests that make prefabs programmatically, those aren't added to the scene until they're instantiated @@ -90,7 +90,7 @@ private void SpawnAndValidate(GameObject prefab, bool waitAndAddOnClient = false { // Since it's not added, after the CreateObjectMessage is received, it's not spawned yet // Verify that to be the case as a precondition. - objs = FindObjects.FindObjectsByType(); + objs = FindObjects.ByType(); Assert.AreEqual(1, objs.Length); WaitForConditionOrTimeOutWithTimeTravel(() => MockTimeProvider.StaticRealTimeSinceStartup - startTime >= m_ClientNetworkManagers[0].NetworkConfig.SpawnTimeout - 0.25); foreach (var client in m_ClientNetworkManagers) @@ -99,7 +99,7 @@ private void SpawnAndValidate(GameObject prefab, bool waitAndAddOnClient = false } } - objs = FindObjects.FindObjectsByType(); + objs = FindObjects.ByType(); Assert.AreEqual(NumberOfClients + 1, objs.Length); foreach (var obj in objs) { diff --git a/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs b/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs index 92a932e53d..1a54eefa90 100644 --- a/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs +++ b/testproject/Assets/Tests/Runtime/NetworkVariableInitializationOnNetworkSpawnTest.cs @@ -97,7 +97,7 @@ private IEnumerator RunTest() const int expectedNetworkObjects = numClients + 2; // +2 = one for prefab, one for server. const int maxFrames = 240; var doubleCheckTime = Time.realtimeSinceStartup + 5.0f; - var networkObjects = FindObjects.FindObjectsByType(); + var networkObjects = FindObjects.ByType(); while (networkObjects.Length != expectedNetworkObjects) { @@ -113,7 +113,7 @@ private IEnumerator RunTest() } var nextFrameNumber = Time.frameCount + 1; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); - networkObjects = FindObjects.FindObjectsByType(); + networkObjects = FindObjects.ByType(); } serverObject.GetComponent().Variable.Value = NetworkVariableInitOnNetworkSpawn.ExpectedSpawnValueOnClient; diff --git a/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs b/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs index bbd7c176e6..f82b7ed400 100644 --- a/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs +++ b/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs @@ -31,7 +31,7 @@ public IEnumerator SceneObjectsNotDestroyedOnShutdown() yield return WaitForConditionOrTimeOut(() => m_TestScene.IsValid() && m_TestScene.isLoaded); AssertOnTimeout($"Timed out waiting for scene {k_TestScene} to load!"); - var loadedInSceneObject = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); + var loadedInSceneObject = FindObjects.ByType().Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); Assert.IsNotNull(loadedInSceneObject, $"Failed to find {k_SceneObjectName} before starting client!"); AssertOnTimeout($"Timed out waiting to find {k_SceneObjectName} after scene load and before starting client!\""); @@ -39,11 +39,11 @@ public IEnumerator SceneObjectsNotDestroyedOnShutdown() var lateJoin = CreateNewClient(); yield return StartClient(lateJoin); - var loadedInSceneObjects = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)); + var loadedInSceneObjects = FindObjects.ByType().Where((c) => c.name.Contains(k_SceneObjectName)); Assert.IsTrue(loadedInSceneObjects.Count() > 1, $"Only found one instance of {k_SceneObjectName} after client connected!"); lateJoin.Shutdown(); yield return m_DefaultWaitForTick; - loadedInSceneObjects = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)); + loadedInSceneObjects = FindObjects.ByType().Where((c) => c.name.Contains(k_SceneObjectName)); Assert.IsTrue(loadedInSceneObjects.Count() > 1, $"Only found one instance of {k_SceneObjectName} after client shutdown!"); } @@ -58,7 +58,7 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown() yield return WaitForConditionOrTimeOut(() => m_TestScene.IsValid() && m_TestScene.isLoaded); AssertOnTimeout($"Timed out waiting for scene {k_TestScene} to load!"); - var loadedInSceneObject = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); + var loadedInSceneObject = FindObjects.ByType().Where((c) => c.name.Contains(k_SceneObjectName)).FirstOrDefault(); Assert.IsNotNull(loadedInSceneObject, $"Failed to find {k_SceneObjectName} before starting client!"); var lateJoin = CreateNewClient(); @@ -70,7 +70,7 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown() yield return WaitForConditionOrTimeOut(() => PlayerHasChildren(clientId)); AssertOnTimeout($"Client-{clientId} player never parented {k_SceneObjectName}!"); - var loadedInSceneObjects = FindObjects.FindObjectsByType().Where((c) => c.name.Contains(k_SceneObjectName)); + var loadedInSceneObjects = FindObjects.ByType().Where((c) => c.name.Contains(k_SceneObjectName)); Assert.IsTrue(loadedInSceneObjects.Count() > 1, $"Only found one instance of {k_SceneObjectName} after client connected!"); lateJoin.Shutdown(); yield return m_DefaultWaitForTick; @@ -79,7 +79,7 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown() yield return WaitForConditionOrTimeOut(() => PlayerNoLongerExistsWithChildren(clientId)); AssertOnTimeout($"Client-{clientId} player still exits with children after client shutdown!"); - loadedInSceneObjects = FindObjects.FindObjectsByType().Where(o => o.name.Contains(k_SceneObjectName)).ToArray(); + loadedInSceneObjects = FindObjects.ByType().Where(o => o.name.Contains(k_SceneObjectName)).ToArray(); // Make sure any in-scene placed NetworkObject instantiated has no parent foreach (var inSceneObject in loadedInSceneObjects) { From 1f7e70c391696dcb93bb591a1ca24f45a6efb6a2 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 27 Jan 2026 19:19:21 -0600 Subject: [PATCH 09/14] update Adding sort by identifier to two locations that require sorting by identifier. --- .../Runtime/Spawning/NetworkSpawnManager.cs | 4 ++-- .../NetworkObjectNetworkClientOwnedObjectsTests.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index e9aaf2cafe..1262b5fa45 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1369,7 +1369,7 @@ internal void DespawnObject(NetworkObject networkObject, bool destroyObject = fa // Makes scene objects ready to be reused internal void ServerResetShudownStateForSceneObjects() { - var networkObjects = FindObjects.ByType().Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); + var networkObjects = FindObjects.ByType(orderByIdentifier: true).Where((c) => c.IsSceneObject != null && c.IsSceneObject == true); foreach (var sobj in networkObjects) { sobj.IsSpawned = false; @@ -1400,7 +1400,7 @@ internal void ServerDestroySpawnedSceneObjects() internal void DespawnAndDestroyNetworkObjects() { - var networkObjects = FindObjects.ByType(); + var networkObjects = FindObjects.ByType(orderByIdentifier:true); foreach (var networkObject in networkObjects) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs index 3fca981e4c..279b4896ef 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectNetworkClientOwnedObjectsTests.cs @@ -75,7 +75,7 @@ public IEnumerator WhenOwnershipIsChanged_OwnershipValuesUpdateCorrectly() Assert.IsFalse(serverBehaviour.IsOwnedByServer); Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, serverBehaviour.OwnerClientId); - var clientObject = FindObjects.ByType().Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); + var clientObject = FindObjects.ByType(orderByIdentifier: true).Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault(); Assert.IsNotNull(clientObject); Assert.IsTrue(clientObject.IsOwner); From 01dd8c07910e9d0574b01842a529848974b5afa3 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 27 Jan 2026 20:59:32 -0600 Subject: [PATCH 10/14] style Added missing whitespace --- .../Runtime/Spawning/NetworkSpawnManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 1262b5fa45..d23a344647 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1400,7 +1400,7 @@ internal void ServerDestroySpawnedSceneObjects() internal void DespawnAndDestroyNetworkObjects() { - var networkObjects = FindObjects.ByType(orderByIdentifier:true); + var networkObjects = FindObjects.ByType(orderByIdentifier: true); foreach (var networkObject in networkObjects) { From b53de7afc9bf0509d70c76ad2263a0f2d2720425 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 27 Jan 2026 23:50:44 -0600 Subject: [PATCH 11/14] update increasing the 6000.5 version from 5.0a6 to 5.0a7 as it appears trunk is currently 5.0a6 (which doesn't have the deprecation merged into it yet). --- .../Runtime/Unity.Netcode.Runtime.asmdef | 2 +- testproject/Assets/Tests/Manual/testproject.manualtests.asmdef | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef index f7c369f525..c04d2a6fd4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -95,7 +95,7 @@ }, { "name": "Unity", - "expression": "6000.5.0a6", + "expression": "6000.5.0a7", "define": "NGO_FINDOBJECTS_NOSORTING" } ], diff --git a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef index 855d5b8860..201cfdcbd8 100644 --- a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef +++ b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef @@ -16,7 +16,7 @@ }, { "name": "Unity", - "expression": "6000.5.0a6", + "expression": "6000.5.0a7", "define": "NGO_FINDOBJECTS_NOSORTING" } ], From 1a5bb4a71dd20519d8659b143e345986742c2be7 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 28 Jan 2026 05:05:50 -0600 Subject: [PATCH 12/14] update updating minimum for deprecated fix to 6000.5.0a8. --- .../Runtime/Unity.Netcode.Runtime.asmdef | 2 +- testproject/Assets/Tests/Manual/testproject.manualtests.asmdef | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef index c04d2a6fd4..e0c0185c95 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -95,7 +95,7 @@ }, { "name": "Unity", - "expression": "6000.5.0a7", + "expression": "6000.5.0a8", "define": "NGO_FINDOBJECTS_NOSORTING" } ], diff --git a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef index 201cfdcbd8..8e8724f3e6 100644 --- a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef +++ b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef @@ -16,7 +16,7 @@ }, { "name": "Unity", - "expression": "6000.5.0a7", + "expression": "6000.5.0a8", "define": "NGO_FINDOBJECTS_NOSORTING" } ], From f5f5cf255166ed670ec088f2a38b1b4198ca9f16 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 28 Jan 2026 14:32:54 -0600 Subject: [PATCH 13/14] update This "should" fix the Rust server issue... I think? (Tested local instance on 6000.5.0a7 and it passes everything) --- .../Runtime/SceneManagement/SceneEventData.cs | 2 +- .../Runtime/Spawning/NetworkSpawnManager.cs | 4 ++-- .../Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 26967c3928..fd3424a79e 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -912,7 +912,7 @@ internal void ReadClientReSynchronizationData(FastBufferReader reader) if (networkObjectsToRemove.Length > 0) { - var networkObjects = FindObjects.ByType(); + var networkObjects = FindObjects.ByType(orderByIdentifier: true); var networkObjectIdToNetworkObject = new Dictionary(); foreach (var networkObject in networkObjects) { diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index d23a344647..987db29d93 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1455,7 +1455,7 @@ internal void DespawnAndDestroyNetworkObjects() internal void DestroySceneObjects() { - var networkObjects = FindObjects.ByType(); + var networkObjects = FindObjects.ByType(orderByIdentifier: true); for (int i = 0; i < networkObjects.Length; i++) { @@ -1486,7 +1486,7 @@ internal void DestroySceneObjects() internal void ServerSpawnSceneObjectsOnStartSweep() { - var networkObjects = FindObjects.ByType(); + var networkObjects = FindObjects.ByType(orderByIdentifier: true); var networkObjectsToSpawn = new List(); for (int i = 0; i < networkObjects.Length; i++) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs index b2e096e63c..e1959de8a0 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/IntegrationTestSceneHandler.cs @@ -159,7 +159,7 @@ private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode loadScen private static void ProcessInSceneObjects(Scene scene, NetworkManager networkManager) { // Get all in-scene placed NeworkObjects that were instantiated when this scene loaded - var inSceneNetworkObjects = FindObjects.ByType().Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); + var inSceneNetworkObjects = FindObjects.ByType(orderByIdentifier: true).Where((c) => c.IsSceneObject != false && c.GetSceneOriginHandle() == scene.handle); foreach (var sobj in inSceneNetworkObjects) { ProcessInSceneObject(sobj, networkManager); @@ -708,7 +708,7 @@ public void MoveObjectsFromSceneToDontDestroyOnLoad(ref NetworkManager networkMa { // Create a local copy of the spawned objects list since the spawn manager will adjust the list as objects // are despawned. - var networkObjects = FindObjects.ByType().Where((c) => c.IsSpawned); + var networkObjects = FindObjects.ByType(orderByIdentifier: true).Where((c) => c.IsSpawned); var distributedAuthority = networkManager.DistributedAuthorityMode; foreach (var networkObject in networkObjects) { From 5b4f42d97ab583961542ffbdc3faea2171eeb38c Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 28 Jan 2026 15:51:21 -0600 Subject: [PATCH 14/14] update adding change log entry --- 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 5ce566967d..c614a2c4b3 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -15,6 +15,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Changed +- Updating usage of deprecated FindObjectsByType(FindObjectsSortMode) and enum FindObjectSortMode in 6000.4 and 6000.5. (#3857) - Ensure logs in `NetworkObject` log the `NetworkObject.name` wherever possible. (#3831) - Improved performance of NetworkBehaviour ILPostProcessor by omitting unnecessary type and assembly resolutions. (#3827) - Improve performance of `NetworkObject`. (#3820, #3831)