VOL.16 — PROGRESS REPORT

手ざわりを、設計する。
——遊ぶ側と、作る側。二つのVNStudioを磨いた記録

はじめに——機能表には載らないもの

前回は、 FM音源ドライバと専用プレイヤーの話から、趣を変えてお届けしたい。 VNStudio本体——遊ぶ側と、作る側の「手ざわり」の話である。

キーボードで読み進められる。設定が一画面にまとまっている。 検索がある。ウィンドウが前回の位置に戻る。 どれも機能表に書けば一行で終わる話で、 新しい何かができるようになったわけでもない。

だが、ノベルゲームは何時間も同じ操作を繰り返すジャンルだ。 そして制作は、それよりもっと長い時間、同じ画面と向き合う作業である。 わずかな一回あたり0.5秒の引っかかりであっても、 なんども繰り返された時点で、作品の印象そのものになる。

機能は「できるかどうか」を決める。
手ざわりは「続けられるかどうか」を決める。

第1章:マウスを、置く——キーボードだけで読み進める

Unityランタイムには、これまで一つ大きな欠落があった。 キーボードだけでは物語を読み進められなかったのである。

テキストを送るにも、選択肢を選ぶにも、マウスが要る。 だがノベルゲームを腰を据えて読むとき、 手はキーボードの上に置いたままにしておきたいものだ。

そこで、次の操作系を実装した。

  • 選択肢は↑↓←→で移動、Return/テンキーEnter/Spaceで決定
  • 先頭から前へ、末尾から次へ——循環する
  • 選択中の項目には白いアウトラインを表示
  • sayの文字表示中は同じキーで全文表示、表示後は次のコマンドへ

通常のchoiceだけでなく、 絶対座標配置を含むui_choiceも同じ操作対象になる。 決定時は内部的にボタンのクリック経路を通すので、 既存の選択音も押下アニメーションも、そのまま動く。

第2章:設定は、一枚の画面に——音声5系統の独立

次に手を入れたのは設定画面である。 オートモード、テキスト表示速度、そして音量—— これまで散らばっていた項目を、一枚の画面へまとめた。

  • オートモード(ON/OFF)
  • テキスト速度(10段階)
  • BGM
  • SE
  • Voice
  • システム音

音声は内部的にも系統ごとに独立させた。 中でも効いたのが、最後の「システム音」の分離である。

選択肢の表示音、決定音、テキストの送り音・スキップ音—— これらのUI操作音は、これまで作中の効果音(SE)と同じ音量に縛られていた。 だが、この二つは求められる音量が違う。 「作中の効果音は控えめにしたいが、操作のクリック音は聞こえていてほしい」—— そういう調整をできるようにした。

レベルメーターは、クリックした位置へ即座に飛び、 押したまま左右へドラッグすれば連続して変えられる。 +/-ボタンももちろん残してある。 設定値は次回起動時に復元され、スクリプトからも指定できる。 これは、作り手・遊び手、双方に有効なものだ。

config volume bgm 80
config volume se 70
config volume voice 100
config volume system 70
統合設定画面。既存メニューのウィンドウ画像・フォント・文字色をそのまま継承し、メーターは直接ドラッグできる(音声なし)。

デザイン面では、この設定画面を独自にデザインしなかったことが要点だ。 フォント、文字サイズ、文字色、選択肢の背景画像、その透明度—— すべてを既存のメニュー設定から取得している。 つまり、作者がconfig menuwindowで自分の作品用の ウィンドウ画像を指定していれば、 設定画面もその作品の顔になる。 save/load画面とCGモード画面も、固定色をやめて同じ方式へ揃えた。 エンジンの都合で、作品の世界観に穴が空かないように。

第3章:CGギャラリー——「集めている」という手ごたえ

イベントCGまわりも作り込んだ。 まず、CGに表示名を登録できる書式を追加した。

cg0 "一緒に朝ごはん" breakfast_kyouka

この名前が、二つの場所で効いてくる。

一つはCGギャラリー。 解放済みのCGには画像下部の帯に名前が入り、 画面右上には達成率が大きく表示される。 未解放のCGは、これまでどおりマスクと「?」だけ—— 名前も伏せたままだ。 何が残っているかは、埋めてからのお楽しみである。

