From a8e65ea624d9080ae740867d7c4dc82cb93680bb Mon Sep 17 00:00:00 2001 From: Marcus Winter Date: Wed, 12 Feb 2025 17:55:41 +0100 Subject: [PATCH 1/3] fix logic to get active platform settings object to work with build profiles --- .../Settings/EditorPlayerSettingHelpers.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs index 2ba6b50711..ffb782887f 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs @@ -3,6 +3,11 @@ using System.Linq; using UnityEditor; +#if UNITY_6000_0_OR_NEWER +using System.Reflection; +using UnityEditor.Build.Profile; +#endif + namespace UnityEngine.InputSystem.Editor { internal static class EditorPlayerSettingHelpers @@ -154,7 +159,23 @@ private static int TupleToActiveInputHandler((bool newSystemEnabled, bool oldSys private static SerializedProperty GetPropertyOrNull(string name) { +#if UNITY_6000_0_OR_NEWER + // HOTFIX: the code below works around an issue causing an infinite reimport loop + // this will be replaced by a call to an API in the editor instead of using reflection once it is available + var buildProfileType = typeof(BuildProfile); + var globalPlayerSettingsField = buildProfileType.GetField("s_GlobalPlayerSettings", BindingFlags.Static | BindingFlags.NonPublic); + var playerSettings = (PlayerSettings)globalPlayerSettingsField.GetValue(null); + var activeBuildProfile = BuildProfile.GetActiveBuildProfile(); + if (activeBuildProfile != null) + { + var playerSettingsOverrideField = buildProfileType.GetField("m_PlayerSettings", BindingFlags.Instance | BindingFlags.NonPublic); + var playerSettingsOverride = (PlayerSettings)playerSettingsOverrideField.GetValue(activeBuildProfile); + if (playerSettingsOverride != null) + playerSettings = playerSettingsOverride; + } +#else var playerSettings = Resources.FindObjectsOfTypeAll().FirstOrDefault(); +#endif if (playerSettings == null) return null; var playerSettingsObject = new SerializedObject(playerSettings); From 53e270b6bc52daf34d8dda2771e0e326f2c90782 Mon Sep 17 00:00:00 2001 From: Marcus Winter Date: Thu, 13 Feb 2025 13:29:15 +0100 Subject: [PATCH 2/3] add changelog entry --- Packages/com.unity.inputsystem/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index 10d6a60fa3..f75369861c 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -11,6 +11,7 @@ however, it has to be formatted properly to pass verification tests. ## [Unreleased] - yyyy-mm-dd ### Fixed +- Fixed a problem with the logic to get the active player settings object that cause an infinit reimport loop. [ISXB-1430](https://jira.unity3d.com/browse/ISXB-1430) - Fixed an issue where removing a newly created action in the Asset Editor would cause an exception. [UUM-95693](https://issuetracker.unity3d.com/product/unity/issues/guid/UUM-95693) - Fixed arrow key navigation of Input Actions after Action rename. [ISXB-1024](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-1024) - Fixed gamepad navigation in UI Toolkit TextField when using InputSystemUIInputModule. [UUM-77364](https://issuetracker.unity3d.com/product/unity/issues/guid/UUM-77364) From fe8ccd66d3b22ff6650c33308f3683898e919d21 Mon Sep 17 00:00:00 2001 From: Marcus Winter Date: Thu, 13 Feb 2025 16:20:29 +0100 Subject: [PATCH 3/3] add error logs in case the private fields are no longer there --- .../Editor/Settings/EditorPlayerSettingHelpers.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs index ffb782887f..dc45b3f4c6 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/EditorPlayerSettingHelpers.cs @@ -164,11 +164,21 @@ private static SerializedProperty GetPropertyOrNull(string name) // this will be replaced by a call to an API in the editor instead of using reflection once it is available var buildProfileType = typeof(BuildProfile); var globalPlayerSettingsField = buildProfileType.GetField("s_GlobalPlayerSettings", BindingFlags.Static | BindingFlags.NonPublic); + if (globalPlayerSettingsField == null) + { + Debug.LogError($"Could not find global player settings field in build profile when trying to get property {name}. Please try to update the Input System package."); + return null; + } var playerSettings = (PlayerSettings)globalPlayerSettingsField.GetValue(null); var activeBuildProfile = BuildProfile.GetActiveBuildProfile(); if (activeBuildProfile != null) { var playerSettingsOverrideField = buildProfileType.GetField("m_PlayerSettings", BindingFlags.Instance | BindingFlags.NonPublic); + if (playerSettingsOverrideField == null) + { + Debug.LogError($"Could not find player settings override field in build profile when trying to get property {name}. Please try to update the Input System package."); + return null; + } var playerSettingsOverride = (PlayerSettings)playerSettingsOverrideField.GetValue(activeBuildProfile); if (playerSettingsOverride != null) playerSettings = playerSettingsOverride;