HomeSystem plugins › AFS_UI_Menu
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

AFM_Settings AFS_UI

Required by

AFE_Showroom AF_Examples

15 assets23 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
AFS_UI_Menu_details.pngMenu pages listed on the pawn component
Menu pages listed on the pawn component

Usage

Adding a page

See Add a menu page.

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
AFS_UI_Menu_vr.pngThe VR menu
The VR menu

Key properties

PropertyWhen to change
PagesOn 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_Menu1 members
extends ActorComponent
KindNameSignatureDescription
varPagesContentST_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_Desktop2 members
extends WBP_Base
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Left empty here, so the vertical bar keeps the buttons it was given in the designer; the entries in Pages on the pawn's menu component are only read once a button is selected.
eventOnButtonSelectionChanged(Group: WBP_Group_Button)Called whenever the selection in the vertical button bar changes. Empties the switcher of any subpage that is already showing, then either leaves the panel blank when nothing is selected, or builds a subpage for the selected index and hands it the pages of the matching entry on the owning actor's menu component.
WBP_Menu_VR5 members
extends WBP_Base
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Left empty on the wrist menu, so its tab column keeps the tabs set in the designer; the entries in Pages on the pawn's menu component are only read once a tab is selected.
eventOnButtonSelectionChanged(Group: WBP_Group_Button)Called whenever the tab selection in the vertical column changes; builds a subpage for the selected index and hands it the pages of the matching entry on the player pawn's menu component. The pawn is taken as player zero, and there is no branch for an empty selection, so the column has to keep a tab selected at all times.
eventWidgetElement_Initiate(Parent: WBP_Base, ReplicationIndex: name)Empty override of the set-up call made once as the owning widget walks its tree. The base version, which caches the parent, builds the replication identifier and registers the widget for replication, is not run; the wrist menu is spawned as the root of its own tree and takes no part in replication.
eventOnClicked(Button: WBP_Button)Called when the quit button under the tab column is pressed. Opens a blocking confirmation overlay asking whether to quit the game, with a cancel and a quit button, and subscribes Confirmation Pressed to the answer it reports.
eventConfirmationPressed_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_Subpage2 members
extends WBP_Base
KindNameSignatureDescription
eventInitiateWithPages(const 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.
eventOnButtonSelectionChanged(Group: WBP_Group_Button)Called whenever the tab selection changes; brings the widget of the page at the selected index into the content area. That widget is created on first use and then kept, so a tab you return to is still in the state you left it.
WBP_Menu_VR_Subpage2 members
extends WBP_Base
KindNameSignatureDescription
eventInitiateWithPages(const 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.
eventOnButtonSelectionChanged(Group: WBP_Group_Button)Called whenever the tab selection changes; brings the widget of the page at the selected index into the content area. The switcher here removes widgets once they have faded out, so every tab is rebuilt from scratch and loses whatever state it held.

Widgets/Settings

WBP_Settings_Desktop3 members
extends WBP_Base
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Left empty here, as the graphics, sound and gameplay pages and the tabs that switch between them are all wired up in the designer.
eventOnClicked(Button: WBP_Button)Called when the reset button is pressed, and asks the settings component on the game state to reset every value object it holds. Only settings already created by being read or shown are affected, and nothing is written to the save slot.
eventOnClicked_1(Button: WBP_Button)Called when the save button is pressed, and left empty. Values are not written to the save slot until you run Save All Settings on the settings component of the game state from here.
WBP_Settings_Desktop_Gameplay0 members
extends WBP_Base

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

WBP_Settings_Desktop_Graphics0 members
extends WBP_Base

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

WBP_Settings_Desktop_Sound0 members
extends WBP_Base

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

Widgets/Settings/Helper

WBP_SettingItem3 members
extends WBP_Base
KindNameSignatureDescription
varSettingsSettingsClass<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.
fnWidgetElement_getNamedSlots(out Slots: NamedSlot[])Returns the single config item slot that sits beside the info row's title and caption, so that the control you place there is initiated and themed with the rest of the tree.
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Empty on the base row, which is where a row of your own resolves Settings into its shared value object and binds the control in the config slot to it.
WBP_SettingItem_Boolean_Toggle1 members
extends WBP_SettingItem
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Empty on the toggle row, so nothing yet ties the switch in the config slot to the boolean value object named by Settings; that binding belongs here.
WBP_SettingItem_Color_Picker1 members
extends WBP_SettingItem
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Empty on the colour row, so the swatch in the config slot neither shows the value object named by Settings nor writes a new colour back to it until you bind it here.
WBP_SettingItem_Float_Slider1 members
extends WBP_SettingItem
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Empty on the slider row, so the slider in the config slot is not yet driven by the float value object named by Settings, and a drag is not written back to it.
WBP_SettingItem_Integer_Selector1 members
extends WBP_SettingItem
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Empty on the selector row; this is where the button group in the config slot is handed the integer value object named by Settings, which supplies both the choices to show and the index selected.
WBP_SettingItem_Name_DropDown1 members
extends WBP_SettingItem
KindNameSignatureDescription
eventWidgetElement_PostInitiate()Called once the whole widget tree has been initiated and themed. Empty on the drop-down row; this is where the list in the config slot is handed the name value object named by Settings, which supplies the identifiers and labels to offer.