Quick answer: Use Input.get_action_strength (or get_vector) so per-action deadzone applies. Configure deadzone per action in Project Settings; add radial deadzone in code for 360° sticks.

A platformer’s player drifts slowly when the controller is at rest. Stick at center, character creeps left. Deadzone is set in Project Settings to 0.2, but the drift persists.

The Common Bug

# bypasses deadzone
var x = Input.get_joy_axis(0, JOY_AXIS_LEFT_X)
velocity.x = x * speed

get_joy_axis returns raw -1..1. Deadzone is configured at the action level only; raw axis polling sees noise.

Use Actions

var input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
velocity = input_dir * speed

get_vector uses each action’s deadzone. Configure once in Project Settings → Input Map; works across joystick, keyboard, gamepad.

Add Radial Deadzone

Axial deadzone (default) feels harsh on diagonals. Add radial post-processing:

var input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down", 0.0)
if input_dir.length() < 0.2:
    input_dir = Vector2.ZERO
else:
    # remap [0.2..1] to [0..1]
    input_dir = input_dir.normalized() * remap(input_dir.length(), 0.2, 1.0, 0.0, 1.0)

Pass 0 to disable axial deadzone in get_vector; then handle radial in code. Smoother diagonal feel.

Calibration Per Controller

Different controllers have different drift levels. Allow a user-tunable deadzone in your settings menu, save it to disk, apply at startup. Newer controllers can use lower deadzone; older worn ones need higher.

Verifying

Connect a known-drifty controller. Stick at rest: character does NOT move. Slight stick deflection: still no movement. Past deadzone: smooth proportional movement. Test diagonals; smooth, no axis-aligned bias.

“Deadzone is action-level. Bypass actions with raw axis reads and you bypass deadzone too.”

Steam Deck and Switch Pro controllers especially benefit from radial deadzone — the analog rest noise is uneven across X/Y on those.