From 2f6e6e4cb4c82309758dc53db35a22a2c2b33180 Mon Sep 17 00:00:00 2001 From: Dmytro Ivanov Date: Tue, 31 May 2022 15:36:46 +0200 Subject: [PATCH 1/4] Repro case --- Assets/Tests/InputSystem/CoreTests_Actions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/Tests/InputSystem/CoreTests_Actions.cs b/Assets/Tests/InputSystem/CoreTests_Actions.cs index 77eb5f3c7e..66915d5a2a 100644 --- a/Assets/Tests/InputSystem/CoreTests_Actions.cs +++ b/Assets/Tests/InputSystem/CoreTests_Actions.cs @@ -2004,8 +2004,6 @@ public void Actions_CanCreateActionsWithoutAnActionMap() [Category("Actions")] public void Actions_CanCreateActionAssetWithMultipleActionMaps() { - var gamepad = InputSystem.AddDevice(); - var asset = ScriptableObject.CreateInstance(); var map1 = new InputActionMap("map1"); @@ -2042,6 +2040,8 @@ public void Actions_CanCreateActionAssetWithMultipleActionMaps() // Enable only map1. map1.Enable(); + // Creating gamepad after maps are enabled to test trace catching binding resolve. Case ISXB-29. + var gamepad = InputSystem.AddDevice(); Set(gamepad.leftStick, new Vector2(0.123f, 0.234f), startTime + 0.123); // map1/action1 should have been started and performed. From b1ec971ec7a01a81cbbae6045a9aa13ba60a075e Mon Sep 17 00:00:00 2001 From: Dmytro Ivanov Date: Wed, 1 Jun 2022 14:08:37 +0200 Subject: [PATCH 2/4] Cloning all relevant action map states in the asset --- .../InputSystem/Actions/InputActionTrace.cs | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs b/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs index 3f73921855..1f08a7dc91 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs @@ -438,7 +438,7 @@ private void UnhookOnActionChange() m_OnActionChangeHooked = false; } - private void OnActionChange(object actionOrMap, InputActionChange change) + private void OnActionChange(object actionOrMapOrAsset, InputActionChange change) { // If we're subscribed to all actions, check if an action got triggered. if (m_SubscribedToAll) @@ -448,8 +448,8 @@ private void OnActionChange(object actionOrMap, InputActionChange change) case InputActionChange.ActionStarted: case InputActionChange.ActionPerformed: case InputActionChange.ActionCanceled: - Debug.Assert(actionOrMap is InputAction, "Expected an action"); - var triggeredAction = (InputAction)actionOrMap; + Debug.Assert(actionOrMapOrAsset is InputAction, "Expected an action"); + var triggeredAction = (InputAction)actionOrMapOrAsset; var actionIndex = triggeredAction.m_ActionIndexInState; var stateForAction = triggeredAction.m_ActionMap.m_State; @@ -469,17 +469,20 @@ private void OnActionChange(object actionOrMap, InputActionChange change) if (change != InputActionChange.BoundControlsAboutToChange) return; - // Grab the associated action map. - var action = actionOrMap as InputAction; - InputActionMap actionMap; - if (action != null) - actionMap = action.m_ActionMap; + // Grab the associated action map(s). + if (actionOrMapOrAsset is InputAction action) + CloneActionStateBeforeBindingsChange(action.m_ActionMap); + else if (actionOrMapOrAsset is InputActionMap actionMap) + CloneActionStateBeforeBindingsChange(actionMap); + else if (actionOrMapOrAsset is InputActionAsset actionAsset) + foreach(var actionMapInAsset in actionAsset.actionMaps) + CloneActionStateBeforeBindingsChange(actionMapInAsset); else - { - actionMap = actionOrMap as InputActionMap; - Debug.Assert(actionMap != null, "Given object is neither an InputAction nor an InputActionMap"); - } + Debug.Assert(false, "Expected InputAction, InputActionMap or InputActionAsset"); + } + private void CloneActionStateBeforeBindingsChange(InputActionMap actionMap) + { // Grab the state. var state = actionMap.m_State; if (state == null) From ecb62d72f3e591c2b08056d9b2800af187911e39 Mon Sep 17 00:00:00 2001 From: Dmytro Ivanov Date: Wed, 1 Jun 2022 14:21:55 +0200 Subject: [PATCH 3/4] Changelog --- Packages/com.unity.inputsystem/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.inputsystem/CHANGELOG.md b/Packages/com.unity.inputsystem/CHANGELOG.md index eb6d7804f4..ccb807d3cc 100755 --- a/Packages/com.unity.inputsystem/CHANGELOG.md +++ b/Packages/com.unity.inputsystem/CHANGELOG.md @@ -15,6 +15,7 @@ however, it has to be formatted properly to pass verification tests. - Fixed `{fileID: 0}` getting appended to `ProjectSettings.asset` file when building a project ([case ISXB-296](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-296)). - Fixed `Type of instance in array does not match expected type` assertion when using PlayerInput in combination with Control Schemes and Interactions ([case ISXB-282](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-282)). - Fixed an InvalidOperationException when using Hold interaction, and by extension any interaction that changes to performed state after a timeout ([case ISXB-332](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-330)). +- Fixed `Given object is neither an InputAction nor an InputActionMap` when using `InputActionTrace` on input action from an input action asset ([case ISXB-29](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-29)). ## [1.4.3] - 2022-09-23 @@ -44,7 +45,7 @@ however, it has to be formatted properly to pass verification tests. ## [1.4.1] - 2022-05-30 ### Fixed -- Fixed composite touchscreen controls were not firing an action if screen was touched before enabling the action ([case ISXB-98](https://jira.unity3d.com/browse/ISXB-98)). +- Fixed composite touchscreen controls were not firing an action if screen was touched before enabling the action ([case ISXB-98](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-98)). ## [1.4.0] - 2022-04-10 From d11f511cc445d2976f0b636f22e9c538b74f8bd7 Mon Sep 17 00:00:00 2001 From: Dmytro Ivanov Date: Wed, 1 Jun 2022 15:09:20 +0200 Subject: [PATCH 4/4] Formatting --- .../InputSystem/Actions/InputActionTrace.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs b/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs index 1f08a7dc91..f3d4f377fd 100644 --- a/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs +++ b/Packages/com.unity.inputsystem/InputSystem/Actions/InputActionTrace.cs @@ -475,7 +475,7 @@ private void OnActionChange(object actionOrMapOrAsset, InputActionChange change) else if (actionOrMapOrAsset is InputActionMap actionMap) CloneActionStateBeforeBindingsChange(actionMap); else if (actionOrMapOrAsset is InputActionAsset actionAsset) - foreach(var actionMapInAsset in actionAsset.actionMaps) + foreach (var actionMapInAsset in actionAsset.actionMaps) CloneActionStateBeforeBindingsChange(actionMapInAsset); else Debug.Assert(false, "Expected InputAction, InputActionMap or InputActionAsset");