Quick Start
By the end of this page you have the full UI stack running: a policy that creates one root layout per local player, tag-keyed layers registered on it, and a HUD layout pushed onto the Game layer at startup. Every screen you build later is a two-line push onto this stack.
CommonUI, EnhancedInput, and ModelViewViewModel are engine plugins that enable automatically with CrimsonUI.1. Enable the plugin
Open Edit -> Plugins, type Crimson in the search box, tick CrimsonUI's checkbox (and CrimsonCommon, its dependency), and restart the editor when prompted. For a Blueprint project that is the entire install - you never hand-edit the .uproject or any .Build.cs.
C++ projects: after enabling the plugin, add its module to your build file so your game code can use its types:
// YourGame.Build.csPublicDependencyModuleNames.Add("CrimsonUI");PublicDependencyModuleNames.Add("CrimsonCommon"); // policy/layout base layer
2. Set the Game Instance and Local Player classes
The UI manager boots off two classes from CrimsonCommon. UCrimsonCommonGameInstance broadcasts player-added/removed events the manager subscribes to; UCrimsonCommonLocalPlayer is the local-player type the manager requires (players of any other class are silently ignored). UCrimsonCommonGameInstance is Abstract, so make a subclass first.
UCrimsonUIManagerSubsystem casts the game instance to UCrimsonCommonGameInstance to hear about players, and only creates a layout for local players that are UCrimsonCommonLocalPlayer subclasses. Wrong class on either = no layout, no widgets, no error message.DefaultEngine.ini has the LocalPlayerClassName line.3. Set the viewport client
UCrimsonGameViewportClient (a UCommonGameViewportClient) drives hardware vs software cursor from the Platform.Trait.Input.HardwareCursor platform trait. CommonUI needs a UCommonGameViewportClient for its input routing, so set it even if you never touch cursors:
Open Edit -> Project Settings -> Engine -> General Settings, expand the Default Classes section, and set Game Viewport Client Class = Crimson Game Viewport Client. The editor prompts to restart - accept it, because the viewport client class is only swapped in on startup. No .ini editing needed; the picker writes the same GameViewportClientClassName line for you.
4. Give CommonUI its Click and Back actions
CommonUI's action router needs a Click and a Back input action to drive activatable widgets. Those are configured inside a UCommonUIInputData asset, and the plugin ships one - Crimson_CommonUIInputData - with its Click and Back already set to Crimson_IA_UI_Confirm / Crimson_IA_UI_Back. Assign it to the Input Data field in Project Settings -> Game -> Common Input Settings (or the ini in the C++ tab) and enable Enhanced Input support, so glyphs resolve from live key bindings and update on rebind. (The other shipped actions - Crimson_IA_UI_Escape / Next / Previous - are yours to bind wherever you like.)
Open Project Settings -> Game -> Common Input Settings. Set Input Data = `Crimson_CommonUIInputData` - the shipped asset already has its Click and Back actions set to Crimson_IA_UI_Confirm / Crimson_IA_UI_Back - and tick Enable Enhanced Input Support. The picker writes the same DefaultGame.ini lines for you - no file editing needed.
Registering the actions is only half of it - Enhanced Input still needs to know which keys trigger them, or nothing happens when the player presses a button. Create an Input Mapping Context (Content Browser -> right-click -> Input -> Input Mapping Context, e.g. IMC_UI) and map keys to the shipped actions: e.g. Space Bar + Gamepad Face Button Bottom -> Crimson_IA_UI_Confirm, Escape + Face Button Right -> Crimson_IA_UI_Back (and keys for Crimson_IA_UI_Escape / Next / Previous). Then add that context to the local player:
In your PlayerController Blueprint: Event BeginPlay -> Is Local Player Controller (Branch, True) -> Get Enhanced Input Local Player Subsystem -> Add Mapping Context (Mapping Context = IMC_UI, Priority = 100). Pick a priority above your gameplay contexts, and in IMC_UI untick Consume Input on any UI mapping whose key overlaps a gameplay action.
IMC_UI being added: a CrimsonActionWidget/Bound Action Button resolves its icon by querying the keys mapped to the action, which only works once the context is added to the EnhancedInputLocalPlayerSubsystem. Add it at a higher priority than your gameplay contexts, and set each UI mapping's Consume Input toggle to off where its key overlaps a gameplay key - so glyphs resolve and the UI reacts while the same key still reaches gameplay. The platform controller-brush data (CommonInput_KeyboardMouse, CommonInput_Gamepad_*, all shipped) must also be registered as +ControllerData= under the platform's CommonInputPlatformSettings, or glyphs render blank.Crimson_CommonUIInputData asset also carries the legacy DefaultClickAction / DefaultBackAction (DataTable-based) fields, used when Enhanced Input Support is off. The Enhanced Input path (support on) is recommended for new 5.8 projects - it resolves live key bindings for glyphs. bEnableEnhancedInputSupport also unlocks the EscapeInputAction binding in How-To: HUD Layout & Escape Menu and per-layer input domains via an ActionDomainTable (see Concept: Input Routing & Activatable Widgets).Crimson_CommonUIInputData, and IMC_UI (mapping keys to its Click/Back actions) is added to the player. Routing is exercised the first time you push an activatable widget (step 7) - a button reacts to the Confirm key and shows its glyph.5. Layer tags (shipped - add your own if needed)
Layers are gameplay tags under the UI.Layer parent. The base set - UI.Layer.Game, UI.Layer.GameMenu, UI.Layer.Menu, UI.Layer.Modal, UI.Layer.ContextMenu - is defined natively in CrimsonCommon (the shared layer that owns the layout/push system), so the tags exist whenever any Crimson UI is present and appear in every UI.Layer picker automatically. The shipped root layout registers a stack under each, so there is nothing to set up here. Define an additional layer only if your game needs one (e.g. a dedicated tooltip or notification layer):
; Config/DefaultGameplayTags.ini - only for EXTRA layers beyond the shipped base set[/Script/GameplayTags.GameplayTagsSettings]+GameplayTagList=(Tag="UI.Layer.Notification",DevComment="Toasts / transient notifications")
UI.Layer tag only creates the identifier - nothing pushes to it until the root layout registers a stack under it. To add a layer, subclass the shipped W_CrimsonOverallUILayout (or build your own - see How-To: Build the Boot Assets by Hand) and call Register Layer for the new tag.RegisterLayer and the push functions restrict their tag pickers to the UI.Layer category (meta = (Categories = "UI.Layer")), so a tag outside that parent will not appear in the dropdowns - and RegisterLayer also rejects a non-UI.Layer tag at runtime (logged as an error), in case one is passed via a variable or from C++.UI.Layer field (e.g. the Layer Name pin in step 7) lists UI.Layer.Game, UI.Layer.GameMenu, UI.Layer.Menu, UI.Layer.Modal, and UI.Layer.ContextMenu.6. UI policy & defaults (pre-configured)
Nothing to set up here - CrimsonUI ships these settings pre-filled at Project Settings -> Crimson -> Crimson UI (UCrimsonUISettings, saved to DefaultCrimsonUI.ini), each pointing at its ready-made asset. So a fresh project already has a working policy, dialogs, and context menus. The default DefaultUIPolicyClass is B_CrimsonUIPolicy, whose LayoutClass is W_CrimsonOverallUILayout - the root UCrimsonPrimaryGameLayout that owns a stack for every standard layer (Game, GameMenu, Menu, Modal, ContextMenu). Open the panel only to point a setting at your own subclass:
| Setting | Default (shipped) | Notes |
|---|---|---|
DefaultUIPolicyClass | B_CrimsonUIPolicy | Loaded once at game-instance startup; its LayoutClass is W_CrimsonOverallUILayout. |
ConfirmationDialogClass / ErrorDialogClass | W_CrimsonConfirmationDefault / W_CrimsonConfirmationError | For dialogs - see How-To: Show Confirmation Dialogs. |
DefaultModalContextMenuClass / ...World / ...Radial | W_ContextMenu_Modal / W_ContextMenu_World / W_ContextMenu_Radial | For context menus - see How-To: Show a Context Menu. |
/CrimsonUI/UI/...) and double as reference implementations - tick Show Plugin Content in the Content Browser's Settings menu to browse them. The Overview page's Shipped example content table maps every asset to what it demonstrates.B_CrimsonUIPolicy and is read once in UCrimsonUIManagerSubsystem::Initialize (game-instance startup). If you clear it, no policy = no layout for any player. Changing it requires restarting PIE.W_CrimsonOverallUILayout instance exists. Empty screen is correct - nothing is pushed yet.7. Push the HUD layout
The plugin ships W_CrimsonHUD_Layout (a UCrimsonHUDLayout) - the always-present root HUD screen, already wired with the escape/pause menu (W_CrimsonGameMenu via Crimson_IA_UI_Escape) and the controller-disconnect screen. Push it onto the Game layer when the local player is ready:
In your PlayerController Blueprint: Event BeginPlay -> Is Local Player Controller (Branch, True) -> Push Content To Layer For Player (Owning Player = Self, Widget Class = W_CrimsonHUD_Layout, Layer Name = UI.Layer.Game). The node is async (from UCrimsonAsyncAction_PushToLayer) - it loads the soft class reference before pushing. Its BeforePush pin fires with the created widget before activation - use it to set variables the widget reads on activate; AfterPush fires once it is live.
UCrimsonHUDLayout (or the shipped asset) - see How-To: Build the Boot Assets by Hand; wire its pause menu and controller-disconnect screen in How-To: HUD Layout & Escape Menu.8. (Recommended) Set the HUD actor class
ACrimsonHUD registers itself with UGameFrameworkComponentManager, which lets GameFeature actions attach HUD widgets/components later, and feeds the ability-system debugger a useful actor list. Set it as your GameMode's HUD Class:
Open Project Settings -> Maps & Modes. Under Default Modes, set Default GameMode to your GameMode Blueprint, then set Selected GameMode -> HUD Class = Crimson HUD (or a Blueprint subclass of it). This saves onto your GameMode Blueprint - no .ini editing required.
The Selected GameMode rows are editable only while the Default GameMode is a Blueprint. You can set the same value directly on the GameMode Blueprint instead: open it and use Class Defaults -> Classes -> HUD Class.
B_CrimsonGameInstance, CrimsonCoreLocalPlayer, a policy + root layout, and a GFA_AddWidget GameFeature action that pushes W_CrimsonHUD_Layout when the HUD spawns - so you skip straight to building screens. See Concept: Full-Stack Integration & Multiplayer.