代替パス ファインディング クエリ

AStarQuery クラスは通常、最も一般的なパス計算シナリオである、特定の定義済みの目的地への NavMesh および NavGraphs によるパスの検索に使用するのに適しています。生成されるパスの特性をコントロールするためのオプション、およびパス ファインディング計算のパフォーマンスを調整するためのオプションが提供されます。

ただし、特殊なケースでは、別のクラスのクエリを使用して、特定の条件を満たす Path を生成してもよいでしょう。これは、Gameware Navigation の SDK で提供されるパス ファインディング クエリの代替クラスや、ゲーム シナリオの特定のニーズを満たすために自作するカスタム クラスのクエリなどです。

このページでは、Gameware Navigation の SDK で提供される代替パス ファインディング クエリ クラス、およびユーザ独自のカスタム パス ファインディング クエリを作成するための要件について説明します。

代替パス ファインディング クエリーを使用するように Bot を設定する方法の詳細については、「静的パスを取得する」を参照してください。

BestGraphVertexPathFinderQuery

AStarQuery とは異なり、BestGraphVertexPathFinderQuery は事前指定された目的地へのパスを検索しません。その代わり、パス計算中に目的地を動的に選択できます。目的地は NavGraph の頂点でなければなりません。たとえば、最も近くの援護地点、狙撃位置、医療キット、武器アップグレードなどへの Bot の移動にこのクエリを使用できます。

クエリは、指定された開始点からすべての方向に NavMesh を通じて外側に伝播されます。目的地の候補として発見する NavGraph 頂点ごとに、クエリは、その頂点を最終目的地 とするべきかどうかを決定するために、ユーザが作成してテンプレートパラメータとして提供するカスタマイザクラスのインスタンスを呼び出し ます(AStarQuery に対して提供するカスタマイザと同様に)。

クエリは、カスタマイザが検索の停止を示すまで、またはクエリに設定されている最大パス コストを超えるまで、NavGraph 頂点の候補を探すためにNavMesh を調べ続けます。

NavGraph 頂点にデータを入れる

このクエリ クラスは潜在的な目的地として NavGraph 頂点のみをテストするため、クエリに潜在的に選択させたい 3D 空間内の各ポイントに NavGraph 頂点を作成する必要があります。たとえば、このクエリを使用して援護地点を選択するには、NavGraph を作成し、各援護地点候補に頂点を追加し、クエリに使用する Database に NavGraph を追加する必要があります。

このプロセスの詳細については、「NavGraph を作成する」を参照してください。

VertexFinderLogic を実装する

BestGraphVertexPathFinderQuery に設定するテンプレートクラスは、異なる NavTags へのトランジションが禁止されるかどうかを判断するために通常の TraverseLogic インタフェースを実装することが必要とされ、1 方向 NavTag トランジションが許可されるかどうかを判断する同じ typedef が必要です。詳細については、SimpleTraverseLogic クラス、および「NavTag を禁止、回避、優先する」を参照してください。

さらに、NavData を介してクエリーの伝達を監視する、次の仮想メソッドを実装する必要があります。

static OnGraphVertexVisitedResult OnGraphVertexVisited(void* userData, const NavGraphVertexRawPtr& currentGraphVertex, const NavGraphVertexRawPtr& bestGraphVertex, Ptr<Path> pathToBest);

クエリは、探査中に NavGraph 頂点を検出するたびにこのメソッドを系統的に呼び出します。このメソッドは、currentGraphVertex パラメータで渡された NavGraph 頂点の適性を評価し、bestGraphVertex パラメータで渡された頂点よりも良好な目的地かどうかを判断する必要があります。このメソッドは、頂点候補をそれまでに見つかった最善の目的地として覚えておくかどうか、および検索を続ける必要があるかどうかを、戻り値で示します。

頂点をそれまでに見つかった最善の目的地として適用するかどうかを決定する前に、頂点候補へのパスを確認する必要がある場合、OnGraphVertexVisited () メソッドは代わりにパスを計算するためのクエリを要求できます。この場合、クエリは次に示す OnPathToGraphVertexComputed() メソッドを呼び出します。

static OnPathToGraphVertexComputedResult OnPathToGraphVertexComputed(void* userData, const NavGraphVertexRawPtr& currentGraphVertex, Ptr<Path> pathToCurrent, const NavGraphVertexRawPtr& bestGraphVertex, Ptr<Path> pathToBest);

クエリは、候補をそれまでに見つかった最善の目的地として採用するかどうかを決定する前に、頂点候補へのパスを調べる必要があることを OnGraphVertexVisited() メソッドが示す場合にのみ、このメソッドを呼び出します。このメソッドでは、現在の頂点候補へのパスを、これまでに見つかった最善の頂点へのパスと比較できます。このメソッドは、頂点候補をそれまでに見つかった最善の目的地として覚えておくかどうか、および検索を続ける必要があるかどうかを、戻り値で示します。

その他のオプション

BestGraphVertexPathFinderQuery クラスは、AStarQuery で提供されているオプションのほとんどをサポートしています。詳細は、「AStarQuery オプション」を参照してください。

