CalmUI
Unreal Engine

Gamepad

Spatial navigation, remapping, hot-plug state, and :gamepad-focus for each Local Player.

D-pad moves focus. Face button bottom accepts. Face button right is Back. Face button left (X / □) and face button top (Y / △) are the focused control's @secondary and @tertiary activations, "□ Drop", "△ Compare", which bubble to the screen root like Accept and have no default action (see Secondary and tertiary activations and the Unreal delivery details). CSS may use :gamepad-focus in addition to :focus. A control authored with ui:hold-ms activates only after the face button has been held for that long (the release before that cancels); it then carries :holding and --calmui-hold-progress for the duration - see Hold to activate. Views open without a focus ring for pointer users; the first directional input selects an eligible autofocus control, falling back to the lowest authored focus order. In Studio's source editor, put autofocus on the intended native control:

<button autofocus>Load slot</button>

Use :autofocus="initialFocus" for a boolean binding. A reusable component must forward that prop onto its focusable control. As with other boolean attributes, omit the attribute to disable it; autofocus="false" still means present. Hidden, disabled and non-focusable controls are skipped. Multiple eligible defaults use authored focus order. Ordinary patches preserve the current focus; the attribute does not change Tab order or steal focus when it becomes true. When a modal or a removed control changes the selection during a tree update, Unreal delivers the resulting focus event after binding the current controls. Repeated tree updates with the same selection do not repeat @focus. Managed screens activated from controller focus immediately retain controller focus on their saved selection, or choose the initial control when none is saved.

Hidden or disabled explicit ui:nav-* targets are skipped through spatial fallback, so Store-driven state changes do not leave the player trapped on the previous control. When a modal opens from controller focus, its eligible default action receives the gamepad focus ring; a pointer-opened modal keeps ordinary focus styling.

Explicit ui:nav-up / ui:nav-down attributes appear on Showcase MenuButton for ordered menus.

Check one complete controller path

  1. Open the View in Unreal with the gamepad you intend to support.
  2. Press a direction and confirm the intended first control receives :gamepad-focus.
  3. Move through every enabled control in both directions. Disable or hide one target through the Store and repeat the route.
  4. Open a modal from controller focus. Confirm focus moves inside it, background controls stop responding, and Back follows the dialog's policy.
  5. Close the modal and confirm focus returns to the previous eligible control.
  6. Disconnect and reconnect the controller, then test any remapped profile.

Studio's forced gamepad-focus state checks styling. The real Unreal path checks Enhanced Input, Local Player ownership, modal focus, hot-plug state, and gameplay conflicts.

Use a UCalmUiInputProfile to replace the defaults. OnCalmUiInputMethodChanged lets prompts switch between keyboard/mouse and gamepad without polling. See Input profiles and rebinding.

CalmUI does not redistribute controller glyph families. Supply only glyph assets that your project is licensed to ship; platform key names do not grant artwork redistribution rights.

On this page