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

A custom visual scripting tool for authoring branching NPC conversations in Unreal Engine, built for an in-development alchemy life simulation game where relationships and shop management drive progression. Traditional dialogue systems often separate conversation flow from game logic, requiring designers to coordinate between multiple tools or rely on programmer support for anything beyond basic text. The goal behind this custom node graph editor was to combine everything into a single visual workspace that didn't require navigating dozens (or hundreds) of nested dropdowns as would be necessary in a typical data asset workflow.

Conversations are built by connecting typed nodes, each serving a specific purpose. Dialogue nodes display speaker portraits, support voice-over mappings, and branch into player choices—each choice optionally gated by conditions the player must meet. Entry nodes use a priority system to select the most appropriate conversation starter. An NPC might have a dozen entry points, but the system will choose the highest-priority entry whose conditions match the current game state. Action nodes let dialogue directly affect the world: give items, grant or complete quests, adjust NPC relationships, set progression flags, or emit custom events with typed payloads. These execute inline and auto-advance, keeping the flow readable. Branch nodes handle conditional logic within a conversation, routing to different paths based on the same flexible condition system used elsewhere.

The system stores all node types in a single polymorphic array of FInstancedStruct. Rather than hardcoding interactions between systems, action nodes communicate through a central event bus with typed payloads. This loose coupling means new game systems can react to dialogue events without needing to modify dialogue code, and designers can emit arbitrary events for cases the specialized nodes don't cover.

More artwork