---
title: AFS_UI_Menu
product: Advanced Framework Pro
version: 1.0
engine: Unreal Engine 5.8
updated: 2026-10-05
canonical: https://docs.human-codeable.com/plugins/afs-ui-menu.html
---

System

# AFS_UI_Menu

The main menu in VR and desktop variants over shared page data assets, plus the settings pages and setting item widgets.

#### What it gives you

- One menu, two platform variants, shared content
- Pages defined as data assets
- A ready-made settings page

#### Requires

None

#### Required by

None

21 assets14 API members

## Description

The menu ships twice — `WBP_Menu_VR` and `WBP_Menu_Desktop` — over the same page definitions. Pages are `PDA_WidgetPage` data assets naming a widget class and a button label, listed on the pawn's `BPC_Pawn_Menu` component.

That indirection means adding a page is a data change that appears in both variants at once, and a project can reorder or remove pages per pawn without touching either menu widget.

## Setup

1. Enable `AFS_UI_Menu`.
2. Add `BPC_Pawn_Menu` to your pawn.
3. Populate **Pages** with `PDA_WidgetPage` assets. `DA_WidgetPage_Settings_Desktop` and `DA_WidgetPage_Debug` are ready to use.

[![Menu pages listed on the pawn component](../images/AFS_UI_Menu_details-1600.webp?v=a6c4bff5)](../images/AFS_UI_Menu_details-1600.webp?v=a6c4bff5)

Menu pages listed on the pawn component

## Usage

### Adding a page

See [Add a menu page](../workflows/add-menu-page.html).

### Different menus per pawn

The page list lives on the pawn, so a VR pawn and a desktop pawn can offer different pages.

[![The VR menu](../images/AFS_UI_Menu_vr-1600.webp?v=789b4a42)](../images/AFS_UI_Menu_vr-1600.webp?v=789b4a42)

The VR menu

## Key properties

| Property | When to change |
|---|---|
| `Pages` | On `BPC_Pawn_Menu`, to change which pages appear and in what order |

## Extending

Derive your page widgets from `WBP_Base`. To restyle the menu itself, derive from `WBP_Menu_VR` or `WBP_Menu_Desktop`.

## Example map

The menu in `Map_Examples_Lobby` is the shipped menu with navigation, settings and debug pages.

## Troubleshooting

**A page does not appear.** Its data asset is not in the pawn's **Pages** list — the menu reads the list from the pawn, not from the level.

## API reference

Every blueprint asset in this plugin. Expand an asset to see its members.

### Components

**BPC_Pawn_Menu**1 members

extends `ActorComponent`

