HUD system

The HUD stack/modal framework is implemented in the PulseHUD module.

Primary building blocks:

  • UPulseGlobalHUDManager
  • UPulsePlayerHUDManager
  • IPulseHUDManagerInterface
  • UPulseHUDStackContainer
  • UPulseHUDModalBase and modal derivatives
  • UPulsePlayerInputManager
  • UPulseHUDSettings

Manager architecture

HUD can run in two subsystem scopes:

  1. Global manager (UGameInstanceSubsystem)
  2. Per-player manager (ULocalPlayerSubsystem)

Both manager classes share behavior through IPulseHUDManagerInterface.

Initialization

InitializeHUD(...):

  1. Loads configured HUD widget class from FPulseHUDManagerParams.
  2. Creates widget instance (CreateHUDWidget implementation differs per subsystem type).
  3. Calls OnHUDManagerSet on the HUD widget (IPulseHUDInterface).
  4. Scans widget tree for UPulseHUDStackContainer instances.
  5. Validates required stack Pulse.HUD.Stack.Main.
  6. Creates widget pools for modals/content/style.
  7. Adds HUD to viewport:
    • global: AddViewportWidgetContent
    • player: AddViewportWidgetForPlayer

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.Notification
  • Pulse.HUD.Stack.Modal

Stack system

UPulseHUDStackContainer wraps a UCommonActivatableWidgetContainerBase.

Capabilities:

  1. Push by widget instance
  2. Push by widget class
  3. Emits events:
    • OnWidgetPushedEvent
    • OnWidgetDeactivatedEvent
    • OnDisplayedWidgetChangedEvent

Modal stack constraint:

  • If stack name is Pulse.HUD.Stack.Modal, container class must be UCommonActivatableWidgetQueue (validated in editor/runtime checks).

Modal push entrypoints on IPulseHUDManagerInterface:

  1. PushModal(FPulseHUDModalPushParams)
  2. PushSimpleModal(FPulseHUDSimpleModalPushParams)
  3. PushConfirmModal(FPulseHUDConfirmModalPushInfo, FPulseHUDModalPushBase)

Flow for a modal push:

  1. Resolve modal stack (Pulse.HUD.Stack.Modal).
  2. Acquire modal widget from pool or provided instance.
  3. Resolve style and metadata (SetupNewModal).
  4. Push modal container to modal stack.
  5. Initialize container with modal.
  6. Bind deactivation callback to release pooled resources.

Widget pools

IPulseHUDManagerInterface owns three pools:

  • ModalWidgetPool
  • ModalContentWidgetPool
  • ModalStyleWidgetPool

These pools reduce allocation churn for repeated modal usage.

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:

  1. style detached/reset
  2. metadata OnRemovedFromModal called
  3. metadata returned to metadata pool

UPulseHUDSimpleModalBase

Adds:

  • single content widget insertion into ContentWidget
  • modal content interface callbacks if content implements UPulseHUDModalContentInterface:
    • OnModalContentSet
    • OnModalOpened
    • OnModalClosed

UPulseHUDConfirmModalBase

Adds:

  • FPulseHUDConfirmModalInfo data
  • confirm/cancel button construction
  • optional pooled content widget
  • confirm action delegates:
    • OnConfirmNative
    • OnConfirm (Blueprint)
  • auto-close behavior via bCloseOnConfirm

Button classes/styles resolve through confirm info overrides, then plugin defaults (UPulseHUDSettings).

Metadata system classes:

  • UPulseHUDModalMetadata
  • FPulseHUDModalMetadataPool

Global helper namespace:

  • Pulse::HUD::Modal::GetOrCreateModalMetadata(...)
  • Pulse::HUD::Modal::ReleaseModalMetadata(...)

Metadata lifecycle:

  1. Retrieved from pool (or created)
  2. InitializeMetadata() called
  3. assigned to modal (OnSetToModal)
  4. 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):

  • ShowMouseCursorMode
  • InputMode (Game, UI, GameAndUI, Inherit)
  • WidgetToFocus
  • MouseLockMode
  • bFlushInputStack
  • bHideCursorDuringCapture

Public API:

  1. AddInputContext(Context, Priority) → returns FPulseHUDHandle
  2. RemoveInputContext(Handle)

Top-priority context wins, with Inherit fallback walking lower-priority contexts and finally project defaults.

Settings reference (UPulseHUDSettings)

Main configurable defaults:

  1. Manager enable flags + manager params
  2. player input manager behavior defaults
  3. default modal style/container
  4. default simple modal class
  5. default confirm modal class/buttons/button styles

Defaults are initialized in PulseHUDSettings.cpp with plugin content assets under /PulseCore/HUD/....


PulseCore plugin documentation.

This site uses Just the Docs, a documentation theme for Jekyll.