UnityNovelProj Unity で VisualNovel を作成する

url: https://github.com/ganyariya/gnovel/pull/23
title: "会話を Enqueue/Dequeue できるようにして自由に会話を行き来できるようにする by ganyariya · Pull Request #23 · ganyariya/gnovel"
description: "Queue, Conversation を実装するConversationManager に ConversationQueue を組み込むConversationManager で実際に conversation を Enqueue/Dequeue できるようにする"
host: github.com
favicon: https://github.githubassets.com/favicons/favicon.svg
image: https://opengraph.githubassets.com/ae6dc520ebe4ffa850447da52eda67df88e56af2f02bf3ff2ea10e7d0d5ca7a3/ganyariya/gnovel/pull/23

キューシステム

ノベルゲームには選択肢があり、選択肢では複数のシナリオに分岐します。 このとき、今回のプロジェクトでは2つの移動方法があります。

  1. 今実行している会話 Chunk が終わったら、選択肢先の会話 Chunk を追加する
  2. 今実行している会話 Chunk に強引に割り込んで、選択肢先の会話 Chunk を流す

これらをうまく実現するために ConversationConversationQueue という DataStructure コンテナを導入します。

Conversation は 1 つのシナリオ (List<string>) を表し、たとえば chapter4-8 のように1つのまとまりを表します。 そして、 ConversationQueue はこれら Conversation をキューとして管理して、先頭に強引に追加する、もしくは末尾に追加するを実現します。

ConversationManager で実行する 1 文conversationQueue.Top.CurrentLine とします。 つまり、キューの先頭 Conversation を取得し、かつさらにその Conversation の現在行を取得します。

これによって、好きなタイミングで Conversation を追加すれば、好きなシナリオを実現できるようになります。

データクラスによる実装

今回の動画を通して思ったのは、ある機能を実現する pure C# のデータクラスを用意することで、実装・設計の見通しが立ちやすくなりかつテストしやすくなるということです。

業務でコードを書いていて、ファーストクラスコレクションやロジックを Entity に逃がす事が多く暗黙的にやっていることが多いです。 ただ、自分が苦手ではじめてのクライアントゲーム実装において、データクラスを利用する、という概念が消えていたため、「責務」の観点から適度な粒度でクラス分割、データクラスに逃がす、ということをやっていったほうがいいなと思いました。