diff --git a/Assets/Tests/InputSystem/CoreTests_Actions.cs b/Assets/Tests/InputSystem/CoreTests_Actions.cs index 34cfa9299d..8fe8dd6437 100644 --- a/Assets/Tests/InputSystem/CoreTests_Actions.cs +++ b/Assets/Tests/InputSystem/CoreTests_Actions.cs @@ -9238,6 +9238,38 @@ public void Actions_WhenGettingDisplayTextForBindingsOnAction_CompositesAreForma Assert.That(action.GetBindingDisplayString(8), Is.EqualTo("Left Shift|Right Shift+A")); } + // https://issuetracker.unity3d.com/product/unity/issues/guid/UUM-141423 + [Test] + [Category("Actions")] + public void Actions_WhenGettingDisplayTextForBindingsOnAction_CompositeIsIncludedWhenAtLeastOnePartMatchesBindingMask() + { + var action = new InputAction(); + + action.AddCompositeBinding("1DAxis") + .With("Negative", "/a", groups: "Keyboard") + .With("Positive", "/d", groups: "Keyboard"); + + Assert.That(action.GetBindingDisplayString(InputBinding.MaskByGroup("Keyboard")), + Is.EqualTo("A/D")); + } + + // https://issuetracker.unity3d.com/product/unity/issues/guid/UUM-141423 + [Test] + [Category("Actions")] + public void Actions_WhenGettingDisplayTextForBindingsOnAction_MixedGroupCompositeIsRenderedAtomicallyWhenAnyPartMatchesBindingMask() + { + var action = new InputAction(); + + action.AddCompositeBinding("1DAxis") + .With("Negative", "/a", groups: "Keyboard") + .With("Positive", "/leftButton", groups: "Mouse"); + + Assert.That(action.GetBindingDisplayString(InputBinding.MaskByGroup("Keyboard")), + Is.EqualTo("A/Left Button")); + Assert.That(action.GetBindingDisplayString(InputBinding.MaskByGroup("Mouse")), + Is.EqualTo("A/Left Button")); + } + // https://fogbugz.unity3d.com/f/cases/1321175/ [Test] [Category("Actions")] diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index b242446471..1cf29e91de 100644 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed +- Fixed `InputActionRebindingExtensions.GetBindingDisplayString(InputAction, InputBinding, ...)` returning an empty string for composite bindings when the binding mask filters by group [UUM-141423](https://issuetracker.unity3d.com/product/unity/issues/guid/UUM-141423) - Fixed a `NullReferenceException` thrown when removing all action maps [UUM-137116](https://jira.unity3d.com/browse/UUM-137116) - Simplified default setting messaging by consolidating repetitive messages into a single HelpBox. - Fixed a `NullPointerReferenceException` thrown in `InputManagerStateMonitors.FireStateChangeNotifications` logging by adding validation [UUM-136095]. diff --git a/Packages/com.unity.inputsystem/InputSystem/Runtime/Actions/InputActionRebindingExtensions.cs b/Packages/com.unity.inputsystem/InputSystem/Runtime/Actions/InputActionRebindingExtensions.cs index 26dc558ffe..c8ce4be9e3 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Runtime/Actions/InputActionRebindingExtensions.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Runtime/Actions/InputActionRebindingExtensions.cs @@ -321,7 +321,25 @@ public static string GetBindingDisplayString(this InputAction action, InputBindi if (bindings[i].isPartOfComposite) continue; if (!bindingMask.Matches(bindings[i])) - continue; + { + // Composites are filtered atomically: any matching part promotes the whole + // composite, consistent with how the index-based GetBindingDisplayString + // overload below treats composites as one display unit; per-part filtering + // would require a separate API. + if (!bindings[i].isComposite) + continue; + var anyPartMatches = false; + for (var partIndex = i + 1; partIndex < bindings.Count && bindings[partIndex].isPartOfComposite; ++partIndex) + { + if (bindingMask.Matches(bindings[partIndex])) + { + anyPartMatches = true; + break; + } + } + if (!anyPartMatches) + continue; + } ////REVIEW: should this filter out bindings that are not resolving to any controls?