이 페이지에서는 Bot이 따르는 정적 Path를 설정할 수 있는 가장 간단한 방법부터 가장 복잡한 방법까지를 설명합니다.
이 방법은 새 경로를 계산하기 위한 가장 간단한 접근 방법으로, 일반적으로 초기 통합에 권장됩니다. 예를 들어 통합 자습서의 지침을 수행했다면(게임 엔진에 Navigation 통합 참조) 이미 이 방법을 사용하여 Bot을 설정한 것입니다.
이 방법에서는 Bot::ComputeNewPathToDestination()을 호출하고 대상 위치를 지정하면 됩니다. 봇이 투명하게 다음을 수행합니다.
경로 계산이 이미 진행 중인 경우 이전 요청은 자동으로 취소됩니다.
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::ComputeNewPathToDestination()을 호출하면 내부에서 이 메서드를 호출하여 NavigationProfile에서 검색하는 쿼리를 설정합니다. 사용자 정의하려는 다른 모든 설정은 이 호출 이후에 설정해야 합니다.
봇은 다음에 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에서 쿼리를 검색하지 못하며 생성된 경로가 봇의 경로 따르기 시스템과 호환되도록 하려면 약간 더 많은 설정이 필요합니다.
SDK와 함께 제공된 BestGraphVertexPathFinderQuery 클래스를 사용하는 경우 쿼리를 만들 때 제공한 템플릿 매개변수가 Bot에서 현재 사용 중인 TraverseLogic과 호환되도록 해야 합니다.
봇은 다음에 World를 업데이트하는 동안 쿼리가 비동기로 시작되도록 요청합니다.
이전 프레임에서 Bot에 대해 경로 계산이 실행되고 이전의 해당 계산이 아직 완료되지 않은 경우 Bot::ComputeNewPathAsync()를 호출할 수 없습니다. Bot::ComputeNewPathAsync()를 호출하기 전에 Bot::IsComputingNewPath()를 호출하여 계산이 현재 실행 중인지 테스트해야 합니다. 이 메서드가 true를 반환하는 경우 새 경로 찾기 요청을 건너뛰거나 Bot::CancelAsyncPathComputation()을 호출하여 이전 요청을 취소해야 합니다.
경우에 따라 캐릭터가 새 경로를 계산하지 않고 이미 계산한 경로를 사용하도록 할 수 있습니다. 예를 들어 다른 Bot이 계산한 Path, 직접 경로 찾기 쿼리를 실행하여 스스로 계산한 Path, 클래스 구성원 어딘가에서 사전에 계산하고 저장한 Path 또는 작업 중에 스스로 구성한 Path(이 방법은 일반적으로 권장되지 않음)가 될 수 있습니다.
Bot에서 Bot::InjectNewPath()를 호출할 때 Path 오브젝트를 전달하여 기존 경로를 따르도록 할 수 있습니다. 예를 들면 다음과 같습니다.
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);
봇이 사용한 경로 따르기 시스템이 경로를 생성하는 데 사용된 설정과 호환되도록 하기 위해 각 Path는 해당 경로를 따르는 데 사용되어야 하는 NavigationProfile의 고유 ID를 유지합니다. Bot이 주입된 경로를 따르는 한 해당 경로 따르기 시스템은 해당 NavigationProfile을 자동으로 사용하여 TraverseLogic 및 IPathEventListObserver와 같이 경로 따르기를 제어하는 데 사용해야 하는 사용자 정의 가능한 오브젝트를 검색합니다.
기본적으로 처음부터 만드는 새 Path 오브젝트는 World에서 유지하는 기본 NavigationProfile을 사용하도록 설정됩니다. 새 Path가 따라야 하는 방식에 대해 사용자 정의 NavigationProfile을 사용해야 하는 특별한 요구 사항이 있는 경우 Path에서 Path::SetNavigationProfileId()를 호출하여 적절한 프로필 ID를 설정해야 합니다.