일반적으로 AStarQuery 클래스는 NavMesh 및 NavGraph를 통과하여 사전 결정된 특정 대상에 이르는 경로를 찾는 것처럼 가장 일반적인 경로 계산 시나리오에 사용하면 유용합니다. 또한 이 클래스에서 생성하는 경로의 특징을 제어하고 경로 찾기 계산의 성능을 조정하는 옵션을 제공합니다.
그러나 특수한 경우 쿼리의 다른 클래스를 사용하여 특정 기준을 충족하는 Path를 생성할 수 있습니다. 이 클래스는 Gameware Navigation SDK에 제공된 경로 찾기 쿼리의 대체 클래스가 되거나 게임 시나리오의 특정 요구 사항을 충족하기 위해 직접 작성한 쿼리의 사용자 정의 클래스가 될 수 있습니다.
이 페이지에서는 Gameware Navigation SDK에 제공된 대체 경로 찾기 쿼리 클래스 및 사용자 정의 경로 찾기 쿼리를 직접 작성하는 경우의 요구 사항에 대해 설명합니다.
대체 경로 찾기 쿼리를 사용하도록 Bot을 설정하는 방법에 대한 자세한 내용은 정적 경로 가져오기을(를) 참조하십시오.
AStarQuery와 달리 BestGraphVertexPathFinderQuery는 사전 결정된 대상에 대한 경로를 찾지 않습니다. 대신 경로 계산 중 NavGraph의 정점이 되어야 하는 대상을 동적으로 선택할 수 있습니다. 예를 들어 이 쿼리를 사용하여 봇이 최상의 근거리 후위, 저격 위치, 의료 팩, 무기 업그레이드 등으로 이동하도록 할 수 있습니다.
쿼리는 지정된 시작점에서 모든 방향으로 NavMesh를 통해 바깥쪽으로 전파됩니다. 잠재적 대상으로 검색되는 각 NavGraph 정점에 대해 쿼리는 사용자가 작성하고 템플릿 매개변수로 제공하는 사용자 정의자 클래스의 인스턴스를 호출하여(AStarQuery에 제공할 수 있는 사용자 정의자와 유사함) 정점을 최종 대상으로 선택할지 여부를 결정합니다.
쿼리는 검색을 중지해야 한다고 사용자 정의자에 표시되거나 쿼리에 대해 설정된 최대 경로 비용을 초과할 때까지 계속 NavMesh를 탐색하여 후보 NavGraph 정점을 찾습니다.
이 쿼리 클래스는 NavGraph 정점만 잠재적 대상으로 테스트하므로 쿼리가 잠재적으로 선택할 NavGraph 정점을 3D 공간의 각 점에 만들었는지 확인해야 합니다. 예를 들어 이 쿼리를 사용하여 후위를 선택하려는 경우 NavGraph를 만들고 각 잠재적 후위에 대해 정점을 추가한 다음 쿼리에 사용할 Database에 NavGraph를 추가해야 합니다.
이 프로세스에 대한 자세한 내용은 NavGraph 만들기을(를) 참조하십시오.
BestGraphVertexPathFinderQuery에 제공되는 템플릿 클래스는 일반적인 TraverseLogic 인터페이스를 구현하여 다른 NavTag로의 전환을 금지할지 여부를 결정하며, 단방향 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()를 호출하여 설정할 수 있는 반지름이 있는 원을 사용한다는 점입니다.
일반적으로 대상까지의 경로를 찾기 위해 AStarQuery 또는 BestGraphVertexPathFinderQuery가 사용됩니다. 그러나 런타임 시 따라야 하는 경로를 형성하는 연속된 3D 위치(폴리선)를 알고 있는 경우에는 다른 쿼리 대신 PathFinderFromPolyline 쿼리를 사용할 수 있습니다. PathFinderFromPolyline 쿼리는 폴리선의 입력 3D 위치를 사용하여 Kaim::Path의 인스턴스를 만듭니다. PathFinderFromPolyline 쿼리가 성공적으로 수행되려면 폴리선이 완전히 NavMesh 내부에 있어야 합니다.
봇이 따를 경로를 찾는 쿼리의 클래스를 직접 작성할 수 있습니다. 그러면 봇 경로 따르기 시스템의 다른 모든 하위 시스템에 영향을 주지 않고 경로 계산을 완전히 제어할 수 있습니다. 클래스가 아래에 지정된 윤곽을 따르는 한, 경로 찾기 및 따르기 시스템의 나머지 부분과 완벽히 호환되어야 합니다.
클래스를 Kaim::IPathFinderQuery에서 파생시키거나 AStarQuery와 같이 Gameware Navigation SDK에 제공된 경로 찾기 쿼리 클래스 중 하나에서 파생시켜야 합니다.
다음 섹션에 설명된 대로 Kaim::IPathFinderQuery 기본 클래스의 순수 가상 메서드를 모두 구현해야 합니다. Kaim::IPathFinderQuery, Kaim::ITimeSlicedQuery 및 Kaim::IQuery 기본 클래스에 대해서는 설명서 및 헤더 파일을 참조하십시오.
샘플 구현에 대해서는 AStarQuery 및 BestGraphVertexPathFinderQuery 클래스의 구현을 참조하십시오.
봇이 Bot::ComputeNewPathAsync() 호출에 대한 응답으로 실제 경로 계산을 수행하기 위해 호출하는 API의 주 메서드입니다. 구현에서는 다음을 수행해야 합니다.
봇이 사용한 경로 따르기 시스템이 경로를 생성하는 데 사용된 설정과 호환되도록 하기 위해 각 Path는 해당 경로를 따르는 데 사용되어야 하는 NavigationProfile의 고유 ID를 유지합니다. Bot이 주입된 경로를 따르는 한 해당 경로 따르기 시스템은 해당 NavigationProfile을 자동으로 사용하여 TraverseLogic 및 IPathEventListObserver와 같이 경로 따르기를 제어하는 데 사용해야 하는 사용자 정의 가능한 오브젝트를 검색합니다.
기본적으로 처음부터 만드는 새 Path 오브젝트는 World에서 유지하는 기본 NavigationProfile을 사용하도록 설정됩니다. 새 Path가 따라야 하는 방식에 대해 사용자 정의 NavigationProfile을 사용해야 하는 특별한 요구 사항이 있는 경우 Path에서 Path::SetNavigationProfileId()를 호출하여 적절한 프로필 ID를 설정해야 합니다.
이 메서드는 쿼리의 각 클래스에 대해 고유 식별자를 반환합니다. iquery.h에서 QueryType 열거를 편집하여 쿼리에 대한 새 항목을 QueryType_FirstCustom 값 뒤에 추가하면 이 메서드에서 해당 값을 반환합니다.
이러한 함수는 Navigation Lab에 표시하기 위해 시각적 디버깅 시스템을 통해 전송할 데이터를 준비할 때 호출됩니다.
이 메서드는 쿼리에 대해 대상점을 반환하거나 쿼리에 대상이 없는 경우 KY_NULL을 반환해야 합니다.
이 메서드는 경로 계산의 현재 상태를 나타내야 합니다.
이 메서드는 쿼리 계산의 현재 상태에 대한 텍스트 설명을 가져오기 위해 호출됩니다. 이 메서드 구현은 선택 사항입니다.