How-To: Bind CommonUI Actions (UE 5.8+)
Goal: bind UI navigation actions (Escape, Confirm, Back, Tab) to CommonUI widgets directly from Enhanced Input, so glyphs track the player's live binding and you keep no UCommonUIInputData DataTable.
CommonUI plugin enabled, and a UCommonActivatableWidget (or UCrimsonActivatableWidget) you can edit.1. Enable Enhanced Input support for CommonUI
In Config/DefaultGame.ini, turn on Enhanced Input support so FBindUIActionArgs accepts a UInputAction* directly:
[/Script/CommonInput.CommonInputSettings]bEnableEnhancedInputSupport=TrueEnhancedInputClickAction=/Game/Input/IA_UI_Confirm.IA_UI_ConfirmEnhancedInputBackAction=/Game/Input/IA_UI_Back.IA_UI_Back
bEnableEnhancedInputSupport is false, the UInputAction* constructor of FBindUIActionArgs has no effect and your action never fires.2. Populate UIInputActions and the settings mirror
Add one entry per UI semantic action to your config's UIInputActions list, then also assign the confirm/back assets in Project Settings -> Crimson -> Crimson Input -> UI Input (UCrimsonInputSettings.UIConfirmAction / UIBackAction) so game code has one authoritative reference.
| Suggested tag | Assign |
|---|---|
InputTag.UI.Escape | Your Escape / Pause UInputAction |
InputTag.UI.Confirm | Your Accept / Confirm UInputAction |
InputTag.UI.Back | Your Back / Cancel UInputAction |
3. Bind the action in a widget
Resolve the action by tag (from an InputConfig reference the widget holds) and register the binding with FBindUIActionArgs. CommonUI's action router reads the currently-bound key from the player's IMC, so glyphs auto-update on rebind. This step is C++-only - see the callout below.
FBindUIActionArgs(UInputAction*, ...), and CrimsonInput deliberately does not add one - wrapping CommonUI's binding would pull a UI dependency into an input plugin. On the full Crimson stack, CrimsonUI and CrimsonCore bind UI actions natively for you; standalone, wrap the call below in your own C++ widget base. CrimsonInput's role is only to supply the tagged UInputAction assets - and FindUIInputActionForTag is BlueprintCallable, so Blueprint can still look the action up.#include "CrimsonInputConfig.h"#include "Input/CommonUIInputTypes.h" // FBindUIActionArgsvoid UMyWidget::NativeOnInitialized(){Super::NativeOnInitialized();const FGameplayTag EscapeTag = FGameplayTag::RequestGameplayTag(FName("InputTag.UI.Escape"));if (const UInputAction* Escape = InputConfig->FindUIInputActionForTag(EscapeTag, /*bLogNotFound*/ false)){RegisterUIActionBinding(FBindUIActionArgs(Escape, /*bShouldDisplayInActionBar*/ false,FSimpleDelegate::CreateUObject(this, &ThisClass::HandleEscape)));}}
There is no Blueprint node for this binding. If you use CrimsonUI / CrimsonCore it is handled for you; otherwise expose a thin BlueprintCallable wrapper (taking the resolved UInputAction*) on your own C++ widget base and call that from Blueprint.
4. HUD-level Escape (CrimsonUI)
If you use CrimsonUI, UCrimsonHUDLayout exposes an optional EscapeInputAction. Assign it and the HUD's Escape binding uses the Enhanced Input path (live glyph); leave it null to fall back to the legacy tag-based binding.
ECrimsonWidgetInputMode on UCrimsonActivatableWidget drives an FUIInputConfig on activation, and UE 5.8 action-domain tables give coarser per-layer defaults. See the CrimsonUI wiki. CrimsonInput's job here is only to supply the UInputAction assets and the settings mirror.See also
- How-To: Create an Input Config - the
UIInputActionslist. - CrimsonUI wiki - activatable widgets, input modes, and HUD layout.