언리얼 AI에서 NavMesh 기반 이동과 커스텀 이동 비교 정리
언리얼 엔진에서 AI의 이동을 처리할 때 보통 UBTTask_MoveTo를 사용하는 것이 일반적이다. 그러나 특정 상황에서는 커스텀 이동을 구현해야 하는 경우도 생긴다. 이 글에서는 두 방식의 차이점과 커스텀 이동을 구현할 때 고려해야 할 사항들을 정리했다.
✅ UBTTask_MoveTo (NavMesh 기반 기본 이동)
장점
- 사용이 간편하고 빠르게 구현 가능.
- NavMesh를 기반으로 자동 경로 탐색 및 장애물 회피 지원.
- 블랙보드에 목표 지점만 설정해주면 이동 자동 처리.
- 내부적으로 FinishLatentTask() 호출 포함 → 별도로 성공 처리할 필요 없음.
단점
- NavMesh 위에서만 이동 가능.
- 특수한 이동 방식이나 세밀한 제어에는 부적합.
- 커스텀 이벤트나 복잡한 조건 삽입 어려움.
✅ UBTTask_BlackboardBase 상속한 커스텀 이동
장점
- NavMesh 미지원 환경에서도 이동 구현 가능
- 공중, 벽 타기, 유체 이동 등 특수 이동 가능.
- 이동 중 행동 삽입 가능
- 예: 적 발견 시 멈춤, 경계, 공격 등 유연한 처리 가능.
- 세밀한 조건 제어
- 거리, 시야각, 상태 등에 따라 다양한 조건부 이동 처리 가능.
- 디버깅 및 모듈화 용이
- 내부 로직이 직접 작성되어 있어 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로, 그 외 상황에서는 커스텀 이동을 고려하자!
'언리얼 엔진' 카테고리의 다른 글
| Unreal AI - 타겟 인식 기반 공격 애니메이션 및 사망 처리 구현기 (0) | 2025.04.11 |
|---|---|
| Unreal AI - Behavior Tree Task 종류 및 커스텀 구현 가이드 (0) | 2025.04.07 |
| Unreal AI - 타겟 추적 및 행동 취소 조건 정리 (1) | 2025.04.04 |
| Unreal AI - 블루프린트 to C++ 컨버팅 순서 가이드 (0) | 2025.04.04 |
| Unreal AI - AIController 헤더 구성과 멤버 선언 이유 (0) | 2025.04.04 |