Pawn component listing the pages the in-game menu offers. Add it to a pawn and fill in Pages; the desktop and VR menu widgets read the list back off the pawn to build their navigation, so one menu widget serves every pawn and the pages are configured per pawn instead. Without it the menu has nothing to show.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Pages`Content | `ST_Menu_Page[]` | Top level entries of the pawn's menu, each holding the button that opens it and the widget pages shown once it is open. The menu widgets look the array up by index the moment a menu button is selected, so an entry whose page list is empty opens an empty subpage. |

### Widgets

**WBP_Menu_Desktop**1 members

extends `WBP_Base`

Desktop in-game menu: a vertical button bar in a side scaffold, with the chosen entry building a subpage beside it. The pages behind each entry come from the pawn's menu component, so configure the menu there and leave this widget alone. Used by the showroom's desktop pawn.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_Menu_VR**2 members

extends `WBP_Base`

VR in-game menu: logo, a vertical pagination list and a quit button in an expanding scaffold, with the chosen entry building a subpage next to it. Pages come from the player pawn's menu component, and quitting asks for confirmation in an overlay first. Opened from a motion controller, as the showroom hands and controllers do.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |
| event | `ConfirmationPressed_Event` | `(Confirm: bool)` | Handles the answer coming back from the quit confirmation overlay. Quits the game to the platform when Confirm is true; a refusal closes the overlay and leaves the menu as it was. |

### Widgets/Helper

**WBP_Menu_Desktop_Subpage**1 members

extends `WBP_Base`

One entry's worth of the desktop menu: a horizontal pagination row above a switcher that creates the selected page's widget. Initiate With Pages fills it from a list of widget page data assets, and the row collapses when there is only one page. Created by the desktop menu; not something to place yourself.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `InitiateWithPages` | `(Pages: PDA_WidgetPage[])` | Stores the page assets handed over, adds a tab for each of their buttons and selects the first, which brings its widget up. The tab row collapses when only one page was passed, so a single page entry shows nothing but its content. Called by the desktop menu as it creates the subpage. |

**WBP_Menu_VR_Subpage**1 members

extends `WBP_Base`

One entry's worth of the VR menu: a horizontal pagination row above a switcher that creates the selected page's widget and removes the previous one after it has faded. Initiate With Pages fills it from widget page data assets and collapses the row when there is only one. Created by the VR menu; not something to place yourself.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `InitiateWithPages` | `(Pages: PDA_WidgetPage[])` | Stores the page assets handed over, adds a tab for each of their buttons and selects the first, which brings its widget up. The tab row collapses when only one page was passed, so a single page entry shows nothing but its content. Called by the wrist menu as it creates the subpage. |

### Widgets/Settings

**WBP_Settings_Desktop_Gameplay**0 members

extends `WBP_Base`

Gameplay tab of the desktop settings screen: a scrolling column that as shipped holds a single row, the theme selector. Add setting items to it to give your project's gameplay options a home, or copy it as the pattern for a tab of your own.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_Desktop_Graphics**0 members

extends `WBP_Base`

Graphics tab of the desktop settings screen: a scrolling column of setting rows bound to the console-variable settings presets, covering pixel density, shadows, post process, effects, fixed foveated rendering, foliage, textures and view distance. Copy it and change the preset on each row to offer a different set.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_Desktop_Sound**0 members

extends `WBP_Base`

Sound tab of the desktop settings screen: sliders bound to the master, music, effects and voice volume settings presets. Copy it and point each slider at a different preset if your project mixes its audio some other way.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_Mobile_Gameplay**0 members

extends `WBP_Base`

Gameplay tab of the mobile settings screen: setting rows bound to the comfort and interaction presets, laid out in the widget tree with no logic behind them. Unlike the VR tab it does not collapse anything, so every row stays visible. Copy it and change the preset on each row to offer a different set.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_Mobile_Graphics**0 members

extends `WBP_Base`

Graphics tab of the mobile settings screen, bound to the console-variable quality presets. The mobile counterpart of the desktop tab, with the settings a phone can actually act on.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_Mobile_Sound**0 members

extends `WBP_Base`

Sound tab of the mobile settings screen: sliders bound to the master, music, effects and voice volume presets.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_VR_Gameplay**0 members

extends `WBP_Base`

Gameplay tab of the VR settings screen, and the one that matters most in a headset: the comfort rows bound to their settings presets. The teleport, locomotion and turn toggles each collapse the rows beneath them when switched off, so options that no longer apply disappear instead of sitting there inert. The tab to copy when building a comfort screen of your own.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_VR_Graphics**0 members

extends `WBP_Base`

Graphics tab of the VR settings screen, bound to the console-variable quality presets. The VR counterpart of the desktop tab.

No editor-visible members; this asset configures defaults only.

**WBP_Settings_VR_Sound**0 members

extends `WBP_Base`

Sound tab of the VR settings screen: sliders bound to the master, music, effects and voice volume presets.

No editor-visible members; this asset configures defaults only.

### Widgets/Settings/Helper

**WBP_SettingItem**3 members

extends `WBP_Base`

Base widget for one row of a settings screen: an info row carrying the setting's name and caption with a named slot for the control. Set Settings to the settings value class the row edits and it does the rest. Add one of the toggle, slider, selector, colour picker or drop-down variants, or subclass this when the control is your own.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Settings`Settings | `class<BP_Value_Settings>` | Value class of the setting this row edits, picked per instance in the designer or passed in when the row is spawned. The shared object for that class lives on the game state's settings component, which creates it on first use. Leave it unset and the row has nothing to read from or write to. |
| fn | `WidgetElement_getNamedSlots`Slots | `(out Slots: NamedSlot[])` | Returns the named slots this element exposes so that the tree walk can descend into their children. Return an empty list and the element is treated as a leaf, which means anything parented into a slot you do not list is never initiated or themed. |
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_SettingItem_Boolean_Toggle**1 members

extends `WBP_SettingItem`

Settings row whose control is a toggle, aligned to the right of the row. Point Settings at a boolean settings value class to put that setting on a screen. Unused as shipped, so it is there for you to place.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_SettingItem_Color_Picker**1 members

extends `WBP_SettingItem`

Settings row whose control is a colour picker. Point Settings at a colour settings value class to let the player choose it on a settings screen. Unused as shipped, so it is there for you to place.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_SettingItem_Float_Slider**1 members

extends `WBP_SettingItem`

Settings row whose control is a slider. Point Settings at a float settings value class; the shipped graphics and sound tabs use it for pixel density and for the four volume mixes.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_SettingItem_Integer_Selector**1 members

extends `WBP_SettingItem`

Settings row whose control steps through whole numbers. Point Settings at an integer settings value class; the shipped graphics tab uses it for every quality level it offers.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_SettingItem_Name_DropDown**1 members

extends `WBP_SettingItem`

Settings row whose control is a drop-down of named options. Point Settings at a name settings value class; the shipped gameplay tab uses it for the theme selector.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `WidgetElement_PostInitiate`Style | `()` | Called on every element once the entire tree has been initiated and themed. Implement it for set-up that needs the finished tree, such as measuring or reading the state of a sibling. |

**WBP_SettingsFrame_Buttons**0 members

extends `WBP_Base`

Save and Reset buttons a settings frame shows along its foot, and they do the work themselves rather than reporting to the frame: Reset calls Reset All Settings on the game state's settings component, and Save calls Save All Settings and raises a notification confirming it. Subclass it to change what the row offers.

No editor-visible members; this asset configures defaults only.
