---
title: AFE_Showroom
product: Advanced Framework Pro
version: 1.0
engine: Unreal Engine 5.8
updated: 2026-10-05
canonical: https://docs.human-codeable.com/plugins/afe-showroom.html
---

Environment

# AFE_Showroom

The demo shell: game mode, game state, player controller, the three showroom pawns, motion controller variants and the navigation menu.

#### What it gives you

- A working project shell to subclass
- Pawns with the common abilities already attached
- Controller-mesh and hand-mesh motion controller variants
- Level navigation UI

#### Requires

None

#### Required by

None

81 assets67 API members

## Description

The Showroom is the framework assembled into something runnable. It is also the recommended starting point for a real project: rather than wiring a pawn from the raw base classes, subclass `BP_Pawn_VR_Char_Showroom` and remove what you do not need.

It ships four motion controller variants — controller mesh and hand mesh, left and right — so you can switch between controller-based and hand-tracked interaction by changing two class references on the pawn.

The navigation system demonstrates level switching between the example maps and is a reasonable model for a project's own level select.

## Setup

1. Enable `AFE_Showroom`.
2. Subclass `BP_GameMode_Showroom` and the pawns you need into your own content.
3. Assign your subclasses in your `PDA_Level`.

Tip

Subclass rather than edit. Editing the Showroom directly means merging on every framework update.

## Usage

### Switching between controllers and hands

Change **Left Controller** and **Right Controller** on the VR pawn between the `BP_MotionController_Controller_*` and `BP_MotionController_Hands_*` variants.

### Building your own navigation

`BPC_GameState_Navigation` and `WBP_Navigation` show the pattern: a list of level data assets driving a menu page.

[![The Showroom lobby with its navigation panel](../images/AFE_Showroom_result-1600.webp?v=e3f861f5)](../images/AFE_Showroom_result-1600.webp?v=e3f861f5)

The Showroom lobby with its navigation panel

## Key properties

| Property | When to change |
|---|---|
| `Left Controller` / `Right Controller` | Swap between controller and hand variants |
| Navigation level list | The levels offered in the navigation menu |

## Extending

Subclass the game mode, game state, player controller and pawns into your own content. This is the intended entry point — see [Intended workflow](../guides/workflow.html).

## Example map

`Map_Examples_Lobby` is the Showroom in use.

## Troubleshooting

**My pawn changes disappeared after an update.** The Showroom pawn was edited directly rather than subclassed.

## API reference

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

### DataAssets

**PDA_Level_Showroom**0 members

extends `PDA_Level`

Level data asset for a showroom level. Presets the showroom game mode and the desktop, mobile and VR showroom pawns, and adds the description and the two images, square and banner, that the navigation cards display. Make one per level you want reachable from the kiosk and list it in the game state's navigation component.

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

### Elements/Navigation/Blueprints

**BP_Navigation**2 members

extends `Actor` · implements `OutsidePawnRPCInterface`

Navigation kiosk: a widget component floating 160 cm up showing the navigation panel, so a player can walk over and travel to another showroom level. Switch Level hands straight to a server event that runs the loading module's level switch, so the whole session travels together. Drop one into a level, or let the floor place it through its Navigation slot.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `SwitchLevel` | `(Level: PDA_Level_Showroom)` | Asks for travel to another showroom level from the kiosk actor itself, handing the data asset straight to the server event. The kiosk's own panel goes through the navigation component on the game state instead, so nothing calls this as it stands; it is here for a level blueprint or a subclass of your own. |
| event | `Server_SwitchLevel` | `(Level: PDA_Level_Showroom)` | Server event running the loading module's level switch: every player controller fades to black over half a second, then the server travels the whole session to the map named by the data asset with its game mode appended. In the editor it opens the map locally instead. The actor implements the outside pawn RPC marker, which is what lets a placed actor call a server event. |

### Elements/Navigation/Components

**BPC_GameState_Navigation**2 members

extends `ActorComponent` · implements `OutsidePawnRPCInterface`

Game state component holding the showroom's level list: the lobby data asset and the grouped pages of levels the navigation widgets read. Its Switch Level forwards to a server event so any widget can request travel without owning a connection. Add it to your own game state to reuse the showroom's level browser; the showroom game state already carries one.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `SwitchLevel` | `(Level: PDA_Level_Showroom)` | Asks for travel to another showroom level. Called by the navigation panels once a level card or the Lobby button has been confirmed; it does nothing itself beyond handing the data asset to the server event, so a client may raise it freely. |
| event | `Server_SwitchLevel` | `(Level: PDA_Level_Showroom)` | Server event running the loading module's level switch: every player controller fades to black over half a second, then the server travels the whole session to the map named by the data asset with its game mode appended. In the editor it opens the map locally instead. The component implements the outside pawn RPC marker, which is what allows a game state component to call a server event at all. |

### Elements/Navigation/Widgets

**WBP_Navigation**2 members

extends `WBP_Base`

Full navigation panel used by the kiosk: logo, a vertical pagination menu and a switcher that builds a page of level cards for the selected group, plus a Lobby button that asks for confirmation before travelling. Takes its groups from the navigation component on the game state. Set it as the widget class of a widget component to reproduce the kiosk.

