Skip to content

Horror VN Kit

A Unity toolkit for branching psychological-horror visual novels. I built the systems so Eden, our writer and artist, could author every scene, choice and scare in the Inspector, without code or a scripting language.

A branching choice. Once a path has been explored, its button hides automatically. Art by Eden.
My role
Toolkit programmer and tools designer
Team
Eden: writer and artist. Me: toolkit programming and tools design
Built with
Unity 6, C#, TextMeshPro, ScriptableObjects, custom editor drawers
Status
Delivered as a university major project (spring 2026), packaged as a .unitypackage

The design goal

The kit handles the tedious parts of a visual novel (memory, text formatting, portraits) so the writer can focus on writing and atmosphere. Partway through, Eden found Ink, a narrative scripting language. I looked into it and decided against it: it's powerful for huge branching games, but means learning markup and writing outside Unity, which broke our no-code goal. We spent that time on horror effects instead.

Systems

  • Data, not scenes

    Characters and conversations are ScriptableObject assets. A character profile holds a list of named emotion portraits, so a writer can add a “Smirk” or a “NoFace” without anyone changing code.
  • Branching with memory

    Choices link to the next conversation asset. The dialogue manager remembers which branches the player has seen and hides choices that lead back to them, so a hub investigation can’t loop forever.
  • Typewriter and audio

    A standalone typewriter reveals text without re-wrapping lines mid-reveal, plays randomized voice blips every few letters, and lets the player click to finish a line early.
  • Horror text effects

    Per-character mesh effects like jitter, wobble and a blackout focus that darkens everything but one phrase. The writer picks an effect and types the target word into a box; no tags.
A targeted jitter effect on one word, set up entirely in the Inspector.
The styled dialogue box, with a handwritten font baked for TextMeshPro.

Guardrails for the writer

Most bugs in a writer-driven tool come from the data, not the code, so I put the checks where the writer works: a custom Inspector drawer that lays itself out without overlapping labels.

  • Character counter

    Every line shows a live count in the Inspector and turns red past 110 characters, the point where text would overflow the dialogue box.
  • Emotion dropdowns that can’t lie

    The emotion menu only lists portraits that character actually has. If an invalid one slips in, it snaps back to Neutral and logs a warning instead of showing an invisible character.
  • Manual overrides for glitches

    A line can override the speaker’s name or portrait for one moment, to create a distorted or “imposter” beat without making a new character.
The emotion guardrail catching a portrait the character doesn't have.

Process

I documented the build in six dev diaries, from a Git ignore rule that tried to upload 33,000 Unity files to a typewriter flicker caused by update order. I also wrote a designer's manual covering setup, branching and troubleshooting. The kit shipped as one Unity package with the manual inside.