このページでは、1 つの World の中で同時に複数の Database を使用する際の詳細について説明します。
次のいずれかの特徴を持つ、複数の異なるキャラクタのタイプがある場合にのみ、複数の Database を使用する必要があります。
このように、2 つのタイプのキャラクタが移動できる地形のエリアに違いがあることは、2 つの NavData のセットを使用するのに十分な違いとなるため、実行時にゲーム内で 2 つの Database を使用して異なる NavData のセットを管理することが推奨されます。
Gameware Navigation を使用する際は通常、地形用に生成する静的 NavData が最もランタイム メモリを消費します。そのため、不要な重複を回避するために、可能なとき、つまりキャラクタ間の違いが小さく実行時に顕著に奇妙な動作が発生しないときには、同じ NavData をキャラクタが共有するようにする場合があります。
1 つの Database を複数の異なるキャラクタのタイプで共有する場合は、最も大きなキャラクタの半径と高さを使用してデータを生成する方が安全です。これは次の人間と巨人のケースを考えるとすぐに分かります。
このような場合は、NavData を共有してランタイム メモリを節約することと、各キャラクタの NavData をキャラクタの正確な寸法に合わせてパス ファインディングおよびパス フォローイングのリアルさを向上することとの間にトレードオフの関係があります。最終的にはゲームでどちらを優先するかで決定してください。
1 つの World に複数の Database を設定することは、すべての工程を複数回繰り返す必要があることを除けば、概念的には 1 つの Database を設定することと同じです。
実際に異なる唯一の点は、アセットのパイプラインにチャレンジを追加して、各キャラクタのタイプの NavData を適切な Database に追加したことを確認することです。
Database には、データ セットの一貫性を保証し、別のキャラクタに対して生成された NavData をロードできないようにするためのメカニズムが提供されています。Database がNavData を ロードした後は、既存の NavData と同じ設定パラメータを持つ追加の NavData が生成されない限り、追加の NavData をロードしません。
Database に NavData オブジェクトを追加する前に、Database::IsCompatibleWith() を呼び出して NavData オブジェクトを渡すことで既に存在するデータと追加するデータが一致するかどうかをテストできます。このメソッドが false を返した場合には、その Database へのこの NavData の追加に失敗します。
デフォルトでは、Bot や障害などの新しい WorldElement をワールドに追加すると常に、そのオブジェクトはワールド内のすべてのデータベースで空間化されます。これにより新しいオブジェクトはすべてのデータベースで同じ方法で考慮されるようになります。例:
ただし、場合によっては、このデフォルトの動作を使用したくなく、代わりに、新しいオブジェクトに適用されるデータベースを制限したい場合もあるかもしれません。例:
Bot、BoxObstacle、CylinderObstacle、TagVolume、または PointOfInterest を作成するたびに、どの Database が新しいオブジェクトを考慮するかを指定することができます。
これらの種類のオブジェクトの初期化に使用する設定オブジェクトには m_databaseBinding メンバがあり、DatabaseBinding クラスのインスタンスを保持します。オブジェクトを初期化する前に、新しい DatabaseBinding を作成し、選択した Database に対するポインタを設定し、m_databaseBinding メンバを設定して DatabaseBinding を指定することができます。例:
Kaim::BotInitConfig botInitConfig; ... m_databaseBinding = *KY_NEW Kaim::DatabaseBinding; m_databaseBinding->AddDataBase(world->GetDatabase(0)); m_databaseBinding->AddDataBase(world->GetDatabase(2)); botInitConfig.m_databaseBinding = m_databaseBinding; m_navBot->Init(botInitConfig);