A custom Unity editor tool for branching dialogue with a visual node system. Built to empower writers and designers to create scalable, gameplay-connected conversations without coding.

This is a Unity tool I built when I realised that writing dialogue with "if" statements was… well, awful.
What started as “I’ll just hack something together” grew into a fully-fledged, visual node editor that lets writers and designers build branching conversations without touching a line of code.
The project grew out of a cosy little space game prototype. I didn’t have much mapped out, but I knew talking to characters was going to matter, so I figured I’d start there while the rest of the game was still a sketch. Pretty quickly it became obvious that a node-based system was the only sane way forward if I wanted scale, flexibility, and a tool others could actually use without swearing at me.
Stress-tested up to 1,000+ nodes and connections in a single graph without turning Unity into molasses. ScriptableObjects keep everything light, references intact, and updates easy to manage.
Here’s a peek at the backbone. These ScriptableObjects store the dialogue graphs and individual nodes.
Dialogue Container
// DSDialogueContainerSO.cs
using System.Collections.Generic;
using DialogueSystem.Utilities;
using UnityEngine;
namespace DialogueSystem.ScriptableObjects
{
public class DSDialogueContainerSO : ScriptableObject
{
[field: SerializeField] public string FileName { get; set; }
[field: SerializeField] public SerializableDictionary<DSDialogueGroupSO, List<DSDialogueSO>> DialogueGroups { get; set; }
[field: SerializeField] public List<DSDialogueSO> UngroupedDialogues { get; set; }
}
}// DSDialogueSO.cs
using System.Collections.Generic;
using DialogueSystem.Data;
using DialogueSystem.Enums;
using UnityEngine;
namespace DialogueSystem.ScriptableObjects
{
public class DSDialogueSO : ScriptableObject
{
[field: SerializeField] public string DialogueName { get; set; }
[field: SerializeField][field: TextArea] public string DialogueSpeaker { get; set; }
[field: SerializeField][field: TextArea] public string Text { get; set; }
[field: SerializeField] public List<DSDialogueChoiceData> Choices { get; set; }
[field: SerializeField] public DSDialogueType DialogueType { get; set; }
[field: SerializeField] public bool IsStartingDialogue { get; set; }
}
}Drag-and-drop interface with real-time previews and multiple node types for intuitive authoring.
Dynamic branching, variables, and conditions that allow writers to create deeply reactive narratives.
Efficient data structures, memory management, and streaming support to handle large-scale dialogue trees.
Let's work together to create something equally amazing for your next Unity project. Whether it's VR, EEG visualization, or game development, I'm here to help.