縦書きノベル制作日記 その7 スクリプト
以前ざっくり考えたように、ゲームの基本進行は、
文章を読ませる=>選択肢が現れる=>選んだ選択肢によって以降の文章を変える
とするようにしました。
選択肢までの文章を1つの塊(シーン)と考え、シーンのテキストを読み込んで表示=>選択肢が押されたら次のシーンを読み込んで表示、これを繰り返していくだけ。
スクリプトのイメージとしては、以下のような感じ。
</シーン1開始
□□□□□□□□□□□□メインの文章
□□□□□□□□□□□□□□□□□□□□□□□□
</選択肢情報:選択肢テキスト:選択されたときに移動するシーン番号
</シーン終了
</シーン2開始
:
スクリプトはエクセルで管理すれば、あとはと拡張もできたりして便利なのかな? と一瞬考えましたが、ここは素直にテキストファイルに、スクリプトをがしがし書いく方法を選択します(Unityへのテキスト読み込みも簡単だし)。
//テキストファイルの読み込み
TextAsset txt = Resources.Load("シナリオテキスト") as TextAsset;
//行ごとに分割
string[] allText = txt.text.Split('\n');
上記のように1回シナリオテキストを配列にぶち込んでしまえばこっちのもの。あとは、シーンごとに取り出すなり好き放題できます。
とはいえ、1つのテキストにコマンドと通常の文章を混在させるということで、それらを区別する方法が必要です。これは、先ほどスクリプトイメージに書いた通り。コマンドと通常の文章を識別するための制御用文字列を”</”として、ステートを区切る文字は”:”としました。
</コマンド:パラメータ1:パラメータ2……
こんな感じ。リッチテキストとかそういうものに準拠しておけ! という悪魔(?)のささやきが聞こえなくもないですが、そんなものを知らない私は我が道を行くことにします。また、通常の文章と混在させない、1行1命令でマルチステートメント不可、という作るのに都合のいい仕様も盛り込みます。さらに「文頭で"</"を使いたいときはどうするんだよ?」という声には「使わないようにしましょう」でOK(プログラムをオープンにするなら考える…あとで)。この制限を設けておけば、配列ごとに頭2文字が制御文字列"</"かどうかチェックして、該当すればコマンド処理、そうでなければ通常文字に振り分けるだけで済みます。世の中が思い通りにならないんだから、せめて自分のプログラムくらい、自分の都合のいいように回したいです…ええ。
んで、必要なコマンドを書き出していきます。最初に考えたのは、以下の6コマンド。
</SCENE:シーン名 シーン名の登録。
</ENDSCENE シーンエンドマーカー。
</BACKIMAGEINIT:Spriteイメージファイル名
背景を"Spriteイメージファイル名"にする。
</BACKIMAGE:Spriteイメージファイル名:変移タイム
現在ある背景画像を、変異タイムの時間をかけて"Spriteイメージファイル名"に切り替える。
</CUTIMAGE:Spriteイメージファイル名
文章の間に"Spriteイメージファイル名"の画像を挿入する。
</MENU:表示する選択肢の文字列:次に移行するシーン名
シーン最後に"表示する選択肢の文字列"の選択肢を表示し、押されたら"次に移行するシーン名"へ移動する
これだけあれば、最初に予定していた通りのゲームの流れを実現できるはず。ただ、このままでは分岐させるたびに分岐先が無限に増え、物語のシーンは拡散する一方になってしまいます。選択肢の飛び先を合流させたりすることもできますが、どのルートを経由して来たのかなどの情報はないので、シナリオの整合性がとれるかどうかも微妙。
やはり分岐を入れるからには、どこかで収束させたりしておかないと収拾がつかなくなりそうということで、上のコマンドを実装しつつ、なにが必要かを考えていくことにしよう、うん。