| 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 | `OnButtonClicked_Confirm` | `(Confirm: bool)` | Called by the confirmation overlay the Lobby button opened, carrying the reader's answer. Asks the navigation component on the game state to switch to its Lobby level when the answer is yes, and does nothing at all when it is no. |

**WBP_Navigation_Menu**1 members

extends `WBP_Base`

Compact form of the navigation panel, sized 1000 by 1000 for a menu rather than a wall: a horizontal pagination row above a scrolling switcher of level pages, fed by the same navigation component. Nothing in the corpus uses it; it is here to be dropped into a menu of your own where the kiosk panel would be too large.

| 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_Navigation_Page**2 members

extends `WBP_Base`

One page of level cards. Initiate With Levels fills a vertical button group with a card per level data asset, taking the name and square image from each, and clicking one spawns a confirmation overlay before the switch happens. Built by the navigation panels rather than placed yourself.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `InitiateWithLevels` | `(Levels: PDA_Level_Showroom[])` | Fills the page with one card button per level, taking the name and the 500 by 500 square image from each data asset, and keeps the array so a click can be traced back to a level. Called by the navigation panel that spawned the page; calling it a second time appends another set of cards rather than replacing the first. |
| event | `OnButtonClicked_Confirm` | `(Confirm: bool)` | Called by the confirmation overlay a level card opened, carrying the reader's answer. Asks the navigation component on the game state to switch to the level at the remembered index when the answer is yes; a no leaves the page as it was. |

### Enviroment/Floor/Blueprints

**BP_Floor**6 members

extends `Actor`

Modular showroom floor: a centre tile with side and corner pieces that the construction script scales and shifts so Width and Height give a floor of any size, plus the branding decal. The Player Position, Navigation and Map Info slots hold the level's spawn point, kiosk and map info actor, which Set Transform Of Relevant Actor places relative to the floor. The base of a showroom level.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Width`Dimensions | `float` | Size of the floor in one direction, as a multiple of the centre tile: the construction script scales the centre and pushes the matching side and corner pieces out by 50 cm per unit. Clamped to a minimum of 1, which gives the single-tile floor. |
| var | `Height`Dimensions | `float` | Size of the floor at right angles to Width, in the same units and clamped the same way. The centre tile is placed turned through 90 degrees, so which of the two runs along which world axis is easier to read off the viewport than off the names. |
| var | `Player Position` | `BP_PlayerPosition` | Player start belonging with this floor, held here so the level's spawn point can be moved with it. The construction script never reads it; pass it to Set Transform Of Relevant Actor to place it relative to the floor. |
| var | `Navigation` | `BP_Navigation` | Kiosk actor belonging with this floor, giving the level its way out to the other showroom levels. As with the other two slots the floor never reads it on its own, so place it through Set Transform Of Relevant Actor. |
| var | `Map Info` | `BP_MapInfo` | Marker actor naming the level's own data asset for the loading module, held here so it travels with the floor. Nothing in the graph reads it until you place it through Set Transform Of Relevant Actor. |
| fn | `SetTransformOfRelevantActor` | `(Actor: Actor, NewTransform_Location: Vector, Rotation: Rotator)` | Moves an actor to a location and rotation expressed in the floor's own space, so the spawn point, kiosk or map marker can be positioned by offset from the floor rather than in world coordinates. Scale is forced back to one. Nothing calls it, so use it from your own construction script or level blueprint. |

### Enviroment/SkySphere/Blueprints

**BP_Sky**3 members

extends `Actor`

