정적 경로 가져오기

이 페이지에서는 Bot이 따르는 정적 Path를 설정할 수 있는 가장 간단한 방법부터 가장 복잡한 방법까지를 설명합니다.

기본: 기본 A* 쿼리 사용

이 방법은 새 경로를 계산하기 위한 가장 간단한 접근 방법으로, 일반적으로 초기 통합에 권장됩니다. 예를 들어 통합 자습서의 지침을 수행했다면(게임 엔진에 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);
}

고급: Astar 쿼리 즉시 사용자 정의

위에 표시된 경로 계산에 대한 방법은 간단한 API를 사용하는 가장 일반적인 경로 계산 시나리오를 처리하며, 통합을 시작하고 실행하는 데 이상적입니다. 그러나 사전 설정된 기본 동작으로 AStarQuery 클래스를 강제로 사용하도록 합니다. 결국 프로젝트에서 AstarQuery가 제공하는 옵션 및 설정을 즉시 사용자 정의하도록 하거나 Bot에 대해 설정할 수 있는 경로 찾기 구성 매개변수에 노출되지 않는 방식으로 쿼리를 설정하도록 할 수 있습니다. AStarQuery 옵션을(를) 참조하십시오.

이러한 가능성을 탐색하기 위해 Bot 클래스에서 제공된 "고급" 경로 계산 API를 사용할 수 있습니다. 그러나 그렇게 하려면 좀 더 주의가 필요합니다.

이 접근 방법에서

봇은 다음에 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에서 쿼리를 검색하지 못하며 생성된 경로가 봇의 경로 따르기 시스템과 호환되도록 하려면 약간 더 많은 설정이 필요합니다.

봇은 다음에 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를 설정해야 합니다.