-
Notifications
You must be signed in to change notification settings - Fork 332
FIX: Avoid disabling project-wide actions on shutdown #2346
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
c562118
0ed73d8
e917c04
61807cc
b087ccd
9cdf098
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -37,6 +37,7 @@ public class InputForUITests : InputTestFixture | |
| readonly List<Event> m_InputForUIEvents = new List<Event>(); | ||
| private int m_CurrentInputEventToCheck; | ||
| InputSystemProvider m_InputSystemProvider; | ||
| private bool m_ClearedMockProvider; | ||
|
|
||
| private InputActionAsset storedActions; | ||
|
|
||
|
|
@@ -45,6 +46,7 @@ public override void Setup() | |
| { | ||
| base.Setup(); | ||
| m_CurrentInputEventToCheck = 0; | ||
| m_ClearedMockProvider = false; | ||
|
|
||
| storedActions = InputSystem.actions; | ||
|
|
||
|
|
@@ -59,7 +61,8 @@ public override void Setup() | |
| public override void TearDown() | ||
| { | ||
| EventProvider.Unsubscribe(InputForUIOnEvent); | ||
| EventProvider.ClearMockProvider(); | ||
| if (!m_ClearedMockProvider) | ||
| EventProvider.ClearMockProvider(); | ||
| m_InputForUIEvents.Clear(); | ||
|
|
||
| InputSystem.manager.actions = storedActions; | ||
|
|
@@ -92,6 +95,34 @@ public void InputSystemActionAssetIsNotNull() | |
| "Test is invalid since InputSystemProvider actions are not available"); | ||
| } | ||
|
|
||
| [Test] | ||
| [Category(kTestCategory)] | ||
| public void Shutdown_DoesNotDisableProjectWideActionsAsset() | ||
| { | ||
| var asset = ScriptableObject.CreateInstance<InputActionAsset>(); | ||
| var uiMap = new InputActionMap("UI"); | ||
| uiMap.AddAction("Point", InputActionType.PassThrough, "<Mouse>/position"); | ||
| uiMap.AddAction("Navigate", InputActionType.PassThrough, "<Gamepad>/leftStick"); | ||
| uiMap.AddAction("Submit", InputActionType.Button, "<Keyboard>/enter"); | ||
| uiMap.AddAction("Cancel", InputActionType.Button, "<Keyboard>/escape"); | ||
| uiMap.AddAction("Click", InputActionType.PassThrough, "<Mouse>/leftButton"); | ||
| uiMap.AddAction("MiddleClick", InputActionType.PassThrough, "<Mouse>/middleButton"); | ||
| uiMap.AddAction("RightClick", InputActionType.PassThrough, "<Mouse>/rightButton"); | ||
| uiMap.AddAction("ScrollWheel", InputActionType.PassThrough, "<Mouse>/scroll"); | ||
| asset.AddActionMap(uiMap); | ||
|
|
||
| InputSystem.s_Manager.actions = asset; | ||
|
|
||
| m_InputSystemProvider.Initialize(); | ||
| Assert.That(asset.enabled, Is.True, "Project-wide actions should be enabled by provider initialization."); | ||
|
|
||
| EventProvider.ClearMockProvider(); | ||
| m_ClearedMockProvider = true; | ||
| Assert.That(asset.enabled, Is.True, "Project-wide actions must remain enabled after provider shutdown."); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
If the provider was responsible for enabling the "UI" map (which it will be here since the asset is newly created and its maps are disabled by default), it will disable that map during shutdown. Since no other maps are enabled in this test asset, 🤖 Helpful? 👍/👎 |
||
|
|
||
| Object.DestroyImmediate(asset); | ||
| } | ||
|
|
||
| [Test] | ||
| [Category(kTestCategory)] | ||
| // Checks that mouse events are ignored when a touch is active. | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -17,6 +17,8 @@ internal class InputSystemProvider : IEventProviderImpl | |||||
|
|
||||||
| DefaultInputActions m_DefaultInputActions; | ||||||
| InputActionAsset m_InputActionAsset; | ||||||
| InputActionMap m_UIActionMap; | ||||||
| bool m_ShouldDisableUIActionMapOnUnregister; | ||||||
|
|
||||||
| // Note that these are plain action references instead since InputActionReference do | ||||||
| // not provide any value when this integration doesn't have any UI. If this integration | ||||||
|
|
@@ -636,14 +638,11 @@ void RegisterActions() | |||||
| m_RightClickAction = FindActionAndRegisterCallback(Actions.RightClickAction, OnRightClickPerformed); | ||||||
| m_ScrollWheelAction = FindActionAndRegisterCallback(Actions.ScrollWheelAction, OnScrollWheelPerformed); | ||||||
|
|
||||||
| // When adding new actions, don't forget to add them to UnregisterActions | ||||||
| if (InputSystem.actions == null) | ||||||
| { | ||||||
| // If we've not loaded a user-created set of actions, just enable the UI actions from our defaults. | ||||||
| m_InputActionAsset.FindActionMap("UI", true).Enable(); | ||||||
| } | ||||||
| else | ||||||
| m_InputActionAsset.Enable(); | ||||||
| // Only touch the UI map so we don't change the enabled state of unrelated maps. | ||||||
| m_UIActionMap = m_InputActionAsset?.FindActionMap("UI", true); | ||||||
| m_ShouldDisableUIActionMapOnUnregister = m_UIActionMap != null && !m_UIActionMap.enabled; | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Additionally, if the user's UI actions are located in a map with a different name, only enabling the "UI" map will result in the integration failing to work because the relevant actions will remain disabled. The previous implementation was safer as it enabled the entire asset when a user-provided asset was detected.
Suggested change
🤖 Helpful? 👍/👎 |
||||||
| if (m_ShouldDisableUIActionMapOnUnregister) | ||||||
| m_UIActionMap.Enable(); | ||||||
| } | ||||||
|
|
||||||
| void UnregisterAction(ref InputAction action, Action<InputAction.CallbackContext> callback = null) | ||||||
|
|
@@ -664,8 +663,11 @@ void UnregisterActions() | |||||
| UnregisterAction(ref m_RightClickAction, OnRightClickPerformed); | ||||||
| UnregisterAction(ref m_ScrollWheelAction, OnScrollWheelPerformed); | ||||||
|
|
||||||
| if (m_InputActionAsset != null) | ||||||
| m_InputActionAsset.Disable(); | ||||||
| if (m_ShouldDisableUIActionMapOnUnregister && m_UIActionMap != null) | ||||||
| m_UIActionMap.Disable(); | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
In the test, the If the intention is to prevent side-effects on the project-wide asset, you should consider skipping the 🤖 Helpful? 👍/👎 |
||||||
|
|
||||||
| m_UIActionMap = null; | ||||||
| m_ShouldDisableUIActionMapOnUnregister = false; | ||||||
| } | ||||||
|
|
||||||
| void SelectInputActionAsset() | ||||||
|
|
||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For better maintainability and consistency with the rest of the test class, consider using the public
InputSystem.actionsproperty instead of the internals_Managerfield. This aligns with the access pattern used in theSetupmethod.🤖 Helpful? 👍/👎