Sky sphere for the showroom levels: a static, collisionless sphere carrying the sky material, made dynamic on construction so its light direction parameter follows the Directional Light Actor you point it at. Set Refresh Material to rebuild it after moving that light; the flag clears itself. Place one per level as set dressing rather than as a lighting system.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Directional Light Actor` | `DirectionalLight` | Directional light the sphere takes its sun position from; the light's rotation is written into the sky material's light direction parameter when the construction script runs. Leave it empty and the sky falls back to a fixed direction down positive X, which will not match your lighting. |
| var | `Refresh Material` | `bool` | Editor button in the shape of a tick box: setting it reruns the construction script, which rebuilds the sky's dynamic material and reapplies the light direction, then clears the box again. Use it after moving or turning the directional light. |
| fn | `SetLightDirectionParameter` | `(Material: MaterialInstanceDynamic)` | Writes the assigned directional light's rotation, read as a vector, into the given material's light direction parameter, falling back to positive X when no light is assigned. Called by the construction script on the sky's own material; call it yourself for any other material that needs the same sun direction. |

### Enviroment/Tables/Blueprints

**BP_DemoTable**15 members

extends `Actor`

Exhibition stand every showroom example stands behind, and the prop most worth copying: a table mesh in one of six variants, a nine-slice back panel and three widget components carrying the info display, the configurator and a replacement card. Fill in Image, Title, Description and Instruction, point Example Actor at the actor demonstrated, and shape it with Use Table, Variant, Flip and Width.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Use Table`Style\|Table | `bool` | Whether the stand shows its table mesh. With it on, the construction script chooses the mesh from Variant and applies Flip; with it off the table is hidden and the other branch runs instead, the one that spaces the widget faces by Width and applies Show Replacement. Those two settings therefore only take effect on a stand without a table. |
| var | `Variant`Style\|Table | `int` | Which of the six exhibition table meshes the stand uses, indexed 0 to 5: V shape, V shape narrow, U shape, U shape narrow, half and half narrow. The default of 3 gives the narrow U shape. Read only while Use Table is on. |
| var | `Flip`Style\|Table | `bool` | Whether the table mesh is turned through 180 degrees about its up axis, for a stand approached from the other side. Applied by the construction script only while Use Table is on, and the back panel and its widgets do not turn with it. |
| var | `Image`Info | `Texture2D` | Picture shown at the head of the stand's display card, above the title. Leave it empty and that slot collapses, closing the gap rather than leaving a blank. |
| var | `Title`Info | `text` | Heading of the display card, naming the feature the stand demonstrates. Leave it empty for a card that starts straight into the description. |
| var | `Description`Info | `text` | Body text of the display card, shown inside a scroll box so a long explanation still fits the card's fixed height. |
| var | `Example Actor`Configurator | `Actor` | Actor this stand demonstrates. Its state components are what the configurator and display cards turn into rows, each row chosen from the value interfaces that component implements. Leave it empty and both cards come up with no controls on them. |
| var | `Hide Backpanel`Style\|Panel | `bool` | Meant to suppress the nine-slice panel behind the widgets, but nothing in the graph reads it, so it has no effect as the blueprint stands. Hide the panel component itself, or wire this into the construction script in a subclass. |
| var | `Width`Style\|Panel | `float` | Spread of the two widget faces, adding 80 cm per unit above 1 to a base offset of 120 cm either side of the back panel. Read only in the branch that runs while Use Table is off, so it does nothing on a stand that still shows its table. |
| var | `Show Replacement`Replacement | `bool` | Whether the replacement card is shown in place of the live example. Applied only while Use Table is off, so switching it on for a stand that still shows its table leaves the card hidden. |
| var | `Replacement Image`Replacement | `Texture2D` | Background picture of the replacement card, sitting behind its title and description. Leave it empty for a plain card. |
| var | `Replacement Title`Replacement | `text` | Heading of the replacement card, shown in place of the live example while Show Replacement is on. |
| var | `Replacement Description`Replacement | `text` | Body text of the replacement card, shown in a scroll box beneath its title. |
| var | `Instruction`Info | `text` | One-line prompt at the foot of the display card, beside the action icon, telling the reader what to do with the example. Leave it empty for a card that only describes. |
| var | `Example Flags`Info | `E_Showroom_Flags[]` | Tags recording which framework features the stand is there to demonstrate. Nothing in the shipped blueprints reads them, so treat the list as showroom bookkeeping you are free to repurpose. |

### Enviroment/Tables/Widgets

**WBP_Example_Configurator**2 members

extends `WBP_Base`

Interactive face of a demo table. Builds one config row per state component on the demonstrated actor, choosing the row from the value interface that component implements: slider for float, toggle for boolean, selector for integer, drop-down for name, trigger and colour swatch. The Reset button resets every listed component through the value interface with the widget's own Source Info.

| Kind | Name | Signature | Description |
|---|---|---|---|
| fn | `getWidgetFromObject` | `(InputPin: ActorComponent) → class<WBP_ConfigItem>` | Returns the config row class to build for a state component, by asking in turn which value interface it implements: float gives the slider row, boolean the toggle, integer the selector, name the drop-down, trigger the button and colour the swatch. Returns nothing for a component implementing none of them, which leaves it without a row. |
| 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_Example_Display**2 members

extends `WBP_Base`

Reading face of a demo table: image, title, scrolling description and an instruction line with an action icon, sized 1000 by 1200 for the table's widget component. Maps state components to rows as the configurator does, but offers no colour swatch and no reset. Fill its text through the demo table rather than editing the widget.

| Kind | Name | Signature | Description |
|---|---|---|---|
| fn | `getWidgetFromObject` | `(InputPin: ActorComponent) → class<WBP_ConfigItem>` | Returns the config row class to build for a state component, testing boolean first, then float, integer, name and trigger. Names fall to the selector row rather than the drop-down, and no colour row is offered at all, so a colour-valued component gets nothing on this face of the table. |
| 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_Example_Replacement**2 members

extends `WBP_Base`

Card a demo table shows in place of the live example: a rounded background image behind a title and a scrolling description, and nothing interactive. Switched on with the table's Show Replacement flag and filled from its Replacement Image, Title and Description. Use it where an example needs a poster instead of a working prop.

| Kind | Name | Signature | Description |
|---|---|---|---|
| fn | `getWidgetFromObject` | `(InputPin: ActorComponent) → class<WBP_ConfigItem>` | Returns the config row class for a state component in the same order the display card uses: boolean, float, integer, name and trigger, with names falling to the selector row. The replacement card shows no controls of its own, so it is here for a subclass that adds them. |
| 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. |

### Enviroment/Tables/Widgets/Config

**WBP_ConfigItem**3 members

