Gameware Navigation 경로 따르기 시스템은 캐릭터가 경로 따르기를 중지해야 하는 시기 또는 캐릭터가 대상까지의 새 경로를 계산해야 하는 시기와 같은 높은 레벨의 결정은 하지 않습니다. 그러한 레벨에 대한 결정은 사용자가 해야 합니다. Bot에게 경로를 따르도록 요청하면 중지하라고 하거나 다른 경로를 따르라고 하기 전까지는 계속 그렇게 하려고 합니다.
그러나 캐릭터가 해당 경로를 따를 때 발생하는 상황이나 이벤트에 응답하기 위해 경로 따르기 시스템의 현재 상태가 언제나 읽을 수 있도록 열려 있기 때문에 응답하려는 이벤트, 이러한 이벤트를 확인하려는 빈도(모든 프레임에서, 특정 시간 간격이 지난 다음 주기적으로 등) 및 응답으로 사용할 동작을 자유롭게 결정할 수 있습니다.
이 페이지에서는 이벤트 응답하기 위한 가장 일반적인 몇 가지 전략을 설명합니다.
이 PathEvent 시스템은 캐릭터의 경로를 모니터링하고 해당 경로에 영향을 주는 NavData의 동적 변경 사항에 응답하기 위해 Gameware Navigation 경로 따르기 시스템이 제공하는 주요 매커니즘 중 하나입니다. 시스템 작동 방법 및 사용 방법에 대한 자세한 내용은 PathEvent 모니터링을(를) 참조하십시오.
Bot::GetBotOutput() 함수를 사용하면 경로 따르기(outputVelocity, outputFrontDirection, avoidanceResult 및 UpperBoundType)를 위해 봇 출력을 읽고 IsPathRecomputationNeeded() 함수에 액세스할 수 있습니다.
UpperBoundType에는 경로가 유효하지 않은 경우(UpperBoundType_PathInvalid) 및 경로 값이 없는 경우(UpperBoundType_NoPath)와 같은 특정 값이 있습니다. 이 경우 GetUpperBound()가 경로에 대한 잘못된 위치를 반환합니다.
IsPathRecomputationNeeded() 함수는 Trajectory 오브젝트가 더 이상 경로를 따를 수 없는 경우 true를 반환합니다. 이 경우 경로 따르기를 위해 Trajectory 오브젝트를 사용하는 봇이 고정되고 이 문제를 해결하기 위해 새 경로를 계산해야 합니다.
if (navBot->GetBotOutput().IsPathRecomputationNeeded())
navBot->ComputeNewPathToDestination(destination);캐릭터가 대상점에 도달하면 일반적으로 불필요한 계산을 하지 않도록 경로 따르기 시스템을 중지합니다. 여러 가지 방법으로 대상에 도달했는지 확인할 수 있습니다. 한 가지 간단한 방법은 Bot::HasReachedPosition() 메서드를 호출하여 지정된 반지름을 통해 형상 테스트를 수행하는 것입니다.
예: [Tutorial_FirstIntegration.cpp의 코드]
bool MyGameEntity::HasArrived()
{
KyFloat32 arrivalPrecisionRadius = m_navBot->GetConfig().m_pathProgressConfig.m_checkPointRadius;
if (m_navBot->HasReachedPosition(m_destinationPosition, arrivalPrecisionRadius))
{
return true;
}
return false;
}캐릭터가 도달하면 Bot::ClearFollowedPath()를 호출하여 경로 따르기를 취소할 수 있습니다.
경로 따르기 시스템에서 계산한 속도를 검색하고 캐릭터에 적용하기 전에, 경로 찾기 시스템이 경로를 성공적으로 찾을 수 있었는지 확인할 수 있습니다. Bot::GetFollowedPath()를 호출합니다. 이 메서드가 KY_NULL을 반환하면 정적 경로가 성공적으로 계산되지 않았거나 진행 중인 것입니다.
if (m_navBot->GetFollowedPath() == KY_NULL)
m_velocity = Kaim::Vec3f::Zero();
else
m_velocity = m_navBot->GetBotOutput().m_outputVelocity;경로가 성공적으로 계산되지 않은 경우 경로 찾기 쿼리에서 상태 값을 검색하여 추가 정보를 얻을 수도 있습니다. 예를 들어 AStarQuery를 사용하는 경우 AStarQuery::GetResult()를 호출할 수 있습니다.
사용하는 쿼리 유형에 관계 없이 다음 메서드를 호출하여 진행 상태 및 결과에 대한 정보를 가져올 수 있습니다.
m_navBot->GetPathFinderQuery()->m_processStatus; m_navBot->GetPathFinderQuery()->GetPathFinderResult();
Bot이 경로를 따라가는 동안 경로에 의해 교차되는 NavData 변경 사항이 Bot이 대상점을 향해 나아가는 것을 즉시 막지 않고 대상까지의 전체 루트를 차단할 수 있습니다. 예를 들어 동적 장애물 또는 금지된 TagVolume이 캐릭터가 아직 도달하지 않은 복도를 차단할 수 있습니다. 위에서 설명한 대로 대상점 상태를 테스트하면 차단된 지세에 이르러 더 이상 LivePath를 따라 대상까지 유효한 점을 찾을 수 없을 때 캐릭터가 경로를 재계산합니다. 그러나 차단된 경로에 대해 좀 더 일찍 응답하기를 원할 수 있습니다.
대상까지의 경로가 모두 유효한지 테스트하려면 Bot::GetBotOutput().GetUpperBoundType() 결과를 확인합니다. 결과가 다음 표에 나와 있습니다.
| 결과 | 설명 |
|---|---|
| UpperBoundType_NoPath | 경로 및 유효한 UpperBound가 없습니다. |
| UpperBoundType_PathInvalid | 전체 경로가 잘못되었고 유효한 UpperBound가 없습니다. |
| UpperBoundType_Temporary | 경로의 유효성을 확인 중이므로 현재 끝까지 따를 수 없습니다. UpperBound에 임시 제한이 있기는 하지만 경로가 유효하지 않다는 것은 아닙니다. 다음 프레임에서 추가로 유효성을 확인합니다. |
| UpperBoundType_PathLastNode | UpperBound는 경로의 마지막 노드이므로 끝까지 따를 수 있습니다. |
| UpperBoundType_ValidityUpperBound | 경로를 끝까지 따를 수 없습니다. UpperBound는 경로상의 상한이며, 마지막 노드는 아닙니다. 이 경우 현재 경로 따르기를 중지하고 경로를 다시 계산할 수 있습니다. 또는 UpperBound 위치의 특정 반지름 이내에 도달할 때까지 캐릭터가 현재 경로를 계속 따르도록 허용함으로써 캐릭터 편에서 지세에 대한 제한된 지식을 시뮬레이션해볼 수도 있으므로 차단 지세 등을 볼 수 있습니다. |