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.