会話ウインドウを2種類用意することができました。
この手順では、どうすればこれらのウインドウの表示制御を自動的に分岐するようになるのか設計を考えていきます。
実装に当たって最も簡単な方法としては、会話ウインドウを切り替えるための変数を用意しておきます。
この値に応じて、会話ウインドウを稼働型(今までのようにキャラの上下に表示)か、固定型(Canvas に用意した同じ位置に表示)とで切り替えるような処理を記述します。
この切り替えるための変数は public 修飾子にしておくことにより、インスペクターより変更することができますので、
インスペクターから設定を行うことによって、キャラの上下タイプにするか、固定タイプにするかの切り替えができるようにもしておきます。
現在、NPC のキャラの会話ウインドウは DialogCanvas ゲームオブジェクトを制御することによって処理されています。
この DialogCanvas ゲームオブジェクトにアタッチされている DialogController スクリプトが実際にはそれらの制御を行っています。
この DialogController スクリプトに対して、DialogCanvas ゲームオブジェクトの表示・非表示の命令を出しているスクリプトがあります。
つまり、そのスクリプト内に、先ほどの変数と、それを利用した分岐を用意することができれば、自動的に会話ウインドウの種類を切り替える処理を実装することが出来ます。
今回作成した固定型の会話ウインドウには DialogController スクリプトがアタッチされていますが、このスクリプトに対して命令を出す対象者がまだいません。
これはどういう状態なのか、処理の命令体系を考えてみましょう。
<現在の会話ウインドウの命令体系>
1.NonPlayerCharacter スクリプトは、自分の子オブジェクトである DialogCanvas ゲームオブジェクトにアタッチされている DialogController スクリプトに命令を出している
2.各 NonPlayerCharacter スクリプトに対して、1対1 の関係で会話ウインドウがある(DialogController スクリプトがある)
<固定の会話ウインドウの命令体系>
1.NonPlayerCharacter スクリプトから固定型の会話ウインドウに対して命令を出したい
2.DialogCanvas ゲームオブジェクトと異なり、各 NPC ごとに存在していないため、1対1 での関係性ではない。
そのため、1対多数 の構図になるため、各 NonPlayerCharacter からの命令を一括で管理して、固定の会話ウインドウの表示の制御を行う「仲介者」となるスクリプトが必要
3.各 NonPlayerCharacter スクリプトは「仲介者」のスクリプトに対して、会話ウインドウの表示命令を出す。
これを受けて「仲介者」のスクリプトが固定の会話ウインドウの表示・非表示の制御を行う
固定の会話ウインドウの場合、従来のように命令が出せない状態になっている、ということが分かります。
そのため、NonPlayerCharacter スクリプトが命令を出せるようにするための、「仲介者」となるスクリプトを作成していきます。
それから NonPlayerCharacter スクリプトの修正を行うことで、命令先を、「仲介者」にして固定の会話ウインドウの制御をさせるのか、
自分の子オブジェクトに個別の会話ウインドウの制御をさせるのか、自動的に分岐する処理を作成出来るようになります。