静的パスを取得する

このページでは、追従するための静的 PathBot に設定する方法について、最も単純なものから複雑なものまで説明します。

基本: デフォルトの A* クエリを使用する

新しいパスを計算するための最も簡単な方法であり、通常は、初期統合の際に推奨されているものです。たとえば、統合チュートリアルの手順を完了した場合(「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);
}

上級: オンザフライで AStar クエリーをカスタマイズする

上記のパス計算に対する方法は単純な API を使用して最も一般的なパス計算シナリオを処理するため、統合を実装して動かす場合には理想的です。ただし、あらかじめ設定されたデフォルトの動作で AStarQuery クラスを使用することが強制されます。AStarQuery によって提供されたオプションと設定をオンザフライでカスタマイズすることや、Bot に対して設定できるパス ファインディング設定パラメータにない方法でクエリーを設定することが必要になる場合がプロジェクトを進めていく上で発生することがあります。「AStarQuery オプション」を参照してください。

これらの可能性を探るためには、Bot クラスで提供されている「上級」のパス計算 API を使用することができます。ただし、これには多少注意が必要になります。

この方法の内容は以下のとおりです。

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 のパス フォローイング システムと互換性があるようにするために多少の設定が必要です。

Bot はクエリーが World の次の更新時に非同期的に実行されるように要求します。

前のフレームで Bot のパス計算が開始され、その計算がまだ完了していない場合は、Bot::ComputeNewPathAsync() の呼び出しは失敗することに注意してください。Bot::ComputeNewPathAsync() を呼び出す前に、Bot::IsComputingNewPath() を呼び出して現在計算が実行中かどうかをテストする必要があります。このメソッドが true を返した場合、新規パス ファインディング要求をスキップするか、Bot::CancelAsyncPathComputation() を呼び出して前の要求をキャンセルします。

上級: 既存の Path を挿入する

キャラクタで新しいパスを計算するのではなく、既に計算されているパスを使用することもできます。たとえば、異なる 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 を設定する必要があります。