extends `WBP_Base`

Base class for one row of a demo table's configurator: an info row with a named slot for the control, and Assigned Component, exposed on spawn, holding the state component that row drives. Use one of the six ready rows or subclass it for a control of your own; the table picks the subclass from the interfaces the state component implements.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Assigned Component` | `ActorComponent` | State component this row reads and writes, passed in when the demo table spawns the row. Nothing in the base class touches it; each row subclass is expected to bind its own control to it. Leave it unset and the row shows a control that drives nothing. |
| 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_ConfigItem_Color**1 members

extends `WBP_ConfigItem`

Configurator row for a colour-valued state component, chosen automatically for anything implementing the colour value interface. Only the configurator offers it, not the display or replacement cards. Copy it when adding a row type of your own.

| 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_ConfigItem_DropDown**1 members

extends `WBP_ConfigItem`

Configurator row for a name-valued state component, letting the reader pick one of its named options from a list. Chosen only by the configurator; the display and replacement cards fall back to the selector row for names.

| 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_ConfigItem_Selector**1 members

extends `WBP_ConfigItem`

Configurator row that steps through the options of an integer-valued state component, and the fallback for name values on the display and replacement cards. The most reused of the row types, and the one to copy for a stepped control.

| 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_ConfigItem_Slider**1 members

extends `WBP_ConfigItem`

Configurator row for a float-valued state component, giving the reader a continuous handle over its range. Chosen automatically for anything implementing the float value interface, on all three demo table widgets.

| 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_ConfigItem_Toggle**1 members

extends `WBP_ConfigItem`

Configurator row for a boolean-valued state component, with the control right-aligned in the info row rather than filling it. Chosen automatically for anything implementing the boolean value interface.

| 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_ConfigItem_Trigger**1 members

extends `WBP_ConfigItem`

Configurator row for a trigger state component: a right-aligned button that fires the trigger, for state that has no value to show, only a moment. Chosen automatically for anything implementing the trigger value interface.

| 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. |

### Examples/Furniture/Bench

**BP_Bench**0 members

extends `Actor`

Bench prop for dressing a showroom scene: a single replicated mesh tagged Mesh, with no interaction of its own. Nothing subclasses it. Place it as furniture, or subclass it and add an interaction pointed at that tag, which is how the interactive props in this plugin are built.

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

### Examples/Furniture/Chair

**BP_Chair**0 members

extends `Actor`

Chair prop, one tagged mesh and nothing attached. Subclassed by the teleport chair example, which adds a scene-based teleport interaction so a player can sit on it. Take it as furniture, or as the starting point for a seat of your own.

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

### Examples/Furniture/CoffeeTable

**BP_CoffeeTable**0 members

extends `Actor`

Coffee table prop: a single replicated mesh tagged Mesh Root, with no interaction and nothing referencing it. Pure set dressing; add a grip or select interaction in a subclass if you want it to react.

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

### Examples/Furniture/Couch

**BP_Couch**0 members

extends `Actor`

Couch prop: a single replicated mesh tagged Mesh Root, with no interaction and nothing referencing it. Set dressing to fill a room; subclass it if the furniture needs to do something.

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

### Examples/Furniture/Door

**BP_Door**0 members

extends `Actor`

Door prop in two parts: a frame and a swinging leaf tagged Mesh Door with its own collision, so a subclass can turn the leaf without moving the frame. The gaze and select door examples do exactly that, driving the leaf from a boolean state component. Place it as scenery or subclass it for a door of your own.

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

### Examples/Furniture/Drawer

**BP_Cubboard**0 members

extends `Actor`

Cupboard with four drawers, each drawer mesh tagged and paired with its own drag state component pointed at that tag so the four slide independently. Ranges, sections and snapping are left to subclasses, which the hand-grip, gaze and select drawer examples each set differently. The clearest example in the showroom of one state component per moving part.

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

### Examples/Furniture/Lamps

**BP_Lights_Ceiling**0 members

extends `Actor`

Ceiling lamp: mesh, spotlight and a half-second timeline that fades the light up to 10,000 units, with a surface connector so the lamp snaps to a ceiling when moved by the snapping system. Nothing drives the timeline on its own, so trigger it from your graph or from a state component in a subclass.

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

**BP_Lights_Wall**0 members

extends `Actor`

Wall lamp: mesh, spotlight and the same half-second brightness timeline as the ceiling lamp, with a sphere marked as a navigation obstacle so pawns and the teleporter keep clear of it. No connector, so place it by hand; nothing drives the timeline until you do.

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

### Examples/Furniture/Shelf

**BP_Shelf**0 members

extends `Actor`

Shelf that can be picked up and put back: a grip pickup interaction, an actor replication component so other players see it move, and a surface connector on top so smaller props snap onto the shelf. A compact worked example of the grip, replication and snapping modules on one prop.

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

### Examples/Furniture/SlideDoor

**BP_SlidingDoor**0 members

extends `Actor`

Sliding double door: left and right leaves and a lock, each mesh tagged so a subclass can drive it, and nothing else attached. Replicated but inert as it stands. Subclass it and add a state component per leaf to make it open.

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

