MRが楽しい

MRやVRについて学習したことを書き残す

DialogueSystemのダイアログエディタの使い方 その9(複数のデータベースの操作)

本日は DialogueSystem の勉強枠です。
DialogueSystem のダイアログエディタの使い方を確認しながら記事にします。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

複数のデータベースの操作

一般的には単一のデータベースで作業する方がはるかに簡単です。ただし、Dialogue System は複数のデータベースをサポートしています。
複数のデータベースを追跡し、必要に応じてメモリにロードおよびロードするためにより多くの管理が必要です。
しかし、整理のためにコンテンツを分割したり、任意の時点でメモリにロードされるコンテンツの量を減らしたりする場合に役立ちます。

単一データベースか複数データベースか

ここでは単一のデータベースを使用するか、複数のデータベースを使用するかを決定するためのガイドラインを示します。

  • 平均長の会話が 1000 件あるデータベースは約 15 MBのメモリ、または少数のテクスチャファイルに相当するメモリを使用します。
  • デスクトップゲームを作っている場合 15 MBは問題にならないはずです。この場合、複数のデータベースを使用する唯一の理由は組織の利益のためです。
  • 非常にローエンドのモバイルデバイス用に構築している場合、15 MBは多すぎる可能性がありますが、最終的には仕様と要件によって異なります。
  • 次の場合は、複数のデータベースを使用できます。
  1. 1 つのデータベースが、割り当てるメモリのバジェットよりも大きい場合。
  2. 1データベースには非常に多くの異なる要素があるため、整理のために分割する必要がある場合。

単一または複数のデータベースのどちらを使用する場合でも、会話のタイトルに"/"を使用して会話をグループ化できることに注意してください。
例えば、会話に次のようなタイトルを付けることができます。

  • Companions/Robot Butler/At Your Service
  • Companions/Robot Butler/Malfunction
  • Desert/Scavenger
  • Desert/Scorpion Herder
  • Jungle/Shaman

これにより、サブメニュー「Companions」、「Desert」、「Jungle」にグループ化され、会話の選択が簡単になります。

複数のデータベースに関するヒント

複数のデータベースを使用する場合は全てのグローバルデータをグローバルデータベースに入れ、これを Dialog Manager の初期データベースとして割り当てます。
グローバルデータベースには以下のような「保存したゲームに含める必要がある」または「場所に関係なくアクセスする必要がある」全てのものを含める必要があります。

  • Player アクターとシーンを横断できるすべてのアクター (プレイヤーをフォローするコンパニオンなど)
  • エス
  • グローバル変数
  • コンパニオンチャットなど、プレイヤーがどこにいてもプレイできる会話
  • 他のデータベースでは[Sync From DB]を使用してグローバル データ コンテンツを同期します。


別のデータベースからのアセットの同期

複数のデータベースを使用する場合は、全てのアクターを1つのデータベースに定義し、全てのクエストを別のデータベースに定義することができます。
その後、それら別のデータベースから要素を取得するようにデータベースを構成できます。
これを行うにはタブのメニューで[Sync From DB]を選択し、要素の同期元のソースデータベースを選択します。
要素は追加できますが、ソースデータベース内の要素と同じ ID を持つ要素は上書きされることに注意してください。

例えば、プレイヤーが仲間のパーティーと一緒に惑星から惑星へと移動するゲームを作成しているとします。
プレイヤーとコンパニオンアクターはソースデータベースで定義し、このソースデータベースから同期を行ってその惑星の固有のアクターを追加したデータベースを作成できます。

UniqueIDツール

ダイアログデータベースを1つだけ使用する場合はこのセクションの作業は不要です。
内部的には、対話データベース内のすべての要素(アクター、アイテム、会話など)にはID番号があります。
1 つのデータベース内ではこれらの ID は通常、要素タイプごとごとに一意の値が割り振られています。

ただし、あるデータベースで使用されている ID が、別のデータベースでも使用される可能性があります。
実行時に両方のデータベースを読み込むと、ID が競合します。ダイアログシステムは競合したIDで参照しているアセットを認識しません。
これを防ぐには[Tools -> Pixel Crushers -> Dialogue System -> Tools → Unique ID Tool]で UniqueID ツールを使用します。

使い方は一意の ID を保証したいデータベースを追加し、[Process] をクリックするだけです。
[Verbose Logging]にチェックを付けるとツールは全ての ID 番号の変更をコンソールに記録します。

Tips

各データベースのベース ID を設定すると ID の競合が非常に起こりにくくなり、固有 ID ツールを実行する必要性が減少します。

UniqueIDツールを使用する場合

メモリにロードされる全てのデータベースには要素タイプごとに一意のIDが必要です。
例えば、すべてのアクターは一意のアクターIDを持つ必要があります。
[Sync From DB]を使用すると、新しい要素にはグローバルアセットの ID とは異なる ID が割り当てられるため、一意の ID について心配する必要はありません。
ただし、「Desert」のデータベースに「Jungle」のデータベースのIDと重複するIDが含まれている可能性は十分にあります。
しかし、これは砂漠とジャングルを同時にロードしない限り、メモリ内でIDの競合は発生せず、問題ありません。

ベースID

ベースIDは[Database]タブの各データベースの[Properties > Base ID]で値を割り当てることができます。
アクター、変数、会話などを追加すると、それらの内部IDはベースIDから番号付けを開始します。
例えば、グローバルデータベースのベース ID を 1、次のデータベースのベース ID を 10000、次のデータベースのベース ID を 20000 などに設定します。

これにより、データベース間での ID の競合が減り、Unique ID ツールを実行しなくてもプレイテストが容易になります。
ただし、最終テストとリリースの前に Unique ID ツールを実行して、IDの競合がないことを完全に確認する必要はあります。

Extra Databasesコンポーネント

実行時に追加のデータベースをメモリにロードするには Extra Databases コンポーネントを使用します。
例えば、Desert シーンの空のゲームオブジェクトに Extra Database コンポーネントを追加します。
[Add Trigger]を[On Start]に設定し、[Remove Trigger]を[On Destroy]に設定して追加のデータベースを割り当てます。

スクリプティングノート:DialogueManager.masterDatabase

Extra Databases コンポーネントまたは DialogueManager.AddDatabase() を使用して複数のデータベースをメモリに読み込む場合、プロパティ DialogueManager.masterDatabase にはメモリに読み込まれたすべてのデータベースの内容が含まれます。