Professional modular C++ framework for Unreal Engine 5. 13 production subsystems, star topology architecture, and comprehensive editor tooling.
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 system ships with types, delegates, config DA, tags, console commands, BP library, inspector, and full documentation.
UPGXPlatformConfig DA → Budget structs
LogPGX{System} per-module categories
QuickSaveAsync → OnSaveComplete
RequestTransition(Tag) → OnFlowChanged
ActivatePipeline(Tag) → PSOReady
RequestLevel(Name) → OnTransition
ShowLoadingScreen(Config)
UEngineSubsystem — GC snapshots
PlaySound(Tag) | Music | Dialogue
FindByTag<T>(Tag) → UObject*
DA slot → Default | CppClass | Blueprint
Broadcast(Tag, Payload) → Listeners
FirePGXEvent(Tag, Context) → Resolve
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 13 production subsystems is already in the editor.
Every system follows the same patterns. Learn one, know them all.
// Save a game with domain tags UPGXSaveSubsystem* Save = GetGameInstance()->GetSubsystem<UPGXSaveSubsystem>(); Save->SetDomainValue(Tag_Player, TEXT("Health"), 100); Save->QuickSaveAsync(Tag_AutoSave); // Broadcast a message to all listeners UPGXMessageSubsystem* Msg = GetGameInstance()->GetSubsystem<UPGXMessageSubsystem>(); FPGXDamagePayload Payload; Payload.Amount = 50.f; Msg->Broadcast(Tag_Combat_Hit, FInstancedStruct::Make(Payload)); // Fire a resolvable event UPGXEventHandlerSubsystem* Events = GetGameInstance()->GetSubsystem<UPGXEventHandlerSubsystem>(); Events->FirePGXEvent(Tag_Ability_Cast, Context);
// Blueprint nodes — zero subsystem access needed PGX Save | Data | Write SetDomainValue(DomainTag, Key, Value) QuickSaveAsync(SlotTag) → OnComplete PGX Message | Core Broadcast(MessageTag, Payload ← morphing pin, any struct) Listen(MessageTag) → OnMessage PGX EventHandler | Core FirePGXEvent(EventTag, Context ← morphing pin) RegisterHandler(EventTag, Priority) PGX Audio | Core PlaySound(SoundTag) PlayMusic(MusicTag, 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.
A comprehensive 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 13 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 all 13 subsystems. Built on the SlateIM graph engine with real-time polling. Spot bottlenecks before they become bugs.