読者です 読者をやめる 読者になる 読者になる

エディトリアルデザイナーのアプリ制作日記

Unityで遊ぶ個人開発者のメモ書き

縦書きノベル制作日記 その8 変数管理

 前回「分岐によるシーン数の拡散を防ぐ方策を考える」などと言っていましたが、どうあがこうと「分岐させたらシーンが増える」これは避けられません。では、ストーリーの大きな分岐は仕方ない、と諦めるとして、せめて小さな分岐ではシーン数を減らせるようなフラグ管理の導入を考えます。ここでいう小さな分岐というのは、会話の流れの本筋は変わらなくて、途中にある相槌をうつような選択肢によって、相手の反応がちょこっと変わるみたいな感じを想定しています。これを選択肢分だけ分岐させてしまうと、以下のような感じに……。
f:id:hamazakifactory:20151116095017j:plain
 いまは、説明用にエクセルで図式化していて、まだ全体像を目で見れる分マシですが、現在想定しているのはテキストベースでのシナリオ管理です。長くなればなるほど無理が出てくるでしょう。そこでフラグ管理をできるようにすると以下のような形にまで、まとめられるようになります。
f:id:hamazakifactory:20151116091139j:plain
 さらに選択肢によって好感度を上下させて、その値によって分岐させたりもできますし、どのルートを辿ってきたかの判別も可能になります。ただ、フラグを管理するといっても、お仕着せのものだと融通がきかない&視認性も悪くなる(間違いなく適当な自分では、なにをやってるかわからなくなる)ということで、ここはユーザーが自由に定義できる変数を用意します。スクリプト内では、この変数を利用することでシーン内で条件分岐をしたりすることができるようしていきたいので、新規コマンドの追加とMENUコマンドの変更を行います。

◆新規コマンド
</VAR:変数名:値	変数の定義(定義と同時に初期化も行うため引数の省略は不可)
</LET:変数名:値	値を変数へ代入
</IF:条件式	条件式が真(0)のときは、ENDIFまでの文章を生かし、条件式が偽(-1)のときは、ENDIFまでの文章を飛ばす
</ENDIF		IF文終了マーカー(なお、IFコマンドは入れ子にできない)
◆変更コマンド
MENU:表示する選択肢の文字列:選択肢を表示する条件:次に移行するシーン名:設定する変数:設定する数値

 変数の実装自体は、変数名と値を格納する構造体を用意し、変数が追加された時にはリストをガンガンaddしていくだけ。変数の読み出しは、頭から順に変数名を検索してヒットしたら取り出すだけ。大量の変数管理を想定することになると、検索性を上げるためにいろいろなことが必要になりますが、今回は数個〜せいぜい十数個も管理できれば問題ないないので、パパパ〜っと済ませます(詳しいやり方も知らないしね)。

	//
	//変数格納用
	//Variable.name = 変数名
	//Variable.num = 値
	//
	private struct VariableData
	{
		public string	name;	//変数名
		public int		num;	//値

		public VariableData(string p1,int p2)
		{
			name = p1;
			num = p2;
		}
	}
	//変数格納リスト
	private List<VariableData> variableArray = new List<VariableData>();</span>

 で、次に問題となるのは変数に入れる値をどうするかです。単純に数値を入れるだけであれば、引数を変換してぶち込めばいいのですが、先程言ったような好感度を上下させるようなことをしたい場合は、直接、値を代入するだけでは実現できません。好感度+1や好感度+2ということをやるために、式の評価をすることに…さらに条件式の評価も必要になるので、四則演算だけでなく、比較演算子も考慮する必要になります。
 めんどくさい…まぁ面倒とはいっても、先人たちの知恵を借りれば余裕っしょ、ということで「式の評価」とググって本日はおしまいっ。