Skills DirectorySearch all skills ↗

AI agent skill · by @MRCalderon3D

Godot Input Patterns

Implement Godot input through InputMap actions with correct event propagation, device support, and rebinding.

Archived 2026-10-23 · Source updated 2026-08-20 · License: MIT. Check the original repository for the latest version.

SKILL.md instructions

# Godot Input Patterns

## Purpose
Implement Godot input through InputMap actions with correct event propagation, device support, and rebinding.

## Use When
- adding or unifying input handling for a Godot game
- gameplay scripts read raw keycodes, scancodes, or joypad button indices directly
- input behaves differently between gameplay, UI, and pause states and the propagation order is unclear

## Inputs
- list of gameplay actions (move, jump, fire, pause, confirm)
- supported devices (keyboard/mouse, joypad, touch) per platform target
- UI flow and pause/overlay states that consume input
- rebinding and accessibility requirements

## Process
1. define every action in the InputMap (project settings or at startup) and bind devices to actions; gameplay code calls `Input.is_action_*` or handles `InputEvent` actions, never raw keycodes
2. choose polling versus events deliberately: poll continuous state (movement axes via `Input.get_vector`) in `_physics_process`, and handle discrete edges (just pressed/released) through events or `is_action_just_pressed`
3. respect the propagation order — `_input`, then Control `_gui_input`, then `_unhandled_input` — and put gameplay input in `_unhandled_input` so UI consumes events first; call `set_input_as_handled()` explicitly when a layer swallows an event
4. handle joypads through actions with deadzone configured per action, listen to `joy_connection_changed` for hot-plug, and verify mappings on each exported platform
5. for touch targets, decide between `InputEventScreenTouch` handling and `emulate_mouse_from_touch`, and keep on-screen controls as a separate Control layer bound to the same actions
6. implement rebinding by editing InputMap at runtime (`action_erase_events` / `action_add_event`), persist bindings to user settings, and expose them through the accessibility options
7. define how paused state affects input: which nodes keep processing via `process_mode`, and which actions (pause/menu) must work while the tree is paused

## Outputs
- InputMap action inventory with device bindings and deadzones
- propagation rules: which layer handles what, in which callback
- rebinding and persistence design
- device and platform test scenarios (hot-plug, focus loss, touch emulation)

## Quality Bar
- no gameplay script references keycodes, scancodes, or joypad indices outside the InputMap setup
- UI reliably consumes events before gameplay, and nothing double-handles an event after `set_input_as_handled()`
- movement uses `Input.get_vector` (or equivalent) with per-action deadzones, not per-frame keycode checks
- pause/menu actions keep working while the tree is paused, and nothing else does
- rebinds survive a restart and are reflected in any input prompts shown to the player

## Common Failure Modes
- mixing `_input` and `_process` polling for the same action, double-counting presses across frames
- gameplay input in `_input` so UI clicks also fire gameplay actions underneath
- hardcoded joypad button indices that differ between controller types and platforms
- pause menus that cannot be closed because their own input stopped processing with the tree
- touch handled through mouse emulation only, breaking multi-touch (move plus fire) on mobile

## Related Agents
- godot-reviewer
- gameplay-programmer
- ui-programmer

## Related Commands
- input-review
- godot-review
- verify

## Related Skills
- godot-signals-patterns
- godot-scene-architecture

## Notes
- Keep this skill aligned with the relevant rules layer and current project documentation.
- The engine-neutral action-abstraction policy lives in `engineering-common/input-abstraction`; this skill is the Godot-specific implementation of it.

Related skills