Quick answer: The Input Map action is likely missing a gamepad event binding, using the wrong button index, or has a deadzone too high for the analog stick. Add an InputEventJoypadButton or InputEventJoypadMotion event to your action, verify the button/axis index matches your controller, and lower the deadzone from the default 0.5 if analog input is being swallowed.
Here is how to fix Godot Input Map actions not registering gamepad input. You defined an action like “jump” in the Input Map, bound it to a keyboard key, and it works. You plug in a gamepad, press A, and nothing happens. The gamepad is connected — Godot even shows it in the device list — but your action never triggers from controller input. The fix is almost always a binding or deadzone issue.
The Symptom
Keyboard input for your Input Map actions works. Gamepad input does not. Pressing buttons on the controller has no effect. Analog sticks produce no movement. The gamepad works fine in other applications and Godot recognizes it as connected. No errors appear in the output panel.
In some cases, the D-pad works but analog sticks do not, or buttons work but triggers do not. This usually points to a deadzone or axis index problem rather than a complete lack of binding.
What Causes This
1. No gamepad event bound to the action. Adding a key event to an action does not automatically add a gamepad event. Each input device type needs its own binding in the Input Map. If you only added an InputEventKey, gamepad input is not mapped.
2. Wrong button or axis index. Gamepad buttons are indexed numerically (0 = A/Cross, 1 = B/Circle, etc.) following the SDL standard layout. If your controller is not XInput-compatible, the indices may differ. Triggers are axis 6 and 7, not buttons, which catches many developers off guard.
3. Deadzone too high. Godot’s default deadzone for Input Map actions is 0.5. This means the analog stick must be pushed past 50% of its range before the action registers. For subtle movement or slow-walk input, this swallows the signal.
4. Device index filtering. If you set the device index on the input event to a specific number instead of -1 (all devices), it only listens to that one controller. If the controller is assigned a different device ID (common on Linux with hotplug), the binding misses it.
The Fix
Step 1: Add gamepad bindings to the Input Map. Go to Project > Project Settings > Input Map. For each action, click the + button and add the appropriate gamepad event. Use InputEventJoypadButton for buttons and InputEventJoypadMotion for analog sticks and triggers.
Step 2: Verify bindings in code.
func _ready():
# List all events bound to the "jump" action
var events = InputMap.action_get_events("jump")
for event in events:
print("Bound event: %s" % event.as_text())
# List connected gamepads
var pads = Input.get_connected_joypads()
for pad in pads:
print("Pad %d: %s" % [pad, Input.get_joy_name(pad)])
Step 3: Lower the deadzone.
# In Project Settings > Input Map, select the joypad motion event
# and set the deadzone to 0.2 instead of 0.5
# Or set it in code for finer control:
func _process(delta):
# Read raw axis value (no deadzone applied)
var raw_x = Input.get_joy_axis(0, JOY_AXIS_LEFT_X)
var raw_y = Input.get_joy_axis(0, JOY_AXIS_LEFT_Y)
# Apply custom radial deadzone
var input_vec = Vector2(raw_x, raw_y)
if input_vec.length() < 0.15:
input_vec = Vector2.ZERO
else:
input_vec = input_vec.normalized() * ((input_vec.length() - 0.15) / (1.0 - 0.15))
Step 4: Debug raw input events. If bindings and deadzones look correct, check that Godot is receiving the raw events at all:
func _input(event):
if event is InputEventJoypadButton:
print("Button %d pressed: %s" % [event.button_index, event.pressed])
if event is InputEventJoypadMotion:
print("Axis %d value: %f" % [event.axis, event.axis_value])
“The Input Map does not auto-detect gamepad buttons. You must bind them explicitly. Keyboard and gamepad are different event types and the action needs both if you want both to work.”
Why This Works
Godot’s Input Map system is event-type-specific. An action fires only when an event matching one of its bindings occurs. InputEventKey, InputEventJoypadButton, and InputEventJoypadMotion are separate classes. Binding a key does not implicitly bind any gamepad event. The deadzone is applied per-action, meaning even if the hardware sends an axis value of 0.3, Godot discards it if the deadzone is 0.5. Lowering the deadzone or reading raw axis values lets you capture the full range of analog input.
Related Issues
If your gamepad is detected but shows the wrong button mapping, Godot may not have an SDL mapping for your controller model. You can add a custom mapping string via Input.add_joy_mapping() or update the gamecontrollerdb.txt bundled with your export.
For input handling during scene transitions, see Fix: Godot HTTPRequest Timeout on Mobile if your game needs network input on Android where gamepad plus HTTP requests can conflict with threading.
No gamepad binding on the action, no gamepad input. Add the event, lower the deadzone, test with _input.