This feature is in an Experimental state so you can try it out, provide feedback, and see what we are planning. You cannot publish a project that uses Developer Customizable Touchscreen Controls at this time. Please keep in mind that we do not guarantee backward compatibility for assets created at the experimental stage. The APIs for these features are subject to change, and we may remove entire Experimental features or specific functionality at our discretion.
The default touchscreen control set — actions such as Jump, Shoot, Reload, Aim, Crouch, and Sprint — can be repositioned anywhere on the HUD. You can also configure multiple layouts to switch between, and explicitly hide individual controls your experience does not use.
This is the developer-controlled version of touchscreen layout customization. Player-controlled layout customization remains a separate, pre-existing capability. This feature does not change it.
Using the HUD Controller Device
Build a touch layout as an Unreal Motion Graphics (UMG) User Widget, then assign it to a HUD Controller device in your island. The HUD Controller device replaces the default touch control positions with the positions in your widget at runtime.
To customize the default touchscreen controls:
In Unreal Editor for Fortnite (UEFN), create a standard User Widget to hold your touch layout.
Add a Canvas layout panel as your root widget.
Add a Touch Control Layout Override widget for each default control you want to reposition.
Touch Controls that are not added to the standard layout appear as their default.
For each one, set:
Action — the touchscreen action this button represents an enum value: (Jump, Aim, Shoot, Crouch, Sprint, and so on).
Hide from Layout — choose whether players can access the button.
Make sure your game does not require the action you are hiding, as players on touch devices cannot use the action if hidden.
Icon Override (optional) — a texture to display in place of the default icon.
Color Override (optional) — a tint applied to the button.
Position and size each button on the widget canvas. The HUD Controller Device uses the widget's canvas slot anchors to place the live touch controls.
Place a HUD Controller device in your island and assign your new layout to the device Override Touch Layout property.
Enable the HUD Controller device. When you enable the device, it replaces the default touch positions within your layout.
To swap layouts at runtime (for example, when a player enters a different game mode), enable a different HUD Controller Device that points to a different User Widget.
If no HUD Controller Device with an Override Touch Layout is active, the experience falls back to the default Fortnite touchscreen controls.
Touchscreen Controls for Disabled Inputs Are Hidden by Default
If you unsubscribe from a default action in Verse, the engine automatically hides the corresponding touchscreen button.
Use this when your experience uses a minimal or custom control set (for example, a one-button game that only needs Jump). The engine recognizes that the action does not apply to your game and suppresses showing the touchscreen button, rather than relying on workarounds like hiding the character or having default actions run silently in the background.
Input Mapping Context (IMC). Adding or removing an IMC in Verse shows or hides every default touchscreen button associated with that context. Pre-existing IMCs include TraversalMapping (movement and jump-class actions) and RangedWeaponMapping (weapon-class actions); both live in /Fortnite.com/Input/Character.
Re-adding an IMC or re-subscribing to an action restores its buttons with no duplicates.
To hide every button in a mapping context, remove the context with player_input.RemoveInputMapping. To bring the buttons back, add it with player_input.AddInputMapping:
if (PlayerInput := GetPlayerInput[Player]):
# Hide every default touchscreen button in the ranged-weapon context
PlayerInput.RemoveInputMapping(RangedWeaponMapping)
# Later, restore them
PlayerInput.AddInputMapping(RangedWeaponMapping)To hide an individual action's button, do not subscribe to its events on input_events. To make the button appear and respond to taps, subscribe to TriggerActivationEvent (or another event on input_events) and cancel that subscription when you no longer want the button visible:
if (PlayerInput := GetPlayerInput[Player]):
InputEvents := PlayerInput.GetInputEvents(Reload)
# Subscribe — the Reload touchscreen button appears
Subscription := InputEvents.TriggerActivationEvent.Subscribe(OnReloadTriggered)
# Cancel — the Reload touchscreen button is hidden again
Subscription.Cancel()The input_events object also exposes BeginDetectEvent, DetectionOngoingEvent, EndDetectEvent, and CancelActivationEvent for richer input handling. Subscribing to any of them counts as subscribing to the action for visibility purposes.