On-screen Controls
Configure the native on-screen touch controls for your scene.
On the mobile client, players interact with your scene through a set of native on-screen controls — a virtual joystick, a crosshair, and a gamepad of buttons. The TouchScreenControls component lets your scene reshape that HUD: declutter it, hide the joystick or crosshair, change what the large central button does, swap a button's glyph for your own icon, or hide buttons entirely and replace them with your own UI.

How the button layout works
The gamepad buttons form a single priority stack. The order is fixed:
IA_JUMPIA_POINTERIA_PRIMARY(E)IA_SECONDARY(F)IA_ACTION_3(1)IA_ACTION_4(2)IA_ACTION_5(3)IA_ACTION_6(4)
The on-screen positions are fixed too. The visible buttons fill those positions from the top of the stack down — so what you change is which buttons are visible and which one leads, not their order.
Hide a button (any button, including jump)
Every lower-priority button moves up to fill the gap. Hide jump and IA_POINTER takes the central spot.
Leave the stack alone
The first button (IA_JUMP) is the large central button; the next buttons fill the surrounding slots.
Set a main button with mainAction
That action jumps to the front and becomes the central button; every other button keeps its normal order.
Set a main button that is also hidden
Hiding wins — the button stays hidden.
Leave 5 or fewer buttons visible
All of them show directly (the central button plus up to four around it); there is no "+" menu.
Leave more than 5 buttons visible
The "+" takes the last slot, so four show directly (the central button plus three) and the rest sit behind the "+" overflow toggle.

Common tasks
TouchScreenControls ships a set of convenience helpers. Each one writes the component onto the scene's RootEntity (where the client reads it) and merges with the current value, so you can call them from anywhere.
Change the main button — make the large central button trigger a different action:
Hide the joystick or crosshair — remove the movement stick and/or the aiming reticle, and bring them back with their show counterparts:
Hide specific buttons — pass the actions you want gone (the rest cascade up):
Hide or show every button — clear the HUD, or reset it:
showAll() only affects the gamepad buttons — it doesn't restore a hidden joystick or crosshair. Use showJoystick() / showCrosshair() for those.
Replace a button's icon — for full control (custom icons, several changes at once), write the raw component on engine.RootEntity:
The helpers at a glance:
setMainAction(action)
Sets which action the large central button triggers.
hideJoystick()
Hides the native virtual joystick.
showJoystick()
Shows the native virtual joystick again.
hideCrosshair()
Hides the on-screen crosshair / reticle.
showCrosshair()
Shows the on-screen crosshair / reticle again.
hide(actions)
Hides the given gamepad buttons (merged into the current config).
hideAll()
Hides every gamepad button.
showAll()
Shows every gamepad button (clears the button hide list). Does not affect the joystick/crosshair.
Properties
Write these directly when you use createOrReplace:
hideJoystick
boolean
Hides the native virtual movement joystick.
hideCrosshair
boolean
Hides the on-screen crosshair / reticle.
mainAction
Moves this action to the front of the stack, making it the large central button; the other buttons keep their order. Only gamepad actions are valid (see below). When unset, the first visible button (IA_JUMP by default) leads. See How the button layout works.
touchInputs
array
Per-button overrides. A button that isn't listed keeps its default (shown, with its default glyph).
Each touchInputs entry has:
hide
boolean
Hides this button. Default is false (shown). Any button can be hidden, including IA_JUMP — the rest cascade up to fill its place.
icon
TextureUnion (optional)
Overrides the button glyph with a scene image. Use the texture variant with a content-mapped src (an image included in your scene) — { tex: { $case: 'texture', texture: { src: 'images/grab.png' } } }. Only scene-content paths are supported (not external URLs, avatar or video textures). For the jump button this replaces all of its dynamic states (jump / double-jump / glide). If the path can't be resolved, the built-in glyph is used.
Which actions map to which buttons
The InputAction values here are the same ones used across Input on mobile and Click events. These are the actions that map to on-screen buttons:
IA_JUMP
The large central button (default)
IA_POINTER
The interaction button
IA_PRIMARY
The E button
IA_SECONDARY
The F button
IA_ACTION_3 / IA_ACTION_4 / IA_ACTION_5 / IA_ACTION_6
The 1 / 2 / 3 / 4 buttons
IA_ANY and IA_MODIFIER are meta values — they don't map to a button and can't be used here.
Example
To hide the joystick, tuck away the numbered buttons, and give the central jump button a custom icon shipped in your scene:

To replace the native controls entirely, hide them here and build your own touch buttons with UI Input Binding.
Related
Last updated