唯一の違いとして、このクエリでは、伝播を拘束するために長方形のボックスを使用する代わりに円を使用しており、円の半径をBestGraphVertexPathFinderQuery::SetPropagationRadius() の呼び出しで設定しています。

PathFinderFromPolyline

通常、AStarQuery または BestGraphVertexPathFinderQuery は、目的地までのパスを検索するため使用されます。ただし、実行時に追従するパスを形成する、連続した 3D 位置(ポリライン)が分かっている場合は、他のクエリの代わりに PathFinderFromPolyline クエリを使用することができます。PathFinderFromPolyline クエリは、Kaim::Path のインスタンスを作成するためにポリラインから成る 3D 位置を入力の引数にします。PathFinderFromPolyline クエリが正常に実行されるためには、ポリライン全体が NavMesh の内部に存在する必要があります。

カスタム パス ファインディング クエリを作成する

Bot が追従するパスを検索するためにユーザ独自のクエリ クラスを作成できます。これにより、Bot のパス フォローイング システムの他のサブシステムに影響を与えずに、パスの計算を完全にコントロールできます。以下のアウトラインに従ってクラスを作成する限り、クラスは他のパス ファインディングおよび追従システムと完全に互換性があります。

作成するクラスは、Kaim::IPathFinderQuery から、または Gameware Navigation SDK で提供されているパス ファインディング クエリ クラス(AStarQuery など)のいずれかから、派生する必要があります。

以下で説明するように、Kaim::IPathFinderQuery 基本クラスのすべての純粋仮想メソッドに対して実装を提供する必要があります。Kaim::IPathFinderQueryKaim::ITimeSlicedQueryKaim::IQuery の各基本クラスのドキュメントとヘッダ ファイルも参照してください。

また、実装のサンプルとして、AStarQuery および BestGraphVertexPathFinderQuery クラスの実装も参照してください。

Advance

virtual void Advance ( WorkingMemory * workingMemory )

これは API のメイン メソッドであり、Bot はこのメソッドを呼び出して、Bot::ComputeNewPathAsync() の呼び出しに対応した実際のパス計算を実行します。実装では次のことが必要です。

  • Path オブジェクトを作成し、パスを構成するノードを使用してそのオブジェクトを設定し、オブジェクトへのポインタを m_path クラス メンバーに格納します。
  • Bot で使用されるパス フォローイング システムがパスの生成に使用される設定と互換性を持つようにするため、各 Path はパスに追従するために使用する必要がある NavigationProfile の一意の ID を維持することに注意してください。挿入されたパスを Bot が追従する限り、Bot のパス フォローイング システムは TraverseLogic や IPathEventListObserver などのパス フォローイングをコントロールするのに使用するべきカスタマイズ可能なオブジェクトを取得するために、自動的にその NavigationProfile を使用します。

    デフォルトでは、一から作成する新しい Path オブジェクトは、World によって維持されるデフォルトの NavigationProfile を使用するように設定されます。 新しい Path が追従するべき方向にカスタム NavigationProfile の使用を必要とする特別な要件がある場合は、Path::SetNavigationProfileId() を呼び出して Path に適切なプロファイル ID を設定する必要があります。

  • Advance() メソッドは、非常に短時間で計算を完了することが求められます。パス計算が 1 ミリ秒より長くかかる場合は、計算を複数のフレームに分割する必要があります。そのためには、後で再利用するためにすべての一時データを保存し、m_processStatus クラス メンバーを QueryInProcess に設定します。クエリは、計算終了が示されるまで、各フレームで自動的に再度呼び出されます。
  • 計算が完了したら、m_processStatus クラス メンバーを QueryDone に設定します。
  • 後のフレーム用に一時データを格納するには、このメソッドに渡される WorkingMemory オブジェクトを使用することもできます。

GetType

virtual QueryType GetType ()

このメソッドでは、クエリ クラスごとに一意の識別子を返す必要があります。iquery.hQueryType 列挙型を編集し、QueryType_FirstCustom 値の後に独自クエリ用の新しい値を追加し、このメソッドからその値を返します。

ビジュアル デバッグ情報

これらの関数は、Navigation Lab で表示するためにビジュアル デバッグ システムを介して送信するデータを準備するときに呼び出されます。

virtual const Vec3f * GetDestination () const

このメソッドは、クエリの目的地のポイントを返すか、またはクエリに目的地がない場合は KY_NULL を返す必要があります。

virtual PathFinderResult GetPathFinderResult () const

このメソッドは、パス計算の現在のステータスを示す必要があります。

virtual void GetPathFinderTextResult (String &) const

このメソッドは、クエリ計算の現在の状態の説明テキストを取得するために呼び出されます。実装は省略可能です。

作業メモリの解放

virtual void ReleaseWorkingMemoryOnCancelDuringProcess ( WorkingMemory * workingMemory ) 	

このメソッドは、計算の過程でクエリがキャンセルされたときに呼び出されます。

  • 一時データを複数のフレーム間で保存するために Advance() メソッドに渡される WorkingMemory オブジェクトをクエリで使用する場合、このメソッドは WorkingMemory オブジェクトによって使用されたすべてのリソースを解放する必要があります。
  • m_processStatus クラス メンバーを QueryDone に設定する必要があります。