### Examples/Furniture/Table

**BP_Table**0 members

extends `Actor`

Table prop: a single replicated mesh tagged Mesh Root, with no interaction attached and nothing referencing it. Furniture to stand other examples on; subclass it if the table itself should react.

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

### Examples/Interactables/Button

**BP_Button**0 members

extends `Actor`

Push button demonstrating the overlap ability. The cap is tagged for a drag state component that travels 18 cm down and springs back, an overlap drag interaction accepts only the left and right controller identifiers, and a timeline turns the cap green while the Pushed section is held. Subclassed by the hand, overlap and pixel examples; drop it in for a button a finger can press.

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

### Examples/Interactables/Knob

**BP_Knob**0 members

extends `Actor`

Rotary knob demonstrating the latch grip. A roll drag state component covers -360 to 360 degrees on the knob mesh, a grip latch drag interaction attaches to that mesh within 10 cm, and a simple label with an arrow reads out the percentage as it turns. Drop it in as it stands, or subclass it as the hand interaction example does.

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

### Examples/Interactables/Levers

**BP_Lever**0 members

extends `Actor`

Lever demonstrating the latch grip on an angle: an inverted yaw drag state component running -45 to 45 degrees turns the lever mesh about its pivot, the grip latch drag interaction takes hold of it, and a label shows the percentage. Drop it in, or take it as the base for a lever of your own as the hand interaction example does.

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

### Examples/Interactables/Sliders

**BP_Slider**0 members

extends `Actor`

Linear slider on a rail: a drag state component pointed at the handle mesh and a grip latch drag interaction that takes hold of it. Both drag events are deliberately empty and nothing references the actor, so this is the blank slider to copy when you want your own reaction to a dragged handle.

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

### Examples/Interactables/UnrealButton

**BP_Trigger_Button_Toggle**3 members

extends `Actor`

Large button that answers both a finger and a laser: an overlap drag interaction on the cap and a select interaction that pushes the cap to its Pressed section, with a dynamic material lerped from red to green by its own timeline while Toggle is off. The Pressed handler is left empty for your logic. Read it as the example of pairing overlap and select on one control.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Toggle` | `bool` | Whether the cap's colour animation is suppressed. The 0.4 second state timeline only tints the cap while this reads false; with it true the cap keeps whatever colour it last had. Nothing in the graph starts that timeline, so as the blueprint stands the colour never moves either way. |
| fn | `getButtonMaterial` | `(out Material: MaterialInstanceDynamic)` | Returns the cap's dynamic material, creating it from the door logo material on the mesh's first slot the first time it is asked for and caching it. Marked pure, so the colour setter asks for it twice on every call, but the material is only ever made once. |
| fn | `SetButtonColor` | `(Alpha: float)` | Tints the cap for a given progress, lerping the material's colour parameter from red at 0 to green at 1 and its fresnel exponent from 0.3 to 2.0 across the same range. Called each frame by the state timeline while Toggle is off; call it directly to set the cap yourself. |

### Examples/Interactables/Valve

**BP_Valve**0 members

extends `Actor`

Hand-turned valve wheel: a roll drag state component covering a full turn either way with a section that snaps at 359 degrees, and a grip latch drag interaction attached to the wheel mesh. Nothing subclasses it, so it is both a finished prop to place and a clean example of an angle drag with snapping.

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

### Examples/Objects/Battery

**BP_Battery**1 members

extends `Actor`

A battery Blueprint that moves upwards when a custom event is fired.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Size` | `E_BatterySize` | Which of the three battery meshes the construction script picks, small, medium or big. It changes the mesh and nothing else, as the prop carries no interaction of its own. |

**BP_Battery_Small**0 members

extends `BP_Battery`

Small battery variant that pins the mesh directly instead of leaving it to the parent's Size property. Nothing references it; it exists as a ready subclass to drop in where the small battery is always wanted.

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

### Examples/Objects/Bomb

**BP_Bomb**0 members

extends `Actor`

Cartoon bomb demonstrating the trigger state component: firing the trigger runs a half-second timeline that swells the mesh, drops it out of sight and spawns the explosion effect. Nothing fires it on its own, so drop it in and drive the trigger from a button, a select interaction or a hand.

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

### Examples/Objects/Construct

**BP_Rack**0 members

extends `Actor`

Rack the showroom props stand on, assembled from modular meshes and carrying no interaction of its own. Subclassed by the snapping and spawner examples, which add the anchors or the spawner they need. Start from it when you want a stand rather than a prop.

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

### Examples/Objects/Gears

**BP_Cog**1 members

extends `Actor`

Single cog driven by a boolean state component: while the boolean reads true the gear eases up to a spin scaled by Rotation Speed and the machine loop plays, and it eases back to rest when the value goes false. Subclassed by the gaze and select cog examples and attached by the cog system. The clearest small example of boolean state driving continuous motion.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Rotation Speed` | `float` | Multiplier on the gear's turn rate, applied on top of the 40 degrees per second the tick eases towards while the boolean state reads true. Negative values turn the gear the other way; zero holds it still while the machine sound still plays. |

**BP_CogSystem**1 members

extends `Actor`

Machine of four gears turning at different rates with a permanent loop, plus a boolean state component that gates the medium gear and a Cog To Attach slot pointing at a separate cog actor. Drop it in as animated set dressing. The authority branch on the state change is left empty, so extend it for anything beyond spinning.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Cog to Attach` | `BP_Cog` | Separate cog actor this machine is meant to drive. The only place it is read is the validity check in the state handler, whose branches are all empty, so filling it in changes nothing as the blueprint stands. |

