언리얼 엔진

Unreal AI - NavMesh 기반 이동 vs 커스텀 이동 정리

로안님 2025. 4. 7. 05:53

언리얼 AI에서 NavMesh 기반 이동과 커스텀 이동 비교 정리

언리얼 엔진에서 AI의 이동을 처리할 때 보통 UBTTask_MoveTo를 사용하는 것이 일반적이다. 그러나 특정 상황에서는 커스텀 이동을 구현해야 하는 경우도 생긴다. 이 글에서는 두 방식의 차이점과 커스텀 이동을 구현할 때 고려해야 할 사항들을 정리했다.


✅ UBTTask_MoveTo (NavMesh 기반 기본 이동)

장점

  • 사용이 간편하고 빠르게 구현 가능.
  • NavMesh를 기반으로 자동 경로 탐색 및 장애물 회피 지원.
  • 블랙보드에 목표 지점만 설정해주면 이동 자동 처리.
  • 내부적으로 FinishLatentTask() 호출 포함 → 별도로 성공 처리할 필요 없음.

단점

  • NavMesh 위에서만 이동 가능.
  • 특수한 이동 방식이나 세밀한 제어에는 부적합.
  • 커스텀 이벤트나 복잡한 조건 삽입 어려움.

✅ UBTTask_BlackboardBase 상속한 커스텀 이동

장점

  1. NavMesh 미지원 환경에서도 이동 구현 가능
    • 공중, 벽 타기, 유체 이동 등 특수 이동 가능.
  2. 이동 중 행동 삽입 가능
    • 예: 적 발견 시 멈춤, 경계, 공격 등 유연한 처리 가능.
  3. 세밀한 조건 제어
    • 거리, 시야각, 상태 등에 따라 다양한 조건부 이동 처리 가능.
  4. 디버깅 및 모듈화 용이
    • 내부 로직이 직접 작성되어 있어 UE_LOG, DrawDebug 등을 통한 디버깅 쉬움.

단점

  • 이동 로직을 직접 작성해야 하므로 구현 난이도 상승.
  • 경로 탐색은 UNavigationSystemV1::FindPathToLocationSynchronously() 등을 이용해 수동 구현해야 할 수 있음.
  • 이동 종료 시 Latent Task이므로 반드시 FinishLatentTask()를 수동 호출해야 함.
// 커스텀 이동 Task 예시
void UBTTask_CustomMove::TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
    if (IsAtTargetLocation())
    {
        FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);
    }
}

주의: 커스텀 이동 Task는 Latent Task로, TickTask()를 오버라이드하고 bNotifyTick = true 설정 필요.


🔍 언제 커스텀 이동을 써야 할까?

  • 공중 부양, 벽 달리기, 로프 타기 등 NavMesh를 벗어난 이동이 필요한 경우
  • 이동 중 복잡한 조건 처리나 행동 삽입이 필요한 경우
  • 보스 AI처럼 특수 패턴이나 스킬 기반 이동이 필요한 경우

📌 정리 비교표

기준 UBTTask_MoveTo 커스텀 이동 (BlackboardBase 상속)

구현 난이도 낮음 높음
유연성 낮음 매우 높음
디버깅 제한적 자유로움
NavMesh 의존성 있음 없음 (선택적 사용)
특수 이동 가능 여부 불가 가능
조건부 행동 삽입 어려움 쉬움
FinishLatentTask 필요 내부 처리됨 직접 호출 필요

커스텀 이동은 구현 난이도가 있는 대신, 자유도가 매우 높기 때문에 복잡한 AI 행동을 구성할 때 강력한 무기가 된다. 단순 이동은 UBTTask_MoveTo로, 그 외 상황에서는 커스텀 이동을 고려하자!