Modular C++ framework for Unreal Engine 5. 26 plugins, star topology architecture, and editor tooling.
As of v0.1.1 (UE 5.7.4, Development Preview) — Windows Development targets, plus 2 UncookedOnly and 1 DeveloperTool module.
PGX enforces a strict star topology: every L2 plugin depends exclusively on PGXCoreRuntime. No L2-to-L2 runtime dependencies — ever.
Cross-plugin communication happens through two dedicated buses: UPGXMessageSubsystem (pub/sub) and UPGXEventHandlerSubsystem (behavior resolution).
This architecture guarantees that any plugin can be added or removed without breaking the rest of the framework.
Each subsystem ships with types, delegates, config data assets, tags, console commands, a Blueprint library, an inspector, and documentation. Maturity varies by plugin — see the maturity matrix.
UPGXPlatformConfig DA → Budget structs
LogPGX{System} per-module categories
SaveContext → EPGXSaveResult
SetStateByTag → FPGXFlowResult
RequestPSOWarmUp → bool
RequestLevelTransition → Result
RequestLoading → Result
UEngineSubsystem — GC snapshots
PlaySound2D | PlayMusic | Dialogue
FindRegistryEntry → Entry
DA slot → Default | CppClass | Blueprint
Broadcast PGX Message → OnMessage
QuickExecute → EPGXEventResult
Every system above lives inside the Hub Dashboard. Version, health status, and KPI chips — at a glance. One click opens any inspector.
No terminal, no file browsing. Everything you need to manage PGX systems is already in the editor.
Hub screenshot from an internal development build. Counters predate the v0.1.1 snapshot.
Every system follows the same patterns. Learn one, know them all.
// Save flow, adapted from PGXDemoGameMode.cpp (v0.1.1) // Tags come from your project UPGXSaveSubsystem* Save = GetGameInstance()->GetSubsystem<UPGXSaveSubsystem>(); if (UPGXSaveGame* Data = Save->GetSaveGame(Tag_Save_Progress)) { Data->WriteInt(TEXT("InteractionCount"), InteractionCount); Save->SaveContext(Tag_Save_Context, TEXT("DemoSlot")); } // Change GameFlow state (same source) UPGXGameFlowSubsystem* Flow = GetGameInstance()->GetSubsystem<UPGXGameFlowSubsystem>(); FPGXFlowResult FlowResult = Flow->SetStateByTag(EPGXFlowChannel::Global, Tag_Flow_Interacted, this); // Fire a resolvable event UPGXEventHandlerBlueprintLibrary::QuickExecute(this, Tag_Ability_Cast);
// Blueprint nodes call the same operations as C++ PGX Save SaveContext(ContextTag, SlotName) GetSaveGame(DomainTag) QuickSave(ContextTag) DoesSlotExist(ContextTag, SlotName) PGX Message Broadcast PGX Message(Channel, Message ← morphing pin, any struct) Listen for PGX Messages(Channel) → OnMessage GetPayload PGX EventHandler QuickExecute(EventTag) RegisterHandler(EventTag, HandlerClass, Lifecycle) PGX Audio PlaySound2D(Sound, Params) PlayMusic(Music, FadeIn) SetChannelVolume(ChannelTag, Volume)
The code above creates save domains, broadcasts messages, and fires events. The Save Inspector shows you the result in real time: domains, keys, slot status, and pipeline logs.
Every subsystem has its own inspector. No guessing, no breakpoints needed.
An editor integration with custom panels, visual construction, and one-click workflows.
In-editor documentation with md4c parser. No WebBrowser dependency.
Full-stack test harness. Demo mode + deep injection across subsystems.
4 built-in templates. Source control + rollback. JSON audit trail.
Central toolbar, Hub dashboard, system observer, test dashboard, settings.
Source control utilities integrated into the editor workflow.
Sparklines, health dots, and live metrics for PGX subsystems. Built on the SlateIM graph engine with real-time polling. Spot bottlenecks before they become bugs.