Custom Dialogue Graph Editor
An example of the complete graph for an NPC. Entry points for initial meeting, return meeting, and in-progress quest. Entry points are chosen based upon highest priority and matching condition query.

An example of the complete graph for an NPC. Entry points for initial meeting, return meeting, and in-progress quest. Entry points are chosen based upon highest priority and matching condition query.

Details panel view of a dialogue node with speaker portrait in the top-left corner. Any number of choices can be added, with certain choices only displaying if specific conditions have been met. Sound files can be assigned for automatic VO playback.

Details panel view of a dialogue node with speaker portrait in the top-left corner. Any number of choices can be added, with certain choices only displaying if specific conditions have been met. Sound files can be assigned for automatic VO playback.

Runtime highlighting of active dialogue nodes for debugging conversations.

Runtime highlighting of active dialogue nodes for debugging conversations.

Realtime validation. Warnings and errors will display on nodes that are unreachable or do not have the necessary data provided.

Realtime validation. Warnings and errors will display on nodes that are unreachable or do not have the necessary data provided.

Different node types -- Entry point, dialogue, emit event with payload (via FInstancedStruct), branch based upon various conditions.

Different node types -- Entry point, dialogue, emit event with payload (via FInstancedStruct), branch based upon various conditions.

The base dialogue definition class.

The base dialogue definition class.

Custom Dialogue Graph Editor

I built a custom visual scripting tool for authoring branching NPC conversations in Unreal, for an in-development alchemy life sim where relationships and shop management drive progression. Traditional dialogue systems tend to separate conversation flow from game logic, so designers end up coordinating between multiple tools or leaning on a programmer for anything past basic text. I wanted to pull everything into a single visual workspace — no navigating dozens (or hundreds) of nested dropdowns the way you would in a typical data asset workflow.

You build conversations by connecting typed nodes, each with a specific job. Dialogue nodes show speaker portraits, support voice-over mappings, and branch into player choices — each choice optionally gated by conditions the player has to meet. Entry nodes use a priority system to pick the best conversation starter: an NPC might have a dozen entry points, and the system chooses the highest-priority one whose conditions match the current game state. Action nodes let dialogue reach into the world — give items, grant or complete quests, adjust relationships, set progression flags, or emit custom events with typed payloads — and they execute inline and auto-advance so the flow stays readable. Branch nodes handle conditional logic mid-conversation, routing to different paths off the same condition system I use everywhere else.

Under the hood, I store every node type in a single polymorphic array of FInstancedStruct. Instead of hardcoding interactions between systems, action nodes talk through a central event bus with typed payloads. That loose coupling means new game systems can react to dialogue events without me touching dialogue code, and designers can emit arbitrary events for the cases the specialized nodes don't cover.

More artwork