VOL.1 — ARCHITECTURE

Editor ↔ Runtime のリモートコントロール

はじめに — なぜ「分離」するのか

通常の Unity 開発では、エディタとランタイムは一体です。 Unity Editor のインスペクタでパラメータを変更し、Play ボタンを押してプレビューする。 この一体感は汎用的な開発には最適ですが、 ビジュアルノベルのように「テキスト主体」のコンテンツには過剰です。

VN Studio では、この常識を覆し、 エディタ(WPF)とランタイム(Unity)を完全に分離しました。 両者を繋ぐのは、Windows の NamedPipe による軽量な双方向通信です。

NamedPipe — 通信の仕組み

NamedPipe は Windows OS が提供するプロセス間通信(IPC)メカニズムです。 ファイルシステムのような API でプロセス間にストリームを確立でき、 TCP/IP のようなネットワークオーバーヘッドがないため、ローカル環境では極めて高速です。

通信プロトコル

VN Studio では2本のパイプを使用します:

  • VNStudioPreviewPipe — Editor → Runtime(コマンド送信)
  • VNStudioPreviewPipe_Editor — Runtime → Editor(応答・ハイライト)

送受信されるメッセージは JSON 形式です。主要なコマンドは以下の通りです:

// Editor → Runtime: スクリプトの読み込みと実行
{ "type": "load_script", "payload": "bg school\nしるふぁ \"おはよう\"" }

// Editor → Runtime: 特定行へのジャンプ(ダブルクリック時)
{ "type": "jump_to_source", "payload": "chapter1.scn:42" }

// Runtime → Editor: 現在実行中の行をハイライト
{ "type": "highlight", "payload": "chapter1.scn:42" }

リアルタイムプレビューの実現

このアーキテクチャの真価は、リアルタイムプレビューにあります。

  1. エディタでスクリプトを編集する
  2. Run ボタンを押すと、スクリプト全文が NamedPipe 経由で Unity に送信される
  3. Unity Runtime が即座にスクリプトをパースし、ゲームシーンを描画する
  4. エディタの任意の行をダブルクリックすると、jump_to_source が送信される
  5. Unity 側は RestoreState(高速スキャン)で、その行までの状態を瞬時に再構築する

つまり、エディタ上で任意のシーンをダブルクリックするだけで、 背景・キャラクター・BGM が即座に再現されるのです。 これは従来の「最初から再生して早送り」とは根本的に異なる体験です。

WPF を選んだ理由

エディタに WPF(.NET 8)を選択したのには明確な理由があります:

  • 起動の速さ — Unity Editor のような重い初期化が不要
  • テキスト編集の快適さ — AvalonEdit による構文ハイライト・行番号付きの本格エディタ
  • Windowsネイティブの操作性 — ファイルダイアログ、ドラッグ&ドロップなどが自然に使える
  • 拡張性 — MSX プレビュー(openMSX 連携)も同じエディタから制御可能

次回予告

Vol.2 では、このリモートコントロールで送信される VNScript の設計思想を解説します。 「文章を書くように演出する」とはどういうことか、具体的なコマンド例とともにお届けします。