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.