Gamepad¶
Category: Listener Tier: Basic
Purpose¶
Detects gamepad input across buttons, D-Pad directions, analog stick axes, and analog triggers.
Visual Reference¶

When To Use¶
Character Movement
Gamepad(Axis Left Stick X Any, expose=move_x) -> Motion(vector.x = {move_x})
Gamepad(Axis Left Stick Y Any, expose=move_z) -> Motion(vector.z = {-move_z})
Vehicle Steering / Throttle
Gamepad(Axis Left Stick X Any, expose=steer_cmd) -> Vehicle3D(steer_input = {steer_cmd})
Gamepad(Trigger RT Hold, expose=throttle_cmd) -> Vehicle3D(throttle_input = {throttle_cmd})
Gamepad(Trigger LT Hold, expose=brake_cmd) -> Vehicle3D(brake_input = {brake_cmd})
Menu Navigation
Gamepad(D-Pad Up Press) -> PRINT / Variable / Message
Gamepad(D-Pad Down Press) -> PRINT / Variable / Message
Gamepad(Button A Press) -> confirm
Gamepad(Button B Press) -> back
Runtime Behavior¶
Button Uses native joy button state and edge tracking.
Press: true once when the button goes from up to downRelease: true once when the button goes from down to upHold: true continuously while the button remains down
D-Pad Uses the same native button-state edge logic as standard buttons.
Press: fires when the selected D-Pad direction first engagesRelease: fires when that direction is releasedHold: stays true while the direction is held
Axis Reads the configured stick axis, applies dead-zone filtering, then evaluates against the selected direction and threshold.
Positive: active whenaxis_value > thresholdNegative: active whenaxis_value < -thresholdAny: active whenabs(axis_value) > threshold
Axis now supports full analog edge tracking:
Press: fires once when the filtered value crosses into the active threshold regionRelease: fires once when it exits that threshold regionHold: stays true while it remains inside that region
Trigger
Reads the configured trigger axis, applies dead-zone filtering, then compares against axis_threshold.
Press: fires once when trigger value crosses above thresholdRelease: fires once when it falls back below thresholdHold: stays true while above threshold
Properties¶
Property |
Type |
Default |
Notes |
|---|---|---|---|
Device |
int |
0 |
Gamepad device ID (0-7, -1 for any) |
Input Type |
option |
Button |
Type of input |
Button |
option |
A |
[Button] Which button |
Axis |
option |
Left Stick X |
[Axis] Which analog stick |
D-Pad |
option |
Up |
[D-Pad] Direction |
Trigger |
option |
LT |
[Trigger] Left or Right trigger |
Event |
option |
Press |
When to fire: edge press, edge release, or continuous hold/threshold-active |
Direction |
option |
Positive |
[Axis] Which direction to detect |
Threshold |
float |
0.5 |
[Axis/Trigger] Minimum value to trigger |
Dead Zone |
float |
0.2 |
Ignore input below this value |
Expose Value |
bool |
False |
[Axis/Trigger] Write the raw analog value into a variable every tick |
Variable |
variable_name |
[Axis/Trigger] Variable that receives the analog value |
|
Scope |
option |
Local |
Where exposed variables are written (shared by both exposure blocks below) |
Expose Data |
bool |
False |
Write device id, input type, code, value, and active flag into variables when the listener fires |
Device Var |
variable_name |
Variable that receives the device id |
|
Type Var |
variable_name |
Variable that receives the input type |
|
Code Var |
variable_name |
Variable that receives the input code |
|
Value Var |
variable_name |
Variable that receives the input value |
|
Active Var |
variable_name |
Variable that receives whether the input is active |
|
Expose Prefix |
string |
gamepad |
Compatibility fallback when explicit output variables are empty |
Invert |
bool |
False |
Trigger when NOT pressed/moved |
Notes¶
Dead-zone values near
0.1 .. 0.2are usually appropriate for healthy controllers.Larger dead-zones can hide stick drift on worn hardware.
Trigger thresholds around
0.1 .. 0.3feel responsive for brake/throttle style input.For clean logs on
Hold, use aDelaylistener into the same gate to throttle output.
Last Updated: April 18, 2026
Version: v0.8.98.2-dev1