このページでは、追従するための静的 Path を Bot に設定する方法について、最も単純なものから複雑なものまで説明します。
新しいパスを計算するための最も簡単な方法であり、通常は、初期統合の際に推奨されているものです。たとえば、統合チュートリアルの手順を完了した場合(「Navigation をゲーム エンジンに統合する」を参照してください)、この方法を使用して既に Bot を設定していることになります。
この方法では、単純に Bot::ComputeNewPathToDestination() を呼び出し、目的の位置を指定します。Bot は次のことを透過的に行います。
パス計算が既に進行中の場合は、前の要求が自動的にキャンセルされます。
void MyGameEntity::Goto(Kaim::Vec3f destination) { // Clear the followed path m_navBot->ClearFollowedPath(); // Request the new path computation m_navBot->ComputeNewPathToDestination(destination); }
上記のパス計算に対する方法は単純な API を使用して最も一般的なパス計算シナリオを処理するため、統合を実装して動かす場合には理想的です。ただし、あらかじめ設定されたデフォルトの動作で AStarQuery クラスを使用することが強制されます。AStarQuery によって提供されたオプションと設定をオンザフライでカスタマイズすることや、Bot に対して設定できるパス ファインディング設定パラメータにない方法でクエリーを設定することが必要になる場合がプロジェクトを進めていく上で発生することがあります。「AStarQuery オプション」を参照してください。
これらの可能性を探るためには、Bot クラスで提供されている「上級」のパス計算 API を使用することができます。ただし、これには多少注意が必要になります。
必要に応じて、AStarQuery または AStarQuery から派生するクラスを使用している場合は、Bot::InitAStarQueryForBot() メソッドを呼び出して開始することができます。このメソッドは、透過的に Bot のパス ファインディングおよびパス フォローイング設定に従いクエリーのすべてのパラメータを設定し、クエリーを Bot によって使用される Database にバインドして、クエリーの開始地点と目的点を初期化します。(上記の前のセクションで概説した単純なパス計算プロセスを使用する場合、Bot::ComputeNewPathToDestination() を呼び出すと、NavigationProfile から取得するクエリーを設定するためにこのメソッドが内部的に呼び出されます)カスタマイズするその他の設定はこの呼び出しの後に設定する必要があります。
Bot はクエリーが World の次の更新時に非同期的に実行されるように要求します。
前のフレームで Bot のパス計算が開始され、その計算がまだ完了していない場合は、Bot::ComputeNewPathAsync() の呼び出しは失敗することに注意してください。Bot::ComputeNewPathAsync() を呼び出す前に、Bot::IsComputingNewPath() を呼び出して現在計算が実行中かどうかをテストする必要があります。このメソッドが true を返した場合、新規パス ファインディング要求をスキップするか、Bot::CancelAsyncPathComputation() を呼び出して前の要求をキャンセルします。
class MyGameEntity { void Initialize(Kaim::World* world); void Goto(Kaim::Vec3f destination); Kaim::Ptr<Kaim::BaseAStarQuery> m_aStarQuery; }; void MyGameEntity::Initialize(Kaim::World* world) { ... // We create and assign the query m_aStarQuery = m_navBot->GetFollowedPathNavigationProfile()->CreateAStarQuery(); // Bind the query to the Database used by the Bot m_aStarQuery->BindToDatabase(m_navBot->GetDatabase()); // Set up configuration parameters for the query, if desired m_aStarQuery->SetTryCanGoMode(Kaim::ASTAR_DO_TRY_RAYCANGO); } void MyGameEntity::Goto(Kaim::Vec3f destination) { if (m_navBot->IsComputingNewPath()) { m_navBot->CancelAsyncPathComputation(); } // Clear the followed path m_navBot->ClearFollowedPath(); // Set the inputs of the path finding query m_aStarQuery->Initialize(m_navBot->GetPosition(), destination); // Adjust other parameters on the fly if necessary m_aStarQuery->SetPropagationBoxExtent(200.0f); // Request the new path computation m_navBot->ComputeNewPathAsync(m_aStarQuery); }
何らかの理由でデフォルトの AStarQuery クラスがニーズに合わない場合、異なるパス ファインディング クエリーを使用することができます。SDK で提供されるその他のクエリー クラス、および独自のクエリーを作成する方法の詳細については、「代替パス ファインディング クエリ」を参照してください。
ユーザの選択したクエリーを使用するように Bot を設定するには、前のセクションで説明した処理と同様の処理を行います。ただし、この場合は、NavigationProfile からはクエリーを取得せず、生成されたパスが Bot のパス フォローイング システムと互換性があるようにするために多少の設定が必要です。
SDK に付属の BestGraphVertexPathFinderQuery クラスを使用している場合は、クエリーの作成時に提供するテンプレート パラメータが Bot により現在使用されている TraverseLogic と互換性があることを確認する必要があります。
Bot はクエリーが World の次の更新時に非同期的に実行されるように要求します。
前のフレームで Bot のパス計算が開始され、その計算がまだ完了していない場合は、Bot::ComputeNewPathAsync() の呼び出しは失敗することに注意してください。Bot::ComputeNewPathAsync() を呼び出す前に、Bot::IsComputingNewPath() を呼び出して現在計算が実行中かどうかをテストする必要があります。このメソッドが true を返した場合、新規パス ファインディング要求をスキップするか、Bot::CancelAsyncPathComputation() を呼び出して前の要求をキャンセルします。
キャラクタで新しいパスを計算するのではなく、既に計算されているパスを使用することもできます。たとえば、異なる Bot によって計算された Path、パス ファインディング クエリを直接実行して自分で計算した Path、事前に計算していずれかのクラス メンバに保存していた Path、その場で構築した Path (ただし、通常は推奨されません)などです。
Bot::InjectNewPath() への呼び出しで Path オブジェクトを渡すことにより、既存のパスに追従するように Bot に指示することもできます。例:
Kaim::Path::CreateConfig myPathCreateConfig; myPathCreateConfig.m_nodesCount = 2; Kaim::Ptr<Kaim::Path> myPath = Kaim::Path::CreatePath(myPathCreateConfig); myPath->SetNodePosition(0, Kaim::Vec3f(0.0f, 0.0f, 0.0f)); myPath->SetNodePosition(1, Kaim::Vec3f(1.0f, 1.0f, 0.0f)); myPath->SetPathEdgeType(0, Kaim::PathEdgeType_OnNavMesh); m_navBot->InjectNewPath(myPath);
Bot で使用されるパス フォローイング システムがパスの生成に使用される設定と互換性を持つようにするため、各 Path はパスに追従するために使用する必要がある NavigationProfile の一意の ID を維持することに注意してください。挿入されたパスを Bot が追従する限り、Bot のパス フォローイング システムは TraverseLogic や IPathEventListObserver などのパス フォローイングをコントロールするのに使用するべきカスタマイズ可能なオブジェクトを取得するために、自動的にその NavigationProfile を使用します。
デフォルトでは、一から作成する新しい Path オブジェクトは、World によって維持されるデフォルトの NavigationProfile を使用するように設定されます。 新しい Path が追従するべき方向にカスタム NavigationProfile の使用を必要とする特別な要件がある場合は、Path::SetNavigationProfileId() を呼び出して Path に適切なプロファイル ID を設定する必要があります。