diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 38656d18cd..b8064a583e 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) 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..849afe1b88 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Core/FindObjects.cs @@ -0,0 +1,41 @@ +#if NGO_FINDOBJECTS_NOSORTING +using System; +#endif +using System.Runtime.CompilerServices; +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[] 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(inactive); + if (orderByIdentifier) + { + Array.Sort(results, (a, b) => a.GetEntityId().CompareTo(b.GetEntityId())); + } +#else + var results = Object.FindObjectsByType(inactive, orderByIdentifier ? UnityEngine.FindObjectsSortMode.InstanceID : UnityEngine.FindObjectsSortMode.None); +#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..0e75f0c92f 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.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 165a70fa33..fd3424a79e 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.ByType(true, true).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.ByType(orderByIdentifier: true); 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.ByType(true, true).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 38b21350dd..987db29d93 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.ByType(orderByIdentifier: true).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.ByType(orderByIdentifier: true); foreach (var networkObject in networkObjects) { @@ -1463,11 +1455,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.ByType(orderByIdentifier: true); for (int i = 0; i < networkObjects.Length; i++) { @@ -1498,11 +1486,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.ByType(orderByIdentifier: true); 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..e0c0185c95 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -87,6 +87,16 @@ "name": "Unity", "expression": "6000.5.0a1", "define": "SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG" + }, + { + "name": "Unity", + "expression": "[6000.4.0b5,6000.5.0a1)", + "define": "NGO_FINDOBJECTS_NOSORTING" + }, + { + "name": "Unity", + "expression": "6000.5.0a8", + "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..32abcfc96c 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.ByType(); 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.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 0318e79433..f9cad43c62 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.ByType().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.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 d9b0521e56..279b4896ef 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.ByType(orderByIdentifier: true).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..61024d46da 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.ByType(); + 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.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 66d2d8d90f..09d37cb64a 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableAnticipationTests.cs @@ -3,7 +3,6 @@ using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; -using Object = UnityEngine.Object; namespace Unity.Netcode.RuntimeTests { @@ -79,7 +78,8 @@ public NetworkVariableAnticipationComponent GetTestComponent() public NetworkVariableAnticipationComponent GetServerComponent() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var objects = FindObjects.ByType(); + foreach (var obj in objects) { if (obj.NetworkManager == m_ServerNetworkManager && obj.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId) { @@ -92,7 +92,8 @@ public NetworkVariableAnticipationComponent GetServerComponent() public NetworkVariableAnticipationComponent GetOtherClientComponent() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + 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/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..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(() => 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.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(() => Object.FindObjectsByType(FindObjectsSortMode.None).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 {Object.FindObjectsByType(FindObjectsSortMode.None).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(() => Object.FindObjectsByType(FindObjectsSortMode.None).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 4627143c22..baab984b82 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.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 34b98001ca..7e11d67998 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs @@ -198,13 +198,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.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 e7073a8f80..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,8 @@ protected override void OnInlineTearDown() protected void Clear() { - foreach (var obj in Object.FindObjectsByType(FindObjectsSortMode.None)) + var objects = FindObjects.ByType(); + 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.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 7786dba6c2..e1959de8a0 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.ByType(orderByIdentifier: true).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.ByType(orderByIdentifier: true).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..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 = Object.FindObjectsByType(FindObjectsSortMode.None).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 = Object.FindObjectsByType(FindObjectsSortMode.None).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 = Object.FindObjectsByType(FindObjectsSortMode.None).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 = Object.FindObjectsByType(FindObjectsSortMode.None).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,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.ByType().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.ByType(); 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.ByType(); 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.ByType(); + 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..24f52d6df4 100644 --- a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs +++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs @@ -1,28 +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_2023_1_OR_NEWER - var networkManagerInstances = FindObjectsByType(FindObjectsSortMode.InstanceID); + // 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(); + 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 cd8a832954..7821d2af27 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs @@ -348,12 +348,13 @@ private void ShowHideObjectIdLabelClientRpc(bool isVisible) { m_LabelEnabled = isVisible; NetworkObjectLabel.GlobalVisibility = m_LabelEnabled; -#if UNITY_2023_1_OR_NEWER - var labels = FindObjectsByType(FindObjectsSortMode.InstanceID); +#if NGO_FINDOBJECTS_NOSORTING + var labels = FindObjectsByType(); +#elif UNITY_2023_1_OR_NEWER + var labels = FindObjectsByType(FindObjectsSortMode.None); #else var labels = FindObjectsOfType(); #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..8e8724f3e6 100644 --- a/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef +++ b/testproject/Assets/Tests/Manual/testproject.manualtests.asmdef @@ -7,5 +7,18 @@ "Unity.Netcode.Components", "Unity.Collections", "Unity.Mathematics" - ] -} + ], + "versionDefines": [ + { + "name": "Unity", + "expression": "[6000.4.0b5,6000.5.0a1)", + "define": "NGO_FINDOBJECTS_NOSORTING" + }, + { + "name": "Unity", + "expression": "6000.5.0a8", + "define": "NGO_FINDOBJECTS_NOSORTING" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/testproject/Assets/Tests/Runtime/AddressablesTests.cs b/testproject/Assets/Tests/Runtime/AddressablesTests.cs index 0cab9cff2b..4c9151c0f3 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.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 @@ -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.ByType(); 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.ByType(); 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..1a54eefa90 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.ByType(); 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.ByType(); } serverObject.GetComponent().Variable.Value = NetworkVariableInitOnNetworkSpawn.ExpectedSpawnValueOnClient; diff --git a/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs b/testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs index 5e393d143f..f82b7ed400 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.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!\""); @@ -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.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 = Object.FindObjectsByType(FindObjectsSortMode.InstanceID).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!"); } @@ -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.ByType().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.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; @@ -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.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) {