はじめに — なぜ「分離」するのか
通常の 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" }
リアルタイムプレビューの実現
このアーキテクチャの真価は、リアルタイムプレビューにあります。
- エディタでスクリプトを編集する
- Run ボタンを押すと、スクリプト全文が NamedPipe 経由で Unity に送信される
- Unity Runtime が即座にスクリプトをパースし、ゲームシーンを描画する
- エディタの任意の行をダブルクリックすると、
jump_to_sourceが送信される - Unity 側は RestoreState(高速スキャン)で、その行までの状態を瞬時に再構築する
つまり、エディタ上で任意のシーンをダブルクリックするだけで、 背景・キャラクター・BGM が即座に再現されるのです。 これは従来の「最初から再生して早送り」とは根本的に異なる体験です。
WPF を選んだ理由
エディタに WPF(.NET 8)を選択したのには明確な理由があります:
- 起動の速さ — Unity Editor のような重い初期化が不要
- テキスト編集の快適さ — AvalonEdit による構文ハイライト・行番号付きの本格エディタ
- Windowsネイティブの操作性 — ファイルダイアログ、ドラッグ&ドロップなどが自然に使える
- 拡張性 — MSX プレビュー(openMSX 連携)も同じエディタから制御可能
次回予告
Vol.2 では、このリモートコントロールで送信される VNScript の設計思想を解説します。 「文章を書くように演出する」とはどういうことか、具体的なコマンド例とともにお届けします。