From 99f82342f09506d3b67d08c7f7d8da2d4eeca19b Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:27:52 +0100 Subject: [PATCH 01/12] Update InputSettingsProvider.cs --- .../Editor/Settings/InputSettingsProvider.cs | 232 ++++++++++++++++-- 1 file changed, 218 insertions(+), 14 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 1ac676a022..5980590181 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -54,13 +54,16 @@ private InputSettingsProvider(string path, SettingsScope scopes) public override void OnActivate(string searchContext, VisualElement rootElement) { base.OnActivate(searchContext, rootElement); + m_RootElement = rootElement; InputSystem.onSettingsChange += OnSettingsChange; Undo.undoRedoPerformed += OnUndoRedo; + BuildUI(); } public override void OnDeactivate() { base.OnDeactivate(); + m_RootElement = null; InputSystem.onSettingsChange -= OnSettingsChange; Undo.undoRedoPerformed -= OnUndoRedo; } @@ -89,6 +92,14 @@ public override void OnTitleBarGUI() } public override void OnGUI(string searchContext) + { + if (m_RootElement != null) + return; + + DrawSettingsGUI(includeUIToolkitHeader: false); + } + + private void DrawSettingsGUI(bool includeUIToolkitHeader) { InitializeWithCurrentSettingsIfNecessary(); @@ -112,22 +123,25 @@ public override void OnGUI(string searchContext) EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(m_UpdateMode, m_UpdateModeContent); - if (InputSystem.settings?.updateMode == InputSettings.UpdateMode.ProcessEventsManually) - CustomUpdateModeHelpBox(); + if (!includeUIToolkitHeader) + { + EditorGUILayout.PropertyField(m_UpdateMode, m_UpdateModeContent); + if (InputSystem.settings?.updateMode == InputSettings.UpdateMode.ProcessEventsManually) + CustomUpdateModeHelpBox(); - var runInBackground = Application.runInBackground; - using (new EditorGUI.DisabledScope(!runInBackground)) - EditorGUILayout.PropertyField(m_BackgroundBehavior, m_BackgroundBehaviorContent); - if (!runInBackground) - EditorGUILayout.HelpBox("Focus change behavior can only be changed if 'Run In Background' is enabled in Player Settings.", MessageType.Info); + var runInBackground = Application.runInBackground; + using (new EditorGUI.DisabledScope(!runInBackground)) + EditorGUILayout.PropertyField(m_BackgroundBehavior, m_BackgroundBehaviorContent); + if (!runInBackground) + EditorGUILayout.HelpBox("Focus change behavior can only be changed if 'Run In Background' is enabled in Player Settings.", MessageType.Info); #if UNITY_INPUT_SYSTEM_PLATFORM_SCROLL_DELTA - EditorGUILayout.PropertyField(m_ScrollDeltaBehavior, m_ScrollDeltaBehaviorContent); + EditorGUILayout.PropertyField(m_ScrollDeltaBehavior, m_ScrollDeltaBehaviorContent); #endif - EditorGUILayout.Space(); - EditorGUILayout.PropertyField(m_CompensateForScreenOrientation, m_CompensateForScreenOrientationContent); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(m_CompensateForScreenOrientation, m_CompensateForScreenOrientationContent); + } // NOTE: We do NOT make showing this one conditional on whether runInBackground is actually set in the // player settings as regardless of whether it's on or not, Unity will force it on in standalone @@ -186,22 +200,197 @@ public override void OnGUI(string searchContext) } } + private void BuildUI() + { + if (m_RootElement == null) + return; + + InitializeWithCurrentSettingsIfNecessary(); + m_RootElement.Clear(); + + var titleLabel = new Label("Input Settings"); + titleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; + titleLabel.style.fontSize = 19; + m_RootElement.Add(titleLabel); + + m_HeaderContainer = new VisualElement(); + m_RootElement.Add(m_HeaderContainer); + + m_UpdateModeDropdown = CreateEnumDropdown( + () => m_UpdateMode, + m_UpdateModeContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_UpdateModeDropdown); + + m_UpdateModeHelpContainer = new VisualElement(); + + m_UpdateModeHelpBox = new HelpBox( + "This is not recommended, the default update mode is dynamic update and should only be changed for compelling reasons. Please refer to the documentation.", + HelpBoxMessageType.Warning); + m_UpdateModeHelpContainer.Add(m_UpdateModeHelpBox); + + m_UpdateModeReadMoreButton = new Button(OpenUpdateModeDocumentation) + { + text = "Read more" + }; + m_UpdateModeHelpContainer.Add(m_UpdateModeReadMoreButton); + m_HeaderContainer.Add(m_UpdateModeHelpContainer); + + m_BackgroundBehaviorDropdown = CreateEnumDropdown( + () => m_BackgroundBehavior, + m_BackgroundBehaviorContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_BackgroundBehaviorDropdown); + + m_BackgroundBehaviorHelpBox = new HelpBox( + "Focus change behavior can only be changed if 'Run In Background' is enabled in Player Settings.", + HelpBoxMessageType.Info); + m_HeaderContainer.Add(m_BackgroundBehaviorHelpBox); + +#if UNITY_INPUT_SYSTEM_PLATFORM_SCROLL_DELTA + m_ScrollDeltaBehaviorDropdown = CreateEnumDropdown( + () => m_ScrollDeltaBehavior, + m_ScrollDeltaBehaviorContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_ScrollDeltaBehaviorDropdown); +#endif + + m_CompensateForScreenOrientationToggle = CreateToggle( + () => m_CompensateForScreenOrientation, + m_CompensateForScreenOrientationContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_CompensateForScreenOrientationToggle); + + m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); + m_RootElement.Add(m_IMGUIContainer); + + RefreshUIToolkitHeaderState(); + } + + private DropdownField CreateEnumDropdown(Func propertyAccessor, GUIContent content, Action onValueChanged) + { + var dropdown = new DropdownField(content.text) + { + tooltip = content.tooltip + }; + dropdown.RegisterValueChangedCallback(evt => + { + var property = propertyAccessor(); + if (property == null) + return; + + var newIndex = dropdown.choices?.IndexOf(evt.newValue) ?? -1; + if (newIndex == -1 || property.enumValueIndex == newIndex) + return; + + property.enumValueIndex = newIndex; + Apply(); + onValueChanged?.Invoke(); + }); + + return dropdown; + } + + private Toggle CreateToggle(Func propertyAccessor, GUIContent content, Action onValueChanged) + { + var toggle = new Toggle(content.text) + { + tooltip = content.tooltip + }; + toggle.RegisterValueChangedCallback(evt => + { + var property = propertyAccessor(); + if (property == null || property.boolValue == evt.newValue) + return; + + property.boolValue = evt.newValue; + Apply(); + onValueChanged?.Invoke(); + }); + + return toggle; + } + + private void RefreshUIToolkitHeaderState() + { + if (m_HeaderContainer == null) + return; + + var hasSettings = m_SettingsObject != null; + var hasSettingsAsset = m_AvailableInputSettingsAssets != null && m_AvailableInputSettingsAssets.Length != 0; + var canEditSettings = hasSettings && hasSettingsAsset; + + UpdateDropdownChoices(m_UpdateModeDropdown, m_UpdateMode); + if (m_UpdateModeDropdown != null) + m_UpdateModeDropdown.SetEnabled(canEditSettings && m_UpdateMode != null); + + var showManualUpdateModeHelp = hasSettings && + m_UpdateMode != null && + m_UpdateMode.intValue == (int)InputSettings.UpdateMode.ProcessEventsManually; + if (m_UpdateModeHelpContainer != null) + m_UpdateModeHelpContainer.style.display = showManualUpdateModeHelp ? DisplayStyle.Flex : DisplayStyle.None; + + UpdateDropdownChoices(m_BackgroundBehaviorDropdown, m_BackgroundBehavior); + if (m_BackgroundBehaviorDropdown != null) + m_BackgroundBehaviorDropdown.SetEnabled(canEditSettings && Application.runInBackground && m_BackgroundBehavior != null); + + if (m_BackgroundBehaviorHelpBox != null) + { + var showRunInBackgroundHelp = hasSettings && !Application.runInBackground; + m_BackgroundBehaviorHelpBox.style.display = showRunInBackgroundHelp ? DisplayStyle.Flex : DisplayStyle.None; + } + +#if UNITY_INPUT_SYSTEM_PLATFORM_SCROLL_DELTA + UpdateDropdownChoices(m_ScrollDeltaBehaviorDropdown, m_ScrollDeltaBehavior); + if (m_ScrollDeltaBehaviorDropdown != null) + m_ScrollDeltaBehaviorDropdown.SetEnabled(canEditSettings && m_ScrollDeltaBehavior != null); +#endif + + if (m_CompensateForScreenOrientationToggle != null) + { + m_CompensateForScreenOrientationToggle.SetEnabled(canEditSettings && m_CompensateForScreenOrientation != null); + m_CompensateForScreenOrientationToggle.SetValueWithoutNotify(m_CompensateForScreenOrientation?.boolValue ?? false); + } + } + + private static void UpdateDropdownChoices(DropdownField dropdown, SerializedProperty property) + { + if (dropdown == null) + return; + + if (property == null) + { + dropdown.choices = Array.Empty().ToList(); + dropdown.SetValueWithoutNotify(string.Empty); + return; + } + + dropdown.choices = property.enumDisplayNames.ToList(); + if (property.enumValueIndex >= 0 && property.enumValueIndex < dropdown.choices.Count) + dropdown.SetValueWithoutNotify(dropdown.choices[property.enumValueIndex]); + } + private void CustomUpdateModeHelpBox() { var message = - "This is not recommended, the default update mode is dynamic update and should only be changed for compelling reasons.\nPlease refer to the documentation."; - Uri link = new Uri(InputSystem.kDocUrl + "/manual/Settings.html#update-mode"); + "This is not recommended, the default update mode is dynamic update and should only be changed for compelling reasons.\nPlease refer to the documentation."; GUILayout.BeginHorizontal(EditorStyles.helpBox); GUILayout.Label(EditorGUIUtility.IconContent("console.warnicon"), GUILayout.ExpandWidth(false)); GUILayout.BeginVertical(); GUILayout.Label(message, EditorStyles.label); if (GUILayout.Button("Read more", EditorStyles.linkLabel)) - System.Diagnostics.Process.Start(link.AbsoluteUri); + OpenUpdateModeDocumentation(); EditorGUIUtility.AddCursorRect(GUILayoutUtility.GetLastRect(), MouseCursor.Link); GUILayout.EndVertical(); GUILayout.EndHorizontal(); } + private static void OpenUpdateModeDocumentation() + { + var link = new Uri(InputSystem.kDocUrl + "/manual/Settings.html#update-mode"); + System.Diagnostics.Process.Start(link.AbsoluteUri); + } + private static void ShowPlatformSettings() { // Would be nice to get BuildTargetDiscovery.GetBuildTargetInfoList since that contains information about icons etc @@ -402,11 +591,13 @@ private void OnUndoRedo() if (m_Settings != null && EditorUtility.GetDirtyCount(m_Settings) != m_SettingsDirtyCount) m_Settings.OnChange(); InitializeWithCurrentSettingsIfNecessary(); + RefreshUIToolkitHeaderState(); } private void OnSettingsChange() { InitializeWithCurrentSettingsIfNecessary(); + RefreshUIToolkitHeaderState(); ////REVIEW: leads to double-repaint when the settings change is initiated by us; problem? Repaint(); @@ -470,6 +661,19 @@ private static string[] FindInputSettingsInProject() private GUIContent m_ShortcutKeysConsumeInputsContent; [NonSerialized] private InputSettingsiOSProvider m_iOSProvider; + [NonSerialized] private VisualElement m_RootElement; + [NonSerialized] private VisualElement m_HeaderContainer; + [NonSerialized] private VisualElement m_UpdateModeHelpContainer; + [NonSerialized] private IMGUIContainer m_IMGUIContainer; + [NonSerialized] private DropdownField m_UpdateModeDropdown; + [NonSerialized] private DropdownField m_BackgroundBehaviorDropdown; +#if UNITY_INPUT_SYSTEM_PLATFORM_SCROLL_DELTA + [NonSerialized] private DropdownField m_ScrollDeltaBehaviorDropdown; +#endif + [NonSerialized] private Toggle m_CompensateForScreenOrientationToggle; + [NonSerialized] private HelpBox m_UpdateModeHelpBox; + [NonSerialized] private Button m_UpdateModeReadMoreButton; + [NonSerialized] private HelpBox m_BackgroundBehaviorHelpBox; private static InputSettingsProvider s_Instance; From 6f1a539c0b5f38a74dffcc2b72ad993049ebca53 Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:33:53 +0100 Subject: [PATCH 02/12] Update InputSettingsProvider.cs --- .../Editor/Settings/InputSettingsProvider.cs | 129 ++++++++++++++++-- 1 file changed, 117 insertions(+), 12 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 5980590181..8fed6f19e2 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -147,19 +147,22 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) // player settings as regardless of whether it's on or not, Unity will force it on in standalone // development players. - EditorGUILayout.Space(); - EditorGUILayout.Separator(); - EditorGUILayout.Space(); + if (!includeUIToolkitHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.Separator(); + EditorGUILayout.Space(); - EditorGUILayout.PropertyField(m_DefaultDeadzoneMin, m_DefaultDeadzoneMinContent); - EditorGUILayout.PropertyField(m_DefaultDeadzoneMax, m_DefaultDeadzoneMaxContent); - EditorGUILayout.PropertyField(m_DefaultButtonPressPoint, m_DefaultButtonPressPointContent); - EditorGUILayout.PropertyField(m_ButtonReleaseThreshold, m_ButtonReleaseThresholdContent); - EditorGUILayout.PropertyField(m_DefaultTapTime, m_DefaultTapTimeContent); - EditorGUILayout.PropertyField(m_DefaultSlowTapTime, m_DefaultSlowTapTimeContent); - EditorGUILayout.PropertyField(m_DefaultHoldTime, m_DefaultHoldTimeContent); - EditorGUILayout.PropertyField(m_TapRadius, m_TapRadiusContent); - EditorGUILayout.PropertyField(m_MultiTapDelayTime, m_MultiTapDelayTimeContent); + EditorGUILayout.PropertyField(m_DefaultDeadzoneMin, m_DefaultDeadzoneMinContent); + EditorGUILayout.PropertyField(m_DefaultDeadzoneMax, m_DefaultDeadzoneMaxContent); + EditorGUILayout.PropertyField(m_DefaultButtonPressPoint, m_DefaultButtonPressPointContent); + EditorGUILayout.PropertyField(m_ButtonReleaseThreshold, m_ButtonReleaseThresholdContent); + EditorGUILayout.PropertyField(m_DefaultTapTime, m_DefaultTapTimeContent); + EditorGUILayout.PropertyField(m_DefaultSlowTapTime, m_DefaultSlowTapTimeContent); + EditorGUILayout.PropertyField(m_DefaultHoldTime, m_DefaultHoldTimeContent); + EditorGUILayout.PropertyField(m_TapRadius, m_TapRadiusContent); + EditorGUILayout.PropertyField(m_MultiTapDelayTime, m_MultiTapDelayTimeContent); + } EditorGUILayout.Space(); EditorGUILayout.Separator(); @@ -261,6 +264,60 @@ private void BuildUI() RefreshUIToolkitHeaderState); m_HeaderContainer.Add(m_CompensateForScreenOrientationToggle); + m_DefaultDeadzoneMinField = CreateFloatField( + () => m_DefaultDeadzoneMin, + m_DefaultDeadzoneMinContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_DefaultDeadzoneMinField); + + m_DefaultDeadzoneMaxField = CreateFloatField( + () => m_DefaultDeadzoneMax, + m_DefaultDeadzoneMaxContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_DefaultDeadzoneMaxField); + + m_DefaultButtonPressPointField = CreateFloatField( + () => m_DefaultButtonPressPoint, + m_DefaultButtonPressPointContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_DefaultButtonPressPointField); + + m_ButtonReleaseThresholdField = CreateFloatField( + () => m_ButtonReleaseThreshold, + m_ButtonReleaseThresholdContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_ButtonReleaseThresholdField); + + m_DefaultTapTimeField = CreateFloatField( + () => m_DefaultTapTime, + m_DefaultTapTimeContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_DefaultTapTimeField); + + m_DefaultSlowTapTimeField = CreateFloatField( + () => m_DefaultSlowTapTime, + m_DefaultSlowTapTimeContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_DefaultSlowTapTimeField); + + m_DefaultHoldTimeField = CreateFloatField( + () => m_DefaultHoldTime, + m_DefaultHoldTimeContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_DefaultHoldTimeField); + + m_TapRadiusField = CreateFloatField( + () => m_TapRadius, + m_TapRadiusContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_TapRadiusField); + + m_MultiTapDelayTimeField = CreateFloatField( + () => m_MultiTapDelayTime, + m_MultiTapDelayTimeContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_MultiTapDelayTimeField); + m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); @@ -311,6 +368,26 @@ private Toggle CreateToggle(Func propertyAccessor, GUIConten return toggle; } + private FloatField CreateFloatField(Func propertyAccessor, GUIContent content, Action onValueChanged) + { + var field = new FloatField(content.text) + { + tooltip = content.tooltip + }; + field.RegisterValueChangedCallback(evt => + { + var property = propertyAccessor(); + if (property == null || Mathf.Approximately(property.floatValue, evt.newValue)) + return; + + property.floatValue = evt.newValue; + Apply(); + onValueChanged?.Invoke(); + }); + + return field; + } + private void RefreshUIToolkitHeaderState() { if (m_HeaderContainer == null) @@ -351,6 +428,16 @@ private void RefreshUIToolkitHeaderState() m_CompensateForScreenOrientationToggle.SetEnabled(canEditSettings && m_CompensateForScreenOrientation != null); m_CompensateForScreenOrientationToggle.SetValueWithoutNotify(m_CompensateForScreenOrientation?.boolValue ?? false); } + + UpdateFloatField(m_DefaultDeadzoneMinField, m_DefaultDeadzoneMin, canEditSettings); + UpdateFloatField(m_DefaultDeadzoneMaxField, m_DefaultDeadzoneMax, canEditSettings); + UpdateFloatField(m_DefaultButtonPressPointField, m_DefaultButtonPressPoint, canEditSettings); + UpdateFloatField(m_ButtonReleaseThresholdField, m_ButtonReleaseThreshold, canEditSettings); + UpdateFloatField(m_DefaultTapTimeField, m_DefaultTapTime, canEditSettings); + UpdateFloatField(m_DefaultSlowTapTimeField, m_DefaultSlowTapTime, canEditSettings); + UpdateFloatField(m_DefaultHoldTimeField, m_DefaultHoldTime, canEditSettings); + UpdateFloatField(m_TapRadiusField, m_TapRadius, canEditSettings); + UpdateFloatField(m_MultiTapDelayTimeField, m_MultiTapDelayTime, canEditSettings); } private static void UpdateDropdownChoices(DropdownField dropdown, SerializedProperty property) @@ -370,6 +457,15 @@ private static void UpdateDropdownChoices(DropdownField dropdown, SerializedProp dropdown.SetValueWithoutNotify(dropdown.choices[property.enumValueIndex]); } + private static void UpdateFloatField(FloatField field, SerializedProperty property, bool canEditSettings) + { + if (field == null) + return; + + field.SetEnabled(canEditSettings && property != null); + field.SetValueWithoutNotify(property?.floatValue ?? 0f); + } + private void CustomUpdateModeHelpBox() { var message = @@ -671,6 +767,15 @@ private static string[] FindInputSettingsInProject() [NonSerialized] private DropdownField m_ScrollDeltaBehaviorDropdown; #endif [NonSerialized] private Toggle m_CompensateForScreenOrientationToggle; + [NonSerialized] private FloatField m_DefaultDeadzoneMinField; + [NonSerialized] private FloatField m_DefaultDeadzoneMaxField; + [NonSerialized] private FloatField m_DefaultButtonPressPointField; + [NonSerialized] private FloatField m_ButtonReleaseThresholdField; + [NonSerialized] private FloatField m_DefaultTapTimeField; + [NonSerialized] private FloatField m_DefaultSlowTapTimeField; + [NonSerialized] private FloatField m_DefaultHoldTimeField; + [NonSerialized] private FloatField m_TapRadiusField; + [NonSerialized] private FloatField m_MultiTapDelayTimeField; [NonSerialized] private HelpBox m_UpdateModeHelpBox; [NonSerialized] private Button m_UpdateModeReadMoreButton; [NonSerialized] private HelpBox m_BackgroundBehaviorHelpBox; From 2a79a2694afe89257fd1265a7e693bf6b28c93a7 Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:37:12 +0100 Subject: [PATCH 03/12] spacing --- .../InputSystem/Editor/Settings/InputSettingsProvider.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 8fed6f19e2..9237091de2 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -214,6 +214,7 @@ private void BuildUI() var titleLabel = new Label("Input Settings"); titleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; titleLabel.style.fontSize = 19; + titleLabel.style.marginBottom = 12; m_RootElement.Add(titleLabel); m_HeaderContainer = new VisualElement(); @@ -262,6 +263,8 @@ private void BuildUI() () => m_CompensateForScreenOrientation, m_CompensateForScreenOrientationContent, RefreshUIToolkitHeaderState); + m_CompensateForScreenOrientationToggle.style.marginTop = 12; + m_CompensateForScreenOrientationToggle.style.marginBottom = 12; m_HeaderContainer.Add(m_CompensateForScreenOrientationToggle); m_DefaultDeadzoneMinField = CreateFloatField( From 443368166bd063769a856fbb8aa61d97156703cc Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:46:36 +0100 Subject: [PATCH 04/12] iOS seetings commit --- .../Editor/Settings/InputSettingsProvider.cs | 21 +++++- .../Plugins/iOS/InputSettingsiOSProvider.cs | 75 ++++++++++++++++++- 2 files changed, 89 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 9237091de2..71f4b40639 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -175,9 +175,12 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) m_SupportedDevices.DoLayoutList(); - EditorGUILayout.LabelField("iOS", EditorStyles.boldLabel); - EditorGUILayout.Space(); - m_iOSProvider.OnGUI(); + if (!includeUIToolkitHeader) + { + EditorGUILayout.LabelField("iOS", EditorStyles.boldLabel); + EditorGUILayout.Space(); + m_iOSProvider.OnGUI(); + } EditorGUILayout.Space(); EditorGUILayout.LabelField("Editor", EditorStyles.boldLabel); @@ -321,6 +324,12 @@ private void BuildUI() RefreshUIToolkitHeaderState); m_HeaderContainer.Add(m_MultiTapDelayTimeField); + m_iOSProvider.CreateGUI(m_HeaderContainer, () => + { + Apply(); + RefreshUIToolkitHeaderState(); + }); + m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); @@ -441,6 +450,7 @@ private void RefreshUIToolkitHeaderState() UpdateFloatField(m_DefaultHoldTimeField, m_DefaultHoldTime, canEditSettings); UpdateFloatField(m_TapRadiusField, m_TapRadius, canEditSettings); UpdateFloatField(m_MultiTapDelayTimeField, m_MultiTapDelayTime, canEditSettings); + m_iOSProvider?.RefreshUIToolkitState(canEditSettings); } private static void UpdateDropdownChoices(DropdownField dropdown, SerializedProperty property) @@ -673,7 +683,10 @@ private void InitializeWithCurrentSettings() } }; - m_iOSProvider = new InputSettingsiOSProvider(m_SettingsObject); + if (m_iOSProvider == null) + m_iOSProvider = new InputSettingsiOSProvider(m_SettingsObject); + else + m_iOSProvider.Update(m_SettingsObject); } private void Apply() diff --git a/Packages/com.unity.inputsystem/InputSystem/Plugins/iOS/InputSettingsiOSProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Plugins/iOS/InputSettingsiOSProvider.cs index 36eb6f92f9..c33d651bff 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Plugins/iOS/InputSettingsiOSProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Plugins/iOS/InputSettingsiOSProvider.cs @@ -1,6 +1,7 @@ #if UNITY_EDITOR using System; using UnityEditor; +using UnityEngine.UIElements; namespace UnityEngine.InputSystem { @@ -8,20 +9,28 @@ internal class InputSettingsiOSProvider { [NonSerialized] private SerializedProperty m_MotionUsageEnabled; [NonSerialized] private SerializedProperty m_MotionUsageDescription; + [NonSerialized] private VisualElement m_Container; + [NonSerialized] private Toggle m_MotionUsageToggle; + [NonSerialized] private TextField m_MotionUsageDescriptionField; private GUIContent m_MotionUsageContent; private GUIContent m_MotionUsageDescriptionContent; public InputSettingsiOSProvider(SerializedObject parent) { - var prefix = "m_iOSSettings.m_MotionUsage"; - m_MotionUsageEnabled = parent.FindProperty(prefix + ".m_Enabled"); - m_MotionUsageDescription = parent.FindProperty(prefix + ".m_Description"); + Update(parent); m_MotionUsageContent = new GUIContent("Motion Usage", "Enables Motion Usage for the app, required for sensors like Step Counter. This also adds 'Privacy - Motion Usage Description' entry to Info.plist"); m_MotionUsageDescriptionContent = new GUIContent(" Description", "Describe why the app wants to access the device's Motion Usage sensor."); } + public void Update(SerializedObject parent) + { + var prefix = "m_iOSSettings.m_MotionUsage"; + m_MotionUsageEnabled = parent.FindProperty(prefix + ".m_Enabled"); + m_MotionUsageDescription = parent.FindProperty(prefix + ".m_Description"); + } + public void OnGUI() { EditorGUILayout.PropertyField(m_MotionUsageEnabled, m_MotionUsageContent); @@ -29,6 +38,66 @@ public void OnGUI() EditorGUILayout.PropertyField(m_MotionUsageDescription, m_MotionUsageDescriptionContent); EditorGUI.EndDisabledGroup(); } + + public void CreateGUI(VisualElement parent, Action onValueChanged) + { + if (parent == null) + return; + + m_Container = new VisualElement(); + var titleLabel = new Label("iOS"); + titleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; + titleLabel.style.marginTop = 12; + m_Container.Add(titleLabel); + + m_MotionUsageToggle = new Toggle(m_MotionUsageContent.text) + { + tooltip = m_MotionUsageContent.tooltip + }; + m_MotionUsageToggle.RegisterValueChangedCallback(evt => + { + if (m_MotionUsageEnabled == null || m_MotionUsageEnabled.boolValue == evt.newValue) + return; + + m_MotionUsageEnabled.boolValue = evt.newValue; + onValueChanged?.Invoke(); + }); + m_Container.Add(m_MotionUsageToggle); + + m_MotionUsageDescriptionField = new TextField("Description") + { + tooltip = m_MotionUsageDescriptionContent.tooltip + }; + m_MotionUsageDescriptionField.RegisterValueChangedCallback(evt => + { + if (m_MotionUsageDescription == null || m_MotionUsageDescription.stringValue == evt.newValue) + return; + + m_MotionUsageDescription.stringValue = evt.newValue; + onValueChanged?.Invoke(); + }); + m_Container.Add(m_MotionUsageDescriptionField); + + parent.Add(m_Container); + } + + public void RefreshUIToolkitState(bool canEditSettings) + { + if (m_Container == null) + return; + + if (m_MotionUsageToggle != null) + { + m_MotionUsageToggle.SetEnabled(canEditSettings && m_MotionUsageEnabled != null); + m_MotionUsageToggle.SetValueWithoutNotify(m_MotionUsageEnabled?.boolValue ?? false); + } + + if (m_MotionUsageDescriptionField != null) + { + m_MotionUsageDescriptionField.SetEnabled(canEditSettings && m_MotionUsageEnabled != null && m_MotionUsageEnabled.boolValue); + m_MotionUsageDescriptionField.SetValueWithoutNotify(m_MotionUsageDescription?.stringValue ?? string.Empty); + } + } } } From 10b3868672a2a8d388a20244ee0b4e6b1cf4f0ed Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:48:15 +0100 Subject: [PATCH 05/12] Editor commit --- .../Editor/Settings/InputSettingsProvider.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 71f4b40639..a5aea82069 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -182,10 +182,13 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) m_iOSProvider.OnGUI(); } - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Editor", EditorStyles.boldLabel); - EditorGUILayout.Space(); - EditorGUILayout.PropertyField(m_EditorInputBehaviorInPlayMode, m_EditorInputBehaviorInPlayModeContent); + if (!includeUIToolkitHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Editor", EditorStyles.boldLabel); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(m_EditorInputBehaviorInPlayMode, m_EditorInputBehaviorInPlayModeContent); + } EditorGUILayout.Space(); EditorGUILayout.LabelField("Improved Shortcut Support", EditorStyles.boldLabel); @@ -330,6 +333,17 @@ private void BuildUI() RefreshUIToolkitHeaderState(); }); + var editorTitleLabel = new Label("Editor"); + editorTitleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; + editorTitleLabel.style.marginTop = 12; + m_HeaderContainer.Add(editorTitleLabel); + + m_EditorInputBehaviorInPlayModeDropdown = CreateEnumDropdown( + () => m_EditorInputBehaviorInPlayMode, + m_EditorInputBehaviorInPlayModeContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_EditorInputBehaviorInPlayModeDropdown); + m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); @@ -450,6 +464,11 @@ private void RefreshUIToolkitHeaderState() UpdateFloatField(m_DefaultHoldTimeField, m_DefaultHoldTime, canEditSettings); UpdateFloatField(m_TapRadiusField, m_TapRadius, canEditSettings); UpdateFloatField(m_MultiTapDelayTimeField, m_MultiTapDelayTime, canEditSettings); + + UpdateDropdownChoices(m_EditorInputBehaviorInPlayModeDropdown, m_EditorInputBehaviorInPlayMode); + if (m_EditorInputBehaviorInPlayModeDropdown != null) + m_EditorInputBehaviorInPlayModeDropdown.SetEnabled(canEditSettings && m_EditorInputBehaviorInPlayMode != null); + m_iOSProvider?.RefreshUIToolkitState(canEditSettings); } @@ -782,6 +801,7 @@ private static string[] FindInputSettingsInProject() #if UNITY_INPUT_SYSTEM_PLATFORM_SCROLL_DELTA [NonSerialized] private DropdownField m_ScrollDeltaBehaviorDropdown; #endif + [NonSerialized] private DropdownField m_EditorInputBehaviorInPlayModeDropdown; [NonSerialized] private Toggle m_CompensateForScreenOrientationToggle; [NonSerialized] private FloatField m_DefaultDeadzoneMinField; [NonSerialized] private FloatField m_DefaultDeadzoneMaxField; From 99389b3943135061284d4cf4f464414fd948181a Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:51:36 +0100 Subject: [PATCH 06/12] Improved Shortcut Support commit --- .../Editor/Settings/InputSettingsProvider.cs | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index a5aea82069..8ab040cb31 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -190,19 +190,22 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) EditorGUILayout.PropertyField(m_EditorInputBehaviorInPlayMode, m_EditorInputBehaviorInPlayModeContent); } - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Improved Shortcut Support", EditorStyles.boldLabel); - EditorGUILayout.Space(); - EditorGUILayout.PropertyField(m_ShortcutKeysConsumeInputs, m_ShortcutKeysConsumeInputsContent); - if (m_ShortcutKeysConsumeInputs.boolValue) - EditorGUILayout.HelpBox("Please note that enabling Improved Shortcut Support will cause actions with composite bindings to consume input and block any other actions which are enabled and sharing the same controls. " - + "Input consumption is performed in priority order, with the action containing the greatest number of bindings checked first. " - + "Therefore actions requiring fewer keypresses will not be triggered if an action using more keypresses is triggered and has overlapping controls. " - + "This works for shortcut keys, however in other cases this might not give the desired result, especially where there are actions with the exact same number of composite controls, in which case it is non-deterministic which action will be triggered. " - + "These conflicts may occur even between actions which belong to different Action Maps e.g. if using an UIInputModule with the Arrow Keys bound to the Navigate Action in the UI Action Map, this would interfere with other Action Maps using those keys. " - + "However conflicts would not occur between actions which belong to different Action Assets. " - + "Since event consumption only occurs for enabled actions, you can resolve unexpected issues by ensuring that only those Actions or Action Maps that are relevant to your game's current context are enabled. Enabling or disabling actions as your game or application moves between different contexts. " - , MessageType.None); + if (!includeUIToolkitHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Improved Shortcut Support", EditorStyles.boldLabel); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(m_ShortcutKeysConsumeInputs, m_ShortcutKeysConsumeInputsContent); + if (m_ShortcutKeysConsumeInputs.boolValue) + EditorGUILayout.HelpBox("Please note that enabling Improved Shortcut Support will cause actions with composite bindings to consume input and block any other actions which are enabled and sharing the same controls. " + + "Input consumption is performed in priority order, with the action containing the greatest number of bindings checked first. " + + "Therefore actions requiring fewer keypresses will not be triggered if an action using more keypresses is triggered and has overlapping controls. " + + "This works for shortcut keys, however in other cases this might not give the desired result, especially where there are actions with the exact same number of composite controls, in which case it is non-deterministic which action will be triggered. " + + "These conflicts may occur even between actions which belong to different Action Maps e.g. if using an UIInputModule with the Arrow Keys bound to the Navigate Action in the UI Action Map, this would interfere with other Action Maps using those keys. " + + "However conflicts would not occur between actions which belong to different Action Assets. " + + "Since event consumption only occurs for enabled actions, you can resolve unexpected issues by ensuring that only those Actions or Action Maps that are relevant to your game's current context are enabled. Enabling or disabling actions as your game or application moves between different contexts. " + , MessageType.None); + } if (EditorGUI.EndChangeCheck()) Apply(); @@ -344,6 +347,28 @@ private void BuildUI() RefreshUIToolkitHeaderState); m_HeaderContainer.Add(m_EditorInputBehaviorInPlayModeDropdown); + var shortcutSupportTitleLabel = new Label("Improved Shortcut Support"); + shortcutSupportTitleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; + shortcutSupportTitleLabel.style.marginTop = 12; + m_HeaderContainer.Add(shortcutSupportTitleLabel); + + m_ShortcutKeysConsumeInputsToggle = CreateToggle( + () => m_ShortcutKeysConsumeInputs, + m_ShortcutKeysConsumeInputsContent, + RefreshUIToolkitHeaderState); + m_HeaderContainer.Add(m_ShortcutKeysConsumeInputsToggle); + + m_ShortcutKeysConsumeInputsHelpBox = new HelpBox( + "Please note that enabling Improved Shortcut Support will cause actions with composite bindings to consume input and block any other actions which are enabled and sharing the same controls. " + + "Input consumption is performed in priority order, with the action containing the greatest number of bindings checked first. " + + "Therefore actions requiring fewer keypresses will not be triggered if an action using more keypresses is triggered and has overlapping controls. " + + "This works for shortcut keys, however in other cases this might not give the desired result, especially where there are actions with the exact same number of composite controls, in which case it is non-deterministic which action will be triggered. " + + "These conflicts may occur even between actions which belong to different Action Maps e.g. if using an UIInputModule with the Arrow Keys bound to the Navigate Action in the UI Action Map, this would interfere with other Action Maps using those keys. " + + "However conflicts would not occur between actions which belong to different Action Assets. " + + "Since event consumption only occurs for enabled actions, you can resolve unexpected issues by ensuring that only those Actions or Action Maps that are relevant to your game's current context are enabled. Enabling or disabling actions as your game or application moves between different contexts. ", + HelpBoxMessageType.None); + m_HeaderContainer.Add(m_ShortcutKeysConsumeInputsHelpBox); + m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); @@ -469,6 +494,18 @@ private void RefreshUIToolkitHeaderState() if (m_EditorInputBehaviorInPlayModeDropdown != null) m_EditorInputBehaviorInPlayModeDropdown.SetEnabled(canEditSettings && m_EditorInputBehaviorInPlayMode != null); + if (m_ShortcutKeysConsumeInputsToggle != null) + { + m_ShortcutKeysConsumeInputsToggle.SetEnabled(canEditSettings && m_ShortcutKeysConsumeInputs != null); + m_ShortcutKeysConsumeInputsToggle.SetValueWithoutNotify(m_ShortcutKeysConsumeInputs?.boolValue ?? false); + } + + if (m_ShortcutKeysConsumeInputsHelpBox != null) + m_ShortcutKeysConsumeInputsHelpBox.style.display = + m_ShortcutKeysConsumeInputs != null && m_ShortcutKeysConsumeInputs.boolValue + ? DisplayStyle.Flex + : DisplayStyle.None; + m_iOSProvider?.RefreshUIToolkitState(canEditSettings); } @@ -803,6 +840,7 @@ private static string[] FindInputSettingsInProject() #endif [NonSerialized] private DropdownField m_EditorInputBehaviorInPlayModeDropdown; [NonSerialized] private Toggle m_CompensateForScreenOrientationToggle; + [NonSerialized] private Toggle m_ShortcutKeysConsumeInputsToggle; [NonSerialized] private FloatField m_DefaultDeadzoneMinField; [NonSerialized] private FloatField m_DefaultDeadzoneMaxField; [NonSerialized] private FloatField m_DefaultButtonPressPointField; @@ -815,6 +853,7 @@ private static string[] FindInputSettingsInProject() [NonSerialized] private HelpBox m_UpdateModeHelpBox; [NonSerialized] private Button m_UpdateModeReadMoreButton; [NonSerialized] private HelpBox m_BackgroundBehaviorHelpBox; + [NonSerialized] private HelpBox m_ShortcutKeysConsumeInputsHelpBox; private static InputSettingsProvider s_Instance; From aea0206eeca3aa33d3e2ecb4d5fa7dbe875cdb1a Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:53:50 +0100 Subject: [PATCH 07/12] m_SupportedDevicesHelpBox commit --- .../Editor/Settings/InputSettingsProvider.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 8ab040cb31..09caed6461 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -168,10 +168,11 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) EditorGUILayout.Separator(); EditorGUILayout.Space(); - EditorGUILayout.HelpBox("Leave 'Supported Devices' empty if you want the input system to support all input devices it can recognize. If, however, " - + "you are only interested in a certain set of devices, adding them here will narrow the scope of what's presented in the editor " - + "and avoid picking up input from devices not relevant to the project. When you add devices here, any device that will not be classified " - + "as supported will appear under 'Unsupported Devices' in the input debugger.", MessageType.None); + if (!includeUIToolkitHeader) + EditorGUILayout.HelpBox("Leave 'Supported Devices' empty if you want the input system to support all input devices it can recognize. If, however, " + + "you are only interested in a certain set of devices, adding them here will narrow the scope of what's presented in the editor " + + "and avoid picking up input from devices not relevant to the project. When you add devices here, any device that will not be classified " + + "as supported will appear under 'Unsupported Devices' in the input debugger.", MessageType.None); m_SupportedDevices.DoLayoutList(); @@ -369,6 +370,14 @@ private void BuildUI() HelpBoxMessageType.None); m_HeaderContainer.Add(m_ShortcutKeysConsumeInputsHelpBox); + m_SupportedDevicesHelpBox = new HelpBox( + "Leave 'Supported Devices' empty if you want the input system to support all input devices it can recognize. If, however, " + + "you are only interested in a certain set of devices, adding them here will narrow the scope of what's presented in the editor " + + "and avoid picking up input from devices not relevant to the project. When you add devices here, any device that will not be classified " + + "as supported will appear under 'Unsupported Devices' in the input debugger.", + HelpBoxMessageType.None); + m_HeaderContainer.Add(m_SupportedDevicesHelpBox); + m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); @@ -854,6 +863,7 @@ private static string[] FindInputSettingsInProject() [NonSerialized] private Button m_UpdateModeReadMoreButton; [NonSerialized] private HelpBox m_BackgroundBehaviorHelpBox; [NonSerialized] private HelpBox m_ShortcutKeysConsumeInputsHelpBox; + [NonSerialized] private HelpBox m_SupportedDevicesHelpBox; private static InputSettingsProvider s_Instance; From f7697e84d8ca2aca3ce09cfe04d1eb976aed41ea Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 16:58:38 +0100 Subject: [PATCH 08/12] Moving SupportedDevicesHelpBox to the right place --- .../Editor/Settings/InputSettingsProvider.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 09caed6461..85e0e78c31 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -331,6 +331,15 @@ private void BuildUI() RefreshUIToolkitHeaderState); m_HeaderContainer.Add(m_MultiTapDelayTimeField); + m_SupportedDevicesHelpBox = new HelpBox( + "Leave 'Supported Devices' empty if you want the input system to support all input devices it can recognize. If, however, " + + "you are only interested in a certain set of devices, adding them here will narrow the scope of what's presented in the editor " + + "and avoid picking up input from devices not relevant to the project. When you add devices here, any device that will not be classified " + + "as supported will appear under 'Unsupported Devices' in the input debugger.", + HelpBoxMessageType.None); + m_SupportedDevicesHelpBox.style.marginTop = 48; + m_HeaderContainer.Add(m_SupportedDevicesHelpBox); + m_iOSProvider.CreateGUI(m_HeaderContainer, () => { Apply(); @@ -370,14 +379,6 @@ private void BuildUI() HelpBoxMessageType.None); m_HeaderContainer.Add(m_ShortcutKeysConsumeInputsHelpBox); - m_SupportedDevicesHelpBox = new HelpBox( - "Leave 'Supported Devices' empty if you want the input system to support all input devices it can recognize. If, however, " - + "you are only interested in a certain set of devices, adding them here will narrow the scope of what's presented in the editor " - + "and avoid picking up input from devices not relevant to the project. When you add devices here, any device that will not be classified " - + "as supported will appear under 'Unsupported Devices' in the input debugger.", - HelpBoxMessageType.None); - m_HeaderContainer.Add(m_SupportedDevicesHelpBox); - m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); From e566ab27cdb12e8192fbeedc8c3663f22ed04968 Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 17:04:09 +0100 Subject: [PATCH 09/12] Moving Supported devices right position --- .../Editor/Settings/InputSettingsProvider.cs | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 85e0e78c31..11b84c4356 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -99,6 +99,17 @@ public override void OnGUI(string searchContext) DrawSettingsGUI(includeUIToolkitHeader: false); } + private void DrawSupportedDevicesGUI() + { + InitializeWithCurrentSettingsIfNecessary(); + + using (new EditorGUI.DisabledScope(m_AvailableInputSettingsAssets.Length == 0)) + { + Debug.Assert(m_Settings != null); + m_SupportedDevices.DoLayoutList(); + } + } + private void DrawSettingsGUI(bool includeUIToolkitHeader) { InitializeWithCurrentSettingsIfNecessary(); @@ -164,17 +175,19 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) EditorGUILayout.PropertyField(m_MultiTapDelayTime, m_MultiTapDelayTimeContent); } - EditorGUILayout.Space(); - EditorGUILayout.Separator(); - EditorGUILayout.Space(); - if (!includeUIToolkitHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.Separator(); + EditorGUILayout.Space(); + EditorGUILayout.HelpBox("Leave 'Supported Devices' empty if you want the input system to support all input devices it can recognize. If, however, " + "you are only interested in a certain set of devices, adding them here will narrow the scope of what's presented in the editor " + "and avoid picking up input from devices not relevant to the project. When you add devices here, any device that will not be classified " + "as supported will appear under 'Unsupported Devices' in the input debugger.", MessageType.None); - m_SupportedDevices.DoLayoutList(); + m_SupportedDevices.DoLayoutList(); + } if (!includeUIToolkitHeader) { @@ -340,7 +353,12 @@ private void BuildUI() m_SupportedDevicesHelpBox.style.marginTop = 48; m_HeaderContainer.Add(m_SupportedDevicesHelpBox); - m_iOSProvider.CreateGUI(m_HeaderContainer, () => + m_RootElement.Add(new IMGUIContainer(DrawSupportedDevicesGUI)); + + var lowerSectionsContainer = new VisualElement(); + m_RootElement.Add(lowerSectionsContainer); + + m_iOSProvider.CreateGUI(lowerSectionsContainer, () => { Apply(); RefreshUIToolkitHeaderState(); @@ -349,24 +367,24 @@ private void BuildUI() var editorTitleLabel = new Label("Editor"); editorTitleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; editorTitleLabel.style.marginTop = 12; - m_HeaderContainer.Add(editorTitleLabel); + lowerSectionsContainer.Add(editorTitleLabel); m_EditorInputBehaviorInPlayModeDropdown = CreateEnumDropdown( () => m_EditorInputBehaviorInPlayMode, m_EditorInputBehaviorInPlayModeContent, RefreshUIToolkitHeaderState); - m_HeaderContainer.Add(m_EditorInputBehaviorInPlayModeDropdown); + lowerSectionsContainer.Add(m_EditorInputBehaviorInPlayModeDropdown); var shortcutSupportTitleLabel = new Label("Improved Shortcut Support"); shortcutSupportTitleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; shortcutSupportTitleLabel.style.marginTop = 12; - m_HeaderContainer.Add(shortcutSupportTitleLabel); + lowerSectionsContainer.Add(shortcutSupportTitleLabel); m_ShortcutKeysConsumeInputsToggle = CreateToggle( () => m_ShortcutKeysConsumeInputs, m_ShortcutKeysConsumeInputsContent, RefreshUIToolkitHeaderState); - m_HeaderContainer.Add(m_ShortcutKeysConsumeInputsToggle); + lowerSectionsContainer.Add(m_ShortcutKeysConsumeInputsToggle); m_ShortcutKeysConsumeInputsHelpBox = new HelpBox( "Please note that enabling Improved Shortcut Support will cause actions with composite bindings to consume input and block any other actions which are enabled and sharing the same controls. " @@ -377,7 +395,7 @@ private void BuildUI() + "However conflicts would not occur between actions which belong to different Action Assets. " + "Since event consumption only occurs for enabled actions, you can resolve unexpected issues by ensuring that only those Actions or Action Maps that are relevant to your game's current context are enabled. Enabling or disabling actions as your game or application moves between different contexts. ", HelpBoxMessageType.None); - m_HeaderContainer.Add(m_ShortcutKeysConsumeInputsHelpBox); + lowerSectionsContainer.Add(m_ShortcutKeysConsumeInputsHelpBox); m_IMGUIContainer = new IMGUIContainer(() => DrawSettingsGUI(includeUIToolkitHeader: true)); m_RootElement.Add(m_IMGUIContainer); From beee502896cbc36b6324ef5bfedc11a3ff067282 Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 17:08:00 +0100 Subject: [PATCH 10/12] Formatting --- .../InputSystem/Editor/Settings/InputSettingsProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index 11b84c4356..d78a700da6 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -531,8 +531,8 @@ private void RefreshUIToolkitHeaderState() if (m_ShortcutKeysConsumeInputsHelpBox != null) m_ShortcutKeysConsumeInputsHelpBox.style.display = m_ShortcutKeysConsumeInputs != null && m_ShortcutKeysConsumeInputs.boolValue - ? DisplayStyle.Flex - : DisplayStyle.None; + ? DisplayStyle.Flex + : DisplayStyle.None; m_iOSProvider?.RefreshUIToolkitState(canEditSettings); } From d848d7d013bb556d8a64c8b4e7956a241f59f3da Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 17:19:51 +0100 Subject: [PATCH 11/12] Removing TODO --- .../InputSystem/Editor/Settings/InputSettingsProvider.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index d78a700da6..ef41bdecee 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -6,8 +6,6 @@ using UnityEngine.InputSystem.Utilities; using UnityEngine.UIElements; -////TODO: detect if new input backends are enabled and put UI in here to enable them if needed - #pragma warning disable CS0414 namespace UnityEngine.InputSystem.Editor { From 569403628691572a30b37ca6c0d8976ad4109a8a Mon Sep 17 00:00:00 2001 From: JosepMariaPujol Date: Wed, 18 Mar 2026 17:24:55 +0100 Subject: [PATCH 12/12] Removing redundant conditional statements --- .../Editor/Settings/InputSettingsProvider.cs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs index ef41bdecee..ebbdbad391 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Editor/Settings/InputSettingsProvider.cs @@ -150,14 +150,10 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) EditorGUILayout.Space(); EditorGUILayout.PropertyField(m_CompensateForScreenOrientation, m_CompensateForScreenOrientationContent); - } // NOTE: We do NOT make showing this one conditional on whether runInBackground is actually set in the // player settings as regardless of whether it's on or not, Unity will force it on in standalone // development players. - - if (!includeUIToolkitHeader) - { EditorGUILayout.Space(); EditorGUILayout.Separator(); EditorGUILayout.Space(); @@ -171,10 +167,7 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) EditorGUILayout.PropertyField(m_DefaultHoldTime, m_DefaultHoldTimeContent); EditorGUILayout.PropertyField(m_TapRadius, m_TapRadiusContent); EditorGUILayout.PropertyField(m_MultiTapDelayTime, m_MultiTapDelayTimeContent); - } - if (!includeUIToolkitHeader) - { EditorGUILayout.Space(); EditorGUILayout.Separator(); EditorGUILayout.Space(); @@ -185,25 +178,16 @@ private void DrawSettingsGUI(bool includeUIToolkitHeader) + "as supported will appear under 'Unsupported Devices' in the input debugger.", MessageType.None); m_SupportedDevices.DoLayoutList(); - } - if (!includeUIToolkitHeader) - { EditorGUILayout.LabelField("iOS", EditorStyles.boldLabel); EditorGUILayout.Space(); m_iOSProvider.OnGUI(); - } - if (!includeUIToolkitHeader) - { EditorGUILayout.Space(); EditorGUILayout.LabelField("Editor", EditorStyles.boldLabel); EditorGUILayout.Space(); EditorGUILayout.PropertyField(m_EditorInputBehaviorInPlayMode, m_EditorInputBehaviorInPlayModeContent); - } - if (!includeUIToolkitHeader) - { EditorGUILayout.Space(); EditorGUILayout.LabelField("Improved Shortcut Support", EditorStyles.boldLabel); EditorGUILayout.Space();