UE5 UMG Studio
Orchestrate C++ logic and Blueprint visuals for production UE5 user interfaces.
Work in two layers: C++ for architecture and data binding, Blueprints for layout and polish.
Overview
Build production-ready Unreal Engine 5 user interfaces using a hybrid C++/Blueprint approach.
C++ handles widget architecture, data binding, lifecycle, and performance; Blueprints handle
layout, styling, animation, and visual state management.
When to Use
- Creating HUDs, menus, inventories, settings panels, or any widget-based interface
- Binding C++ properties to Blueprint widget components via
BindWidget
- Handling gamepad or keyboard focus navigation and input modes
- Designing responsive UMG layouts, animations, and visual states
- Optimizing UI performance (widget pooling, ListView, Tick abuse, material overhead)
- Troubleshooting memory leaks from widget pools or dangling delegate references
When NOT to Use
- Editor tools, debug overlays, or custom Slate drawing — see
references/slate-fundamentals.md
- Deep Common UI Plugin specifics — refer to official Epic documentation
- General gameplay programming unrelated to UI
Core Pattern: Hybrid C++/Blueprint Workflow
Without separation: Blueprint-only logic becomes spaghetti, C++-only UI is slow to iterate.
With separation: C++ owns data, state, and lifecycle; Blueprints own layout, style, and animation.
// C++ Logic Layer: data binding and state
UCLASS(Abstract)
class UMyWidget : public UUserWidget
{
GENERATED_BODY()
protected:
UPROPERTY(meta = (BindWidget))
TObjectPtr<UProgressBar> HealthBar;
virtual void NativeConstruct() override;
virtual void NativeDestruct() override;
};
void UMyWidget::NativeConstruct()
{
Super::NativeConstruct();
if (HealthBar)
{
HealthBar->SetPercent(1.0f);
}
}
The Blueprint subclass of UMyWidget places a ProgressBar named HealthBar
in the Designer and styles it without any logic nodes.
Quick Reference
| Task |
Reference File |
| C++ base class, BindWidget, pooling, ListView, input modes |
references/umg-cpp-patterns.md |
| Layout containers, anchors, animation, styling, materials |
references/blueprint-visuals.md |
| Common mistakes and how to fix them |
references/common-pitfalls.md |
| Slate direct usage for editor tools |
references/slate-fundamentals.md |
Key Rules
C++ Logic:
- Always use
UCLASS(Abstract) on base classes meant for Blueprint subclassing
- BindWidget names must match Blueprint component names exactly (case-sensitive)
- Bind delegates in
NativeConstruct, unbind in NativeDestruct
- Override
ReleaseSlateResources when using FUserWidgetPool
Blueprint Visuals:
- Design at your minimum supported resolution (e.g. 1280x720)
- Use
Collapsed visibility for hiding; Hidden only to preserve layout space
- Use
WidgetSwitcher for mutually exclusive pages, not Visibility toggling
- Never use Blueprint "Bind" properties — they run every frame
Performance:
- Use
UListView / UTileView for scrollable lists with 10+ items
- Avoid
NativeTick for polling; use delegates and events
- Call
SetVisibility only when state actually changes
Quality Gates
1---2name: ue5-umg3description: Use when building HUDs, menus, inventory screens, settings panels, or any widget-based interface in Unreal Engine 5. Also use when connecting C++ logic to UMG Blueprint visuals, handling gamepad or keyboard focus navigation, managing UI state, creating widget animations, or troubleshooting UMG performance issues like frame drops, hitches, or widget memory leaks.4---56# UE5 UMG Studio78Orchestrate C++ logic and Blueprint visuals for production UE5 user interfaces.9Work in two layers: C++ for architecture and data binding, Blueprints for layout and polish.1011## Overview1213Build production-ready Unreal Engine 5 user interfaces using a hybrid C++/Blueprint approach.14C++ handles widget architecture, data binding, lifecycle, and performance; Blueprints handle15layout, styling, animation, and visual state management.1617## When to Use1819- Creating HUDs, menus, inventories, settings panels, or any widget-based interface20- Binding C++ properties to Blueprint widget components via `BindWidget`21- Handling gamepad or keyboard focus navigation and input modes22- Designing responsive UMG layouts, animations, and visual states23- Optimizing UI performance (widget pooling, ListView, Tick abuse, material overhead)24- Troubleshooting memory leaks from widget pools or dangling delegate references2526## When NOT to Use2728- Editor tools, debug overlays, or custom Slate drawing — see `references/slate-fundamentals.md`29- Deep Common UI Plugin specifics — refer to official Epic documentation30- General gameplay programming unrelated to UI3132## Core Pattern: Hybrid C++/Blueprint Workflow3334**Without separation:** Blueprint-only logic becomes spaghetti, C++-only UI is slow to iterate.35**With separation:** C++ owns data, state, and lifecycle; Blueprints own layout, style, and animation.3637```cpp38// C++ Logic Layer: data binding and state39UCLASS(Abstract)40class UMyWidget : public UUserWidget41{42 GENERATED_BODY()4344protected:45 UPROPERTY(meta = (BindWidget))46 TObjectPtr<UProgressBar> HealthBar;4748 virtual void NativeConstruct() override;49 virtual void NativeDestruct() override;50};51```5253```cpp54void UMyWidget::NativeConstruct()55{56 Super::NativeConstruct();57 if (HealthBar)58 {59 HealthBar->SetPercent(1.0f);60 }61}62```6364The Blueprint subclass of `UMyWidget` places a ProgressBar named **HealthBar**65in the Designer and styles it without any logic nodes.6667## Quick Reference6869| Task | Reference File |70|------|---------------|71| C++ base class, BindWidget, pooling, ListView, input modes | `references/umg-cpp-patterns.md` |72| Layout containers, anchors, animation, styling, materials | `references/blueprint-visuals.md` |73| Common mistakes and how to fix them | `references/common-pitfalls.md` |74| Slate direct usage for editor tools | `references/slate-fundamentals.md` |7576## Key Rules7778**C++ Logic:**79- Always use `UCLASS(Abstract)` on base classes meant for Blueprint subclassing80- BindWidget names must match Blueprint component names exactly (case-sensitive)81- Bind delegates in `NativeConstruct`, unbind in `NativeDestruct`82- Override `ReleaseSlateResources` when using `FUserWidgetPool`8384**Blueprint Visuals:**85- Design at your minimum supported resolution (e.g. 1280x720)86- Use `Collapsed` visibility for hiding; `Hidden` only to preserve layout space87- Use `WidgetSwitcher` for mutually exclusive pages, not Visibility toggling88- Never use Blueprint "Bind" properties — they run every frame8990**Performance:**91- Use `UListView` / `UTileView` for scrollable lists with 10+ items92- Avoid `NativeTick` for polling; use delegates and events93- Call `SetVisibility` only when state actually changes9495## Quality Gates9697- [ ] `UCLASS(Abstract)` on base classes; BindWidget names match exactly98- [ ] Delegates bound in `NativeConstruct`, unbound in `NativeDestruct`99- [ ] Input mode and focus set when showing or hiding UI100- [ ] `ReleaseSlateResources` implemented if using widget pools101- [ ] ListView used for scrollable lists with 10+ items102- [ ] No Blueprint "Bind" properties used for dynamic values103- [ ] UI designed at minimum target resolution; anchors used for responsiveness