A 3D UI system for Unreal Engine 5.8 — widgets that live in the world, a prefab workflow, and a designer built to feel like UMG's.
Install · vs UMG · vs upstream · Status · License
DreamGUI is a fork of LGUI / LexUI by Lex Liu, MIT licensed. It is not a drop-in replacement for it — see how it differs.
A UI widget here is a UObject with a rect, a pivot and anchors, arranged into a tree and drawn by
a canvas that batches the whole tree into as few draw calls as it can. That is Unity's uGUI shape
rather than Slate's, and it buys three things UMG cannot do as directly:
- UI in the world. A canvas can render in screen space or sit on a surface in the level, at any angle, lit or unlit, with correct hit testing either way.
- Prefabs. A UI tree is an asset you instance, nest and override, rather than a Blueprint class you subclass.
- Per-widget perspective. A widget can establish a perspective its subtree is foreshortened
into, the way CSS
perspectiveworks.
It costs you Slate's ecosystem: none of UMG's widgets, styles or bindings apply.
Requires Unreal Engine 5.8. Clone into your project's Plugins/ directory:
git clone https://github.com/TypeDreamMoon/DreamGUI.git Plugins/DreamGUIRegenerate project files and build. That is the whole install for a fresh project.
They reference the old class names and the old /LGUI/ mount, so they need CoreRedirects — and
the engine only reads those from the project's config. A plugin's own Config/DefaultEngine.ini
is not consulted for them.
Copy the [CoreRedirects] block from
Config/DefaultEngine.ini into your project's
Config/DefaultEngine.ini.
Skip this if you are starting fresh.
Worth knowing before you commit to either, because the difference is structural rather than cosmetic.
| UMG / Slate | DreamGUI | |
|---|---|---|
| Widget | SWidget, retained-mode Slate |
UObject in a component-like tree |
| Sizing | Content-sized: a widget's size is its desired size | Box-first: you author a rect, content is arranged inside it |
| Text | The box grows to the text | The text is aligned in the box, and may overflow it |
| Placement | Slot-relative | Anchors + pivot, resolution-independent |
| Reuse | Widget Blueprint subclassing | Prefab assets with nested instances and overrides |
| In-world | WidgetComponent, a rendered quad |
A first-class render mode |
The text difference is the one that surprises people. In UMG a TextBlock cannot overflow, because
its box is derived from the text; you control wrapping instead. Here the rect is authored, so text
can overflow it, and you get controls UMG has no need for — Margin, LineHeightPercentage,
WrapTextAt and Best Fit (shrink the font until it fits, which neither UMG nor Slate offers).
Forked from upstream LexUI/5.7 at 765efeaf1 (2026-07-13); 214 commits since.
Upstream is actively developed, but the two branches can no longer be merged cheaply:
| Upstream | Here | |
|---|---|---|
| Engine | UE 5.7 — no 5.8 branch on the LexUI line | UE 5.8 |
| Layout | FlexBox + Grid family, still being developed | Family deleted; UMG-shaped panels only |
| Editor | — | Designer largely rebuilt |
The layout split is the sharpest of these. Upstream's 2026-08-08 fix for an infinite loop in
ULexLayoutContainerFlexBox has no meaning here, because that class no longer exists.
Layout, along the lines Blink and Yoga use. Measurement is const and separated from
application; panels arrange into an immutable fragment that is committed in one write; desired size
is memoised for the duration of a pass; invalidation carries a reason, so moving a widget no longer
re-measures the whole ancestor chain. The legacy Lex layout family
(ULexLayoutContainerFlexBox, ULexLayoutContainerGrid, ULexLayoutSelfFlexBox,
ULexLayoutSelfGrid, and the ELexUILayoutMode switch) was deleted.
The prefab editor, reviewed against UMG's widget designer. Viewport picking is by widget rect rather than by rendered triangles — layout-only panels have no mesh, so a raycast could never hit them, which made panels unclickable and undroppable. Added since: hover feedback, per-axis resize handles, an anchor medallion, marquee selection, drag-to-reparent on the canvas, Content-Browser drops onto the design surface, palette favourites, type-aware search, and undo coverage for create, paste and drop.
Text, with the four controls listed above.
Perspective, per widget and inherited by its subtree. Requires a screen-space canvas with a perspective projection; inert otherwise.
Render transform, widened to three dimensions, so a widget can be animated inside a layout without the layout fighting it.
The prefab editor works on a loaded preview hierarchy. Nothing reaches the asset until Apply, and nothing reaches disk until Save — or until Apply does it for you, if Save on Apply is set to something other than its default of Never.
Saving a child prefab refreshes its instances inside any loaded parent. Overrides that were registered survive that refresh; changes that were never recorded as overrides can be replaced by it. So: edit the source prefab for a change every instance should see, and pin an override for a change only one parent should.
Warning
SavePrefab performs full serialization, not a property-level patch, and
ClearLoadedPrefab + Init rebuilds the hierarchy and can discard unapplied editor changes.
Tooling that rewrites prefabs should work on a transient duplicate, refuse to run against an
editor with unapplied changes, and never call SavePrefab on a production asset from a test.
279 automation tests — Automation RunTests DreamGUI. There were none before this fork.
Known gaps:
LineHeightPercentageandWrapTextAtare only reachable through a real font asset, so they are not covered by tests.- 25 content assets still carry
Lexin their names. Renaming a.uassetfile does not rename the object inside it, so only an editor-side rename can change those; the code points at what is actually on disk. - The editor work is verified by tests, not by eye. Expect rough edges in the designer.
MIT — see LICENSE.
Copyright (c) 2026-present TypeDreamMoon Copyright (c) 2019-present Lex Liu
Substantial portions of this software remain the work of Lex Liu and are used under the MIT terms of the original project. The MIT notice must travel with any copy or substantial portion of this code, including yours.