CGギャラリー。解放済みCGには登録名を、右上には達成率を表示する。未解放CGは名前も伏せる(音声なし)。

もう一つが獲得通知だ。 新しいCGを解放した瞬間、画面上部にこう流れる。

〈登録したテキスト〉を手に入れました!

画面右外から約1秒弱かけてEase Out Cubicで滑り込み、 中央で約1秒強留まり、 また約1秒弱かけて右へ抜けていく。 CG名だけは本文より10ポイント大きくしてある。 複数まとめて解放された場合はキューに積み、順番に流す。

あわせて、メニューの初期表示も直した。 最初にメニューを開いたときは、 選択肢の文字量に合うコンパクトなウィンドウに。 設定・save/load・CGギャラリーといった情報量の多い画面では、 背景を画面全体へ広げて、 同じメニューでも、中身に応じて器の大きさを変えるようにした。

第4章:背景が、動く——1コマンドの演出

演出面での新機能は背景スクロールだ。 静止画の背景を指定倍率で表示し、 上下左右のいずれかへ、ゲーム進行と並行してゆっくり動かす。

bg_scroll bg0 tower_long 1.8 up 30
say "塔を見上げながら進んでいく。"

画像名・拡大倍率・方向・所要時間は、一行にまとめて記述する。

実行してもスクリプトは止まらない。 sayの裏でも、choiceの裏でも、背景は動き続ける。 指定時間で末端に到達し、そこで静止する。

背景スクロールとCG獲得通知の実際の動き。sayの裏で背景が動き続け、CGを解放した瞬間には画面上部を通知が滑っていく(音声なし)。

また、画像が見つからない場合は 画面上に赤いエラーを出すようにした(F12で表示)。 背景、立ち絵、各種ウィンドウ、CG、パズルまで対象を統一してある。 「なぜか絵が出ない」を、ログを漁らずその場で潰せるようになった。

第5章:作る側の道具——エディタを研ぐ

ここからは作る側の話である。

スクリプトのエディタ画面に、検索バーを追加した。 Ctrl+Fで開き、入力した時点で最初の一致へ飛ぶ。 Enter/F3で次、Shift+Enter/Shift+F3で前、 Escで閉じる。 大文字・小文字の区別、一致件数と現在位置の表示、末尾を越えたときの折り返し—— そして、1行内で選択していた文字列は検索語として引き継ぐ。 本格的に長いシナリオを扱うようになると、必須の機能となる。

検索バー。Ctrl+Fで開き、入力した時点で最初の一致へ飛ぶ。一致件数と現在位置も表示される(音声なし)。

次にウィンドウ状態の復元。 終了時の位置・サイズ・最大化状態、そして左右ペインの分割幅を保存し、 次回起動時に復元する。 保存は一時ファイルへ書いてから置換するので、書き込み途中の破損が残らない。

この手の機能は、正常系より異常系のほうが本体である。

  • 設定ファイルが欠損・破損していれば既定値で起動する
  • NaN、Infinity、極端に小さいサイズは拒否する
  • ディスプレイ構成が変わって保存位置が画面外になったら既定表示へ戻す
  • 一部だけ画面内なら、仮想デスクトップ内へ補正する
  • 最小化したまま終了しても、次回は最小化せずに開く

タイトルバーの↺を押せば、 確認のうえで保存状態を破棄し、既定の状態へ戻せる。 「復元してくれるのはいいが、変な位置で固まった」—— その出口も、同時に用意しておく。

ほかに、スクリプト編集のスムーススクロールと、 Ctrl++/-による文字サイズ変更も入った。 どちらも地味だが、こういうものが一日の作業時間を静かに削ってくれる。

おわりに——「気づかれない」という完成度

今回並べたものは、どれも派手さのない改善だった。 キーが効く。設定が揃っている。名前が出る。エラーが見える。 ウィンドウが元の場所に戻る。

こうした改善のいちばんの成果は、 誰にも気づかれないことだと思っている。 物語を読んでいる人が操作方法を意識しないこと。 作っている人がツールの挙動に気を取られないこと。 道具が透明になって、その向こうにある作品だけが見えている状態—— しるふぁ工房が目指しているのは、たぶんそこだ。

よくできた道具は、使っていることを忘れさせる。
忘れられることが、道具にとっての完成である。