UnityNovelProj Unity で VisualNovel を作成する
シナリオを分岐させる
UnityVisualNovel (20-4) を進める - ダイアログファイルから選択肢を実行し割り込みシナリオを実行する
上記実装において choice
構文によって、選んだ選択肢ごとに異なる選択肢ダイアログを実行できるようになりました。
しかし、該当の選択肢ダイアログだけでゲームシナリオを書くと、 choice の中が非常に複雑になってしまいます。
そのため、 Load
コマンドという新しいコマンドを実装し、別シナリオファイルを呼び出せるようにします。
private static void LoadScript(string[] data)
{
var parameterFetcher = CreateFetcher(data);
parameterFetcher.TryGetValue(PARAMS_FILENAME, out string fileName, string.Empty);
parameterFetcher.TryGetValue(PARAMS_ENQUEUE, out bool enqueue, true);
var filePath =
UnityRuntimePathToolBox.ResolveHomeDirectoryPath(UnityRuntimePathToolBox.ResourcesDialoguePath,
fileName);
var textAsset = Resources.Load<TextAsset>(filePath);
if (textAsset == null)
{
Debug.LogWarning($"`LoadScript` cannot load text asset. fileName: {fileName}");
return;
}
var lines = TextReader.ReadTextAsset(textAsset, true);
var conversation = new Conversation(lines);
// enqueue = true であればキューの末尾に新しいシナリオを追加する
// false であれば今のシナリオを強制ストップして新しいシナリオを開始する
if (enqueue) DialogueSystemController.instance.EnqueueConversation(conversation);
else DialogueSystemController.instance.Say(conversation);
}
やっていることはシンプルです。
- 指定されたファイル名をもとに、テキストファイルを読み込んで
TextAsset
に変換する - TextAsset から読み出した
lines
をConversation
へ変換する enqueue
Flag にあわせて、キューの先頭に追加してクリアするか、末尾に追加する
キューシステムを利用することによって、「先頭に追加すればすぐに Load 先シナリオへ移動」「末尾に追加すれば choice 構文が終わってかつ現在のシナリオすべてが終わってから Load 先シナリオへ移動」が実現できます。