HUD system
The HUD stack/modal framework is implemented in the PulseHUD module.
Primary building blocks:
UPulseGlobalHUDManagerUPulsePlayerHUDManagerIPulseHUDManagerInterfaceUPulseHUDStackContainerUPulseHUDModalBaseand modal derivativesUPulsePlayerInputManagerUPulseHUDSettings
Manager architecture
HUD can run in two subsystem scopes:
- Global manager (
UGameInstanceSubsystem) - Per-player manager (
ULocalPlayerSubsystem)
Both manager classes share behavior through IPulseHUDManagerInterface.
Initialization
InitializeHUD(...):
- Loads configured HUD widget class from
FPulseHUDManagerParams. - Creates widget instance (
CreateHUDWidgetimplementation differs per subsystem type). - Calls
OnHUDManagerSeton the HUD widget (IPulseHUDInterface). - Scans widget tree for
UPulseHUDStackContainerinstances. - Validates required stack
Pulse.HUD.Stack.Main. - Creates widget pools for modals/content/style.
- Adds HUD to viewport:
- global:
AddViewportWidgetContent - player:
AddViewportWidgetForPlayer
- global:
DeinitializeHUD() removes viewport content and resets pools/references.
HUD widget contract
Your main HUD widget class must implement IPulseHUDInterface.
Interface functions:
OnHUDManagerSet(...)AddStackContainer(...)(Blueprint event)
Stack tags are declared in Pulse::HUD::Stack:
Pulse.HUD.Stack.Main(required)Pulse.HUD.Stack.NotificationPulse.HUD.Stack.Modal
Stack system
UPulseHUDStackContainer wraps a UCommonActivatableWidgetContainerBase.
Capabilities:
- Push by widget instance
- Push by widget class
- Emits events:
OnWidgetPushedEventOnWidgetDeactivatedEventOnDisplayedWidgetChangedEvent
Modal stack constraint:
- If stack name is
Pulse.HUD.Stack.Modal, container class must beUCommonActivatableWidgetQueue(validated in editor/runtime checks).
Modal pipeline
Modal push entrypoints on IPulseHUDManagerInterface:
PushModal(FPulseHUDModalPushParams)PushSimpleModal(FPulseHUDSimpleModalPushParams)PushConfirmModal(FPulseHUDConfirmModalPushInfo, FPulseHUDModalPushBase)
Flow for a modal push:
- Resolve modal stack (
Pulse.HUD.Stack.Modal). - Acquire modal widget from pool or provided instance.
- Resolve style and metadata (
SetupNewModal). - Push modal container to modal stack.
- Initialize container with modal.
- Bind deactivation callback to release pooled resources.
Widget pools
IPulseHUDManagerInterface owns three pools:
ModalWidgetPoolModalContentWidgetPoolModalStyleWidgetPool
These pools reduce allocation churn for repeated modal usage.
Modal classes
UPulseHUDModalBase
Base behavior:
- optional runtime style injection (
SetRuntimeModalStyle) - metadata assignment/release (
SetModalMetadata) - slate wrapper (
SPulseModalWidget) - handles style-container vs direct insertion in
AddToModalContainer
On deactivation:
- style detached/reset
- metadata
OnRemovedFromModalcalled - metadata returned to metadata pool
UPulseHUDSimpleModalBase
Adds:
- single content widget insertion into
ContentWidget - modal content interface callbacks if content implements
UPulseHUDModalContentInterface:OnModalContentSetOnModalOpenedOnModalClosed
UPulseHUDConfirmModalBase
Adds:
FPulseHUDConfirmModalInfodata- confirm/cancel button construction
- optional pooled content widget
- confirm action delegates:
OnConfirmNativeOnConfirm(Blueprint)
- auto-close behavior via
bCloseOnConfirm
Button classes/styles resolve through confirm info overrides, then plugin defaults (UPulseHUDSettings).
Modal metadata pool
Metadata system classes:
UPulseHUDModalMetadataFPulseHUDModalMetadataPool
Global helper namespace:
Pulse::HUD::Modal::GetOrCreateModalMetadata(...)Pulse::HUD::Modal::ReleaseModalMetadata(...)
Metadata lifecycle:
- Retrieved from pool (or created)
InitializeMetadata()called- assigned to modal (
OnSetToModal) - on close:
OnRemovedFromModal+ returned to inactive pool
Input context manager
UPulsePlayerInputManager is a ULocalPlayerSubsystem controlled by HUD settings.
Enabled by:
UPulseHUDSettings::bEnablePlayerInputManager
Supports prioritized input contexts (FPulseInputContext):
ShowMouseCursorModeInputMode(Game,UI,GameAndUI,Inherit)WidgetToFocusMouseLockModebFlushInputStackbHideCursorDuringCapture
Public API:
AddInputContext(Context, Priority)→ returnsFPulseHUDHandleRemoveInputContext(Handle)
Top-priority context wins, with Inherit fallback walking lower-priority contexts and finally project defaults.
Settings reference (UPulseHUDSettings)
Main configurable defaults:
- Manager enable flags + manager params
- player input manager behavior defaults
- default modal style/container
- default simple modal class
- default confirm modal class/buttons/button styles
Defaults are initialized in PulseHUDSettings.cpp with plugin content assets under /PulseCore/HUD/....