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 から読み出した linesConversation へ変換する
  • enqueue Flag にあわせて、キューの先頭に追加してクリアするか、末尾に追加する

キューシステムを利用することによって、「先頭に追加すればすぐに Load 先シナリオへ移動」「末尾に追加すれば choice 構文が終わってかつ現在のシナリオすべてが終わってから Load 先シナリオへ移動」が実現できます。