**BP_Gear**0 members

extends `Actor`

Gear driven by a float state component: the interpolated update turns the mesh by that frame's delta, so the gear tracks a slider or dial one for one. Nothing references it. Place it beside a float control as a readout, or copy the single event into a mechanism of your own.

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

### Examples/Objects/Guitar

**BP_Guitar**0 members

extends `Actor`

Guitar built from seven separate meshes, body, neck, head, bridge, strings, tremolo and logo, each set to ignore the camera channel so none of it clips the view. No interaction and nothing references it: set dressing, or a multi-part body to hang your own grip sockets on.

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

### Examples/Objects/Gun

**BP_Gun**0 members

extends `Actor`

Physics pistol built from a mesh, a muzzle point, a pickup grip and a pickup coordinator. The trigger reaches it as a forwarded button: On Button Forward Key switches on the controller button, spawns a round at the muzzle's world transform with the player pawn as instigator, and plays the fire haptic back through the Source Info so it is felt in the hand that pressed rather than in both. The worked example of forwarding a controller button through to a held actor.

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

**BP_Projectile_Gun**0 members

extends `Actor`

Round the pistol spawns: projectile movement, a sphere for overlaps and a mesh. Spawned rather than placed; reuse it as the round for a weapon of your own.

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

### Examples/Objects/Gym

**BP_Weight**0 members

extends `Actor`

Barbell plate to pick up and pass around: a grip pickup interaction and an actor replication component, and nothing else. The smallest example in the showroom of a replicated pickup, and the one to copy for a plain grabbable object.

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

### Examples/Objects/LED

**BP_LED**1 members

extends `Actor`

A light Blueprint that is turned on by a custom event.

| Kind | Name | Signature | Description |
|---|---|---|---|
| fn | `Update light color` | `(New color: LinearColor)` | Tints the indicator: writes the given colour into the emissive parameter of the two bulb material references, sets the point light to the same colour and takes its intensity from the colour's alpha times 2000. Those two references are never filled in anywhere, so only the light actually responds. Nothing calls it, so drive it from a colour state or your own graph. |

### Examples/Objects/Lightbulb

**BP_Lightbulb**3 members

extends `Actor`

A light Blueprint that is turned on by a custom event.

| Kind | Name | Signature | Description |
|---|---|---|---|
| fn | `getLightbulbMaterial` | `(out DynMaterial: MaterialInstanceDynamic)` | Returns the bulb's dynamic material, creating it from the bulb base material on the mesh's second slot the first time it is asked for and caching it. Marked pure, so both timelines ask for it every frame, but the material is only made once. |
| event | `SetNewColor` | `(Color: LinearColor)` | Crossfades the bulb to a new colour over half a second, writing the blend into both the material's colour parameter and the point light. The fade starts from the colour the light holds when it is called, so calling it again part way through carries on from wherever the blend has reached. |
| event | `SetLight` | `(Set: bool)` | Fades the bulb in or out over half a second, running a timeline that takes the material's brightness parameter from 0 to 50 and the point light's intensity from 0 to 1000. Pass true to light it and false to darken it; the reverse resumes from wherever the fade has reached rather than snapping. |

### Examples/Objects/Panel

**BP_Panel**0 members

extends `Actor`

Flat panel mesh with nothing attached, subclassed by the hand pickup panel example, which adds the grip interaction. Use it when an example needs a thin board to grab, mount something on or hide behind.

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

### Examples/Objects/Pipes

**BP_Pipe**0 members

extends `Actor`

Base for the pipe set: an empty mesh component tagged Mesh that each variant fills in, so every pipe shares one class. Place the bend, junction or straight subclass rather than this one, and subclass it yourself when a run needs a shape the set does not have.

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

**BP_Pipe_Bend**0 members

extends `BP_Pipe`

Bend section for pipe runs, the base pipe with the bend mesh set. Decorative geometry with no collision changes and no interaction; lay several out by hand to dress an industrial scene.

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

**BP_Pipe_Junction**0 members

extends `BP_Pipe`

T junction for pipe runs, the base pipe with the junction mesh set. Decorative geometry only, meant to be combined with the bend and straight sections.

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

**BP_Pipe_Straight**0 members

extends `BP_Pipe`

Straight section for pipe runs, the base pipe with the straight mesh set. Decorative geometry only; scale and repeat it between bends and junctions.

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

### Examples/Objects/Plant

**BP_Plant**0 members

extends `Actor`

Potted plant: one replicated mesh tagged Static Mesh. Subclassed by the hand pickup example, which makes it grabbable, and by the label example, which hangs a floating label on it. Take it as greenery or as the body for either.

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

### Examples/Objects/Radio

**BP_Radio**1 members

