Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.


Inherits: XRNode3D < Node3D < Node < Object

A spatial node representing a spatially-tracked controller.


This is a helper spatial node that is linked to the tracking of controllers. It also offers several handy passthroughs to the state of buttons and such on the controllers.

Controllers are linked by their ID. You can create controller nodes before the controllers are available. If your game always uses two controllers (one for each hand), you can predefine the controllers with ID 1 and 2; they will become active as soon as the controllers are identified. If you expect additional controllers to be used, you should react to the signals and add XRController3D nodes to your scene.

The position of the controller node is automatically updated by the XRServer. This makes this node ideal to add child nodes to visualize the controller.

As many XR runtimes now use a configurable action map all inputs are named.




get_float ( StringName name ) const


get_input ( StringName name ) const


get_tracker_hand ( ) const


get_vector2 ( StringName name ) const


is_button_pressed ( StringName name ) const


button_pressed ( String name )

Emitted when a button on this controller is pressed.

button_released ( String name )

Emitted when a button on this controller is released.

input_float_changed ( String name, float value )

Emitted when a trigger or similar input on this controller changes value.

input_vector2_changed (