ConvoGraph
Production-ready dialogue and conversation system for Unreal Engine 5.6–5.8 with JSON authoring, condition-gated choices, voiced lines, localization and built-in save persistence
Overview
ConvoGraph is a code plugin that gives Unreal Engine 5 projects a subsystem-driven runtime for branching NPC conversations, condition-gated player choices, voiced dialogue with subtitles and full localization. Instead of a proprietary node-graph editor, writers author dialogue in plain JSON that is imported by drag-and-drop, while engineers trigger conversations from Blueprint or C++ in a few lines. It is built for teams where writers stay in text files and the data flows to code without opaque binary assets.
Key Features
- Branching and linear modes — hubs, cycles and auto-advancing Branch nodes, with GameplayTag and variable condition gates on every node, extensible in C++ or Blueprint
- JSON and DataTable authoring —
.convo/.convotablefiles import via the Content Browser with reimport support, and the same JSON can be imported at runtime for mod and DLC content - Variables and persistence —
{Token}substitution in dialogue text, with visited nodes, variables and history saved through the engine’s built-inUSaveGame(no save plugin required) - Voice and subtitles — async voice-line prefetch, per-culture audio fallback and a timed subtitle component synchronized to clip duration
- Localization — StringTable-first text with Localization Dashboard support for seven cultures out of the box
- Headless-safe and extensible — no widget dependency in the subsystem, so it runs on dedicated servers and in automated tests, plus a vendor-neutral LLM generator hook with timeout and authored-text fallback
Technical Decisions
A single UDialogueSubsystem (a GameInstance subsystem) is the only entry point and holds no UI dependency, which keeps the runtime testable and server-safe while the game supplies its own widget, audio and camera. Graph analysis (reachable and orphaned nodes) and the JSON import pipeline are embedded as private, renamed Cg-prefixed modules so the plugin ships as one self-contained Fab package with no sibling-plugin dependencies, and the editor-only factories live in a separate cook-stripped module.