extends `Actor`

Radio demonstrating a boolean state component driving audio: switching the value on plays the example song through the attached audio component, switching it off stops it. Should Rotate is exposed on spawn but unused here. Subclassed by the gaze and select radio examples; place it and give it any boolean control.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Should Rotate` | `bool` | Flag exposed on spawn that nothing in the graph reads, so switching it on neither turns the radio nor changes anything else. Ignore it, or give it a meaning in a subclass of your own. |

### Examples/Objects/Rifle

**BP_Projectile_Rifle**0 members

extends `Actor`

Projectile fired by player that pushes physics objects

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

**BP_Rifle**1 members

extends `Actor`

Two-handed rifle, and the fullest grip example in the showroom: a grip on the trigger and a second on the forestock, both feeding one pickup coordinator, so it can be held in either hand or steadied with both. Rapid Fire switches between single shots and automatic, Shoot spawns the round, and an anchor connector lets it snap back onto a rack. A visibility switch fades it in and out rather than popping it.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `Shoot` | `()` | Fires the rifle: spawns a rifle projectile at the muzzle arrow's world transform and nothing else. No recoil, no ammunition, no sound, so it is here as the shortest possible example of handing a spawn a muzzle transform rather than as a weapon to build on. |

### Examples/Objects/Screen

**BP_Mirror_RenderTarget**1 members

extends `Actor`

Mirror or monitor built from a scene capture: a screen mesh with the capture material and a 2D capture that renders only when Capture is called, so nothing is captured every frame. Frames Per Second is there for a graph of your own to pace those calls. Place it as a mirror and drive Capture at whatever rate you can afford.

| Kind | Name | Signature | Description |
|---|---|---|---|
| event | `Capture` | `()` | Renders a single frame from the scene capture into the screen's material. The capture has its every-frame flag off, so the screen stays blank until this is called and then holds that frame until it is called again. Nothing calls it, so pace the calls from your own graph at whatever rate you can afford. |

**BP_Recorder**4 members

extends `Actor`

Placeable spectator camera with its own screen: the spectator component registers under Name, the Key you bind toggles this camera onto the spectator view, and the screen shows whichever render target the spectator coordinator hands out. Finds or spawns that coordinator itself at begin play. Drop it into a level to demonstrate the spectator module.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Key` | `Key` | Input key that toggles this camera on and off as the live spectator feed. The actor receives input as player zero, so the press is heard wherever the player is standing; leave it unset and the camera can only be switched on through the coordinator by name. |
| var | `Name` | `name` | Identifier the spectator component registers under. The construction script copies it into the component's Key and writes it onto the text render above the screen, so the label on the prop and the name the coordinator knows it by always agree. Left at None the component is not registered and logs a warning instead. |
| fn | `getSpectatorCamera` | `(out SpectatorCoordinator: BP_Manager_Spectator)` | Returns the level's spectator coordinator and caches it: hands back the cached one if it has already been found, otherwise takes the first in the level and spawns one at the origin if the level has none. Marked pure, so bear in mind that reading it can spawn an actor. |
| event | `NewSpectatorActivated_Event_0` | `(SpectatorComp: Comp_Spectator, SpectatingActor: Actor, RenderTarget: TextureRenderTarget2D)` | Bound at begin play to the coordinator's New Spectator Activated delegate. Writes whichever render target has just gone live into the screen's dynamic material, so the screen shows the active feed of the level rather than always its own camera. |

**BP_Screen**0 members

extends `Actor`

Video screen prop: a screen mesh and a spatialised media sound component tagged Screen Media Sound. It carries no media player or source of its own, so point a player at the mesh's material and route its audio through this component.

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

### Examples/Objects/SignalLight

**BP_SignalLight**0 members

extends `Actor`

Rotating warning light driven by a boolean state component: switching it on starts the rotating movement, plays the siren loop and pulses the spotlight between 5,000 and 50,000 units on a one-second timeline that repeats while the light is on. Switching it off stops all three. Place it and give it any boolean control.

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

### Examples/Objects/Statue

**BP_Statue**0 members

extends `Actor`

Statue prop, one mesh tagged Static Mesh and nothing else. The most reused body in the example set: the highlight examples subclass it four times to compare the material, mesh copy, post process and select styles on identical geometry, and the label example hangs a label on it. Place it as dressing or subclass it for a comparison of your own.

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

### Examples/Objects/Vase

**BP_Vase**0 members

extends `Actor`

Vase prop, a single replicated mesh with nothing attached. Subclassed by the hand pickup example, which adds the grip interaction. Otherwise a breakable-looking object to put on a shelf.

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

### Examples/Shapes

**BP_Shape**0 members

extends `Actor`

Base grabbable shape and the showroom's general-purpose test object: a physics-simulating mesh with a grip pickup interaction, an actor replication component, a visibility switch and a pickup coordinator set to release into physics. Place one of the five shape subclasses rather than this one, or subclass it for a throwable of your own.

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

**BP_Shape_Ball**0 members

extends `BP_Shape`

Ball form of the grabbable shape, and one of the classes the spawner example hands out. The object to reach for when trying the grip ability: pick it up, throw it, watch it replicate.

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

