Course contentsShow
← Unreal Engine Game Development
Lesson 154 of 8802. The Gameplay FrameworkFree lesson

Building a Custom HUD Class for Modular UI Management

You will structure a central HUD class to manage multiple widget layers, ensuring clean separation between game logic and visual representation.

In this lesson, you will learn how to architect a central HUD class to act as a traffic controller for your game’s UI, keeping your logic organized and decoupled.

The Problem with Monolithic UI

As your game grows, creating widgets directly inside the PlayerController or individual Actors leads to "spaghetti code." If your Health Bar, Mini-map, and Inventory all try to talk to the player independently, changing one system often breaks the others. A custom HUD class acts as the bridge between your game logic (stored in components or GameInstance) and your visual layers.

Architecting the Manager

Think of the HUD class as a UI Orchestrator. Instead of spawning widgets randomly, your HUD class holds references to each "layer" of your UI. You define a method within your custom HUD class to handle the lifecycle of these widgets.

Here is how you might structure the initialization in your custom HUD class:

// Inside your custom HUD class
void AMyGameHUD::BeginPlay()
{
    Super::BeginPlay();

    // Spawn the primary UI layers
    if (MainOverlayClass)
    {
        MainOverlay = CreateWidget<UUserWidget>(GetOwningPlayerController(), MainOverlayClass);
        MainOverlay->AddToViewport(0); // Layer 0: Background/HUD
    }

    if (InventoryClass)
    {
        InventoryWidget = CreateWidget<UUserWidget>(GetOwningPlayerController(), InventoryClass);
        InventoryWidget->AddToViewport(1); // Layer 1: Foreground/Menu
        InventoryWidget->SetVisibility(ESlateVisibility::Hidden);
    }
}

Why this approach works

  1. Z-Order Management: By using the AddToViewport Z-order parameter, you control exactly which UI elements appear on top of others, preventing the inventory from accidentally hiding the HUD.
  2. Centralized Visibility: When the player presses 'I' for inventory, you don't hunt for a reference; you simply call MyHUD->InventoryWidget->SetVisibility(Visible) from your PlayerController.
  3. Decoupling: Your game logic actors don't need to know how to create widgets; they only need to send a message to the HUD (often via a Blueprint Interface) to update specific data, keeping your systems modular and clean.

Key Takeaway: A custom HUD class centralizes your widget lifecycle and Z-order management, ensuring that your game logic remains independent of the UI’s visual implementation.