unity
runtime_error
ai_generated
true
InvalidOperationException: InputAction 'Player/Move' is not enabled. Cannot read value.
ID: unity/input-system-action-not-found
92%Fix Rate
88%Confidence
1Evidence
2023-09-01First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Unity 2022.3 | active | — | — | — |
| Unity 2023.1 | active | — | — | — |
| Unity 2021.3 | active | — | — | — |
| Input System 1.6.0 | active | — | — | — |
Root Cause
An InputAction is being read via ReadValue() before it has been enabled (e.g., before InputSystem.EnableDevice or action map activation).
generic中文
在 InputAction 启用之前(例如在 InputSystem.EnableDevice 或操作映射激活之前)通过 ReadValue() 读取该操作。
Official Documentation
https://docs.unity3d.com/Packages/[email protected]/manual/Actions.htmlWorkarounds
-
90% success Enable the action map before reading values: `InputActionMap actionMap = inputActions.FindActionMap("Player"); actionMap.Enable();` then call `inputActions.FindAction("Move").ReadValue<Vector2>();`
Enable the action map before reading values: `InputActionMap actionMap = inputActions.FindActionMap("Player"); actionMap.Enable();` then call `inputActions.FindAction("Move").ReadValue<Vector2>();` -
95% success Use event-based callbacks instead of polling: `inputActions.Player.Move.performed += ctx => { Vector2 value = ctx.ReadValue<Vector2>(); };`
Use event-based callbacks instead of polling: `inputActions.Player.Move.performed += ctx => { Vector2 value = ctx.ReadValue<Vector2>(); };` -
85% success Delay the first read until after InputSystem.Update() by checking `InputSystem.isInitialized` and using a coroutine.
Delay the first read until after InputSystem.Update() by checking `InputSystem.isInitialized` and using a coroutine.
中文步骤
Enable the action map before reading values: `InputActionMap actionMap = inputActions.FindActionMap("Player"); actionMap.Enable();` then call `inputActions.FindAction("Move").ReadValue<Vector2>();`Use event-based callbacks instead of polling: `inputActions.Player.Move.performed += ctx => { Vector2 value = ctx.ReadValue<Vector2>(); };`Delay the first read until after InputSystem.Update() by checking `InputSystem.isInitialized` and using a coroutine.
Dead Ends
Common approaches that don't work:
-
30% fail
Calling Enable() on the action inside Start() or Awake() may still fail if the InputSystem hasn't initialized yet.
-
50% fail
Disabling and re-enabling the action map in Update() causes repeated overhead and doesn't fix timing.
-
60% fail
Using InputAction.ReadValue<float>() without checking isPressed first can still throw if not enabled.