**BP_Shape_Block**0 members

extends `BP_Shape`

Flat block form of the grabbable shape. Nothing references it; place it where a stackable slab suits the example better than a ball or a cube.

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

**BP_Shape_Cube_Large**0 members

extends `BP_Shape`

Large cube form of the grabbable shape, offered by the spawner example. Differs from its siblings only in the mesh and in having tick enabled; use it for two-handed or heavy-object demonstrations.

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

**BP_Shape_Cube_Small**0 members

extends `BP_Shape`

Small cube form of the grabbable shape, used by the spawner example and as the moving body in the overlap example. The handiest of the shapes for throwing at a trigger volume.

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

**BP_Shape_Pyramid**0 members

extends `BP_Shape`

Pyramid form of the grabbable shape, offered by the spawner example. Its awkward silhouette makes it the useful one for showing how a pickup settles into the hand.

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

### Game

**BP_GameMode_Showroom**1 members

extends `BP_GameMode`

Game mode for every showroom level: the loading module's game mode with the showroom game state and player controller set on it. Named by the showroom level data assets rather than in project settings, so a level chooses it by choosing its data asset. Subclass it, as the examples level does, when a level needs classes of its own; Test is unused.

| Kind | Name | Signature | Description |
|---|---|---|---|
| var | `Test`Classes | `bool` | Unused flag left on the showroom game mode. It is editable and exposed on spawn, but nothing reads it, so setting it has no effect; ignore it or give it a meaning in a subclass. |

**BP_GameState_Showroom**0 members

extends `GameState`

Game state for the showroom, carrying the level navigation, the theme manager, the settings and the project info components, the last filled in with the logo, company and project name. Worth reading as the reference list of what a game state is expected to hold in this framework: set it on your game mode, or copy the component set into your own.

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

**BP_PlayerController_Showroom**0 members

extends `PlayerController`

Player controller for the showroom, adding the camera fade and the replicated spawner components and nothing else. Copy it as the pattern for a controller of your own: those two components are what fading between levels and spawning replicated actors into a player's hand require.

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

### Game/Pawn

**BP_Pawn_Desktop_Char_Showroom**0 members

extends `BP_Pawn_Desktop_Char`

Desktop pawn the showroom levels spawn: the walking desktop character with the grip, gaze, select, widget, HUD, pawn UI and menu abilities added, and the desktop menu listed as an initial HUD widget. Copy it as the starting point for a desktop pawn; abilities come from having the component, so remove the ones your project does not want.

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

**BP_Pawn_Mobile_Char_Showroom**0 members

extends `BP_Pawn_Mobile_Char`

Mobile pawn the showroom levels spawn: the touch character with the gaze, grip, select, widget, HUD and pawn UI abilities, and no menu component, unlike its desktop counterpart. Copy it as the base for a mobile pawn and add the abilities the touch build needs.

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

**BP_Pawn_VR_Char_Showroom**0 members

extends `BP_Pawn_VR_Char`

VR pawn the showroom levels spawn: the VR character pointed at the showroom's own left and right controller actors, with the HUD, pawn UI, menu and gaze abilities. It also answers the trace contract, line-tracing 50 m ahead of the headset and caching the hit for a tenth of a second so several systems can ask what is being looked at without re-tracing.

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

### Game/Pawn/MotionControllers

**BP_MotionController_Controller_Left_Showroom**0 members

extends `BP_MotionController_Controller_Left`

Left hand of the showroom VR pawn in the tracked-controller style, carrying the palm menu, the teleport arc set to fire on a neutral thumbstick, and snap turning. Copy the pair rather than editing them when you want a different scheme; the pawn names both by class.

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

**BP_MotionController_Controller_Right_Showroom**0 members

extends `BP_MotionController_Controller_Right`

Right hand of the showroom VR pawn in the tracked-controller style, carrying the pointing laser and smooth movement. With the left hand it makes up the showroom's default scheme: teleport and menu on one side, laser and locomotion on the other. Swap ability components on a subclass to change it.

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

**BP_MotionController_Hands_Left_Showroom**0 members

extends `BP_MotionController_Hands_Left`

Left hand of the hand-mesh VR pawn: hand grab, finger select, palm menu, teleport arc, snap turn, and an overlap ability identified as Controller_Left, which is the identifier the overlap props such as the push button accept. Used by the interaction hands pawn; copy it for a hand-tracked pawn of your own.

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

**BP_MotionController_Hands_Right_Showroom**0 members

extends `BP_MotionController_Hands_Right`

Right hand of the hand-mesh VR pawn: hand grab, finger select, the hand laser for pointing at things out of reach, and an overlap ability identified as Controller_Right. It carries no menu or teleport ability, both of which live on the left hand, so keep the pair together.

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

### Widgets/IdleScreen

**WBP_IdleScreen**1 members

extends `WBP_Base`

Attract screen for a headset nobody is wearing: a blurred backdrop behind the project logo, the company and project names, the level name and description, and an instruction line reading Put on the headset to continue. Nothing references it in the corpus, so spawn it from your own graph or take it as the pattern for an idle screen of your own.

| 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. |
