[TIL_250422] 언리얼 엔진 AI 이동 명령 및 경로 탐색(Pathfinding)

2025. 4. 22. 20:42·Dev./UE 언리얼 엔진

💭회고

내비게이션 시스템

오늘은 언리얼 엔진에서 AI 이동과 경로탐색(Pathfinding)을 구현하는 방법을 자세히 살펴본다.

  1. 언리얼 엔진의 경로탐색(Pathfinding) 원리
  2. 언리얼 엔진에서의 경로탐색 알고리즘 응용 방법
  3. MoveToActor와 MoveToLocation 명령 활용법

이 세 가지를 이해하면 AI의 움직임을 제어할 수 있다.

📒학습 내용

1. 언리얼 엔진의 경로탐색(Pathfinding) 원리 이해하기

언리얼 엔진 AI는 목적지까지의 경로를 탐색할 때 가장 효율적인 경로를 자동으로 선택한다. 이 때 주로 사용하는 알고리즘은 A(A-Star)*나 다익스트라(Dijkstra) 알고리즘이다.

💡 핵심 개념: AI는 항상 비용(거리 또는 이동 난이도)이 가장 적게 드는 경로를 선택한다.

예를 들어, 한국에서 미국으로 가는 항공편이 있을 때 직항은 비용이 5, 일본을 경유하는 항공편은 비용이 3이라면, 엔진의 AI는 항상 비용이 더 적게 드는 일본 경유 경로를 선택한다. 이처럼 AI가 경로를 선택할 때 가장 효율적이고 비용이 적은 경로를 선택하는 것이 핵심이다.


2. 경로탐색 알고리즘 응용 방법 - Nav Modifier Volume 활용

언리얼 엔진은 기본적으로 NavMesh(내비게이션 메시)를 통해 AI의 이동 경로를 관리한다. 그러나 NavMesh는 런타임 중 동적 재생성이 어렵다는 단점이 있다.

🛑 문제점과 해결 방법

  • 문제점: 런타임 중 네비메시 동적 수정 불가 → 동적 상황에 대응하기 어려움
  • 해결책: Nav Modifier Volume을 사용하여 지역별 이동 비용을 실시간으로 조정할 수 있다.

혹여 프로젝트를 새로 오픈했을 때 설정값이 다이나믹이 아닐 수가 있으니 확인해보자.

해당 볼륨을 움직일 때마다 해당 네비메시 부분이 사라진다. 영역 클래스(Area Class) 세팅이 Null로 되어 있기 때문이다.

🔧 프로토타입 설계 단계별 정리

아래 단계를 순서대로 진행하면, Nav Modifier Volume을 통해 AI 이동 경로를 실시간으로 조정할 수 있다.

  • 타겟포인트 설정.
  • Nav Modifier Volume을 배치하고, Default-Area Class를 NavArea_Obstacle로 설정
  • Mobility를 Movable로 설정
  • 이동 비용이 높은 구역(주황색 영역)을 생성
  • 이를 통해 AI는 실시간으로 가장 효율적인 경로를 선택하게 된다.

🛠️ Nav Modifier Volume을 런타임에서 이동시키면 AI는 이를 즉시 반영해 새로운 경로를 계산한다. 이를 활용하면 플레이어를 추적하거나 전술적인 움직임을 구현할 때 매우 유용하다.


3. AI의 이동 명령: MoveToActor와 MoveToLocation 명령 이해하기

레벨 블루프린트 열고, NaviModifierVolume을 (드래그앤드랍)참조한다.
아래와 같이 블루프린트를 세팅하고 0번을 누르게 되면,

여기서 문제 발생!
디버깅을 위해 0번을 눌러도 아무런 동작을 이뤄지지 않는다.
➡️ 스태틱이 아닌 무버블로 Set을 해줘야 된다.

지정키를 누르게 되면 AI가 지정 구역을 피해서 왕복하는 것을 볼 수 있다.
그리고 코드를 보게 되면 `MoveToTarget()`안에 있는 내장 함수 `MoveToLocation()`가 핵심적인 메소드이다.

 

지금까지의 과정에서는 MoveToLocation 기능을 사용했다.

 

AI의 이동 명령은 크게 MoveToActor와 MoveToLocation으로 나뉜다. 두 기능은 AIController 안에 내장되어 있는 시스템이다. 두 함수의 주요 차이점과 활용법을 명확히 이해하자.

명령어  특징 및 활용법
MoveToLocation 정적인 특정 좌표로 이동할 때 사용
MoveToActor 동적인 타겟(Actor)을 따라 이동할 때 사용

MoveToLocation 함수

EPathFollowingRequestResult::Type MoveResult = AIController->MoveToLocation(
TargetLocation,
AcceptanceRadius,
true,  // 목적지에 오버랩 되면 도착으로 판정할지 여부.
true,  // 경로 찾기 사용
false, // 프로젝션 사용 안함
true   // 네비게이션 데이터 사용
);
EPathFollowingRequestResult::Type MoveToLocation(
const FVector& Dest,
float AcceptanceRadius = -1,
bool bStopOnOverlap = true,
bool bUsePathfinding = true,
bool bProjectDestinationToNavigation = true,
bool bCanStrafe = false,
TSubclassOf<UNavigationQueryFilter> FilterClass = nullptr,
bool bAllowPartialPath = true
);
  • Dest: 이동할 목적지의 좌표
  • AcceptanceRadius: AI가 목적지에 도달했다고 판단할 거리 (값이 클수록 더 멀리서 "도착" 처리)
  • bStopOnOverlap: 목적지와 캐릭터의 충돌 영역이 겹치면 도착으로 간주할지 여부
  • bUsePathfinding: 경로탐색 알고리즘(A*)을 사용할지 여부(false면 직선으로 이동 시도)
  • bProjectDestinationToNavigation: 목적지를 네비게이션 메시에 투영할지 여부
    • AI 설계 시, 어떤 영역에 NaviMesh를 설치하는 것은 불가하지만 해당 위치에 있는 오브제에 최대한 가깝게 이동은 시켜야 할 때. 해당 부분을 true로 세팅하면 됨.
  • bCanStrafe: AI가 측면 이동을 할 수 있는지 여부(횡이동)
  • FilterClass: 네비게이션 쿼리에 사용할 필터클래스
  • bAllowPartialPath: 완전한 경로를 찾지 못할 경우 부분 경로라도 허용할지 여부
    • 네비게이션 메시 안에서 길이 가다가 끊어져 있거나, 플레이어를 따라다니는 펫이 있는데 플레이어를 잃어버릴 경우는 갈 수 있는 곳까지만(AI가 찾은 경로까지만) 가고 멈추게 할 것인지 여부
MoveToLocation 함수의 원형은 실제 구현한 함수보다 작은 파라미터를 가지고 있지만 무사히 작동함.
C++에서는 함수의 필수 파라미터가 아닌 경우 임의 누락이 가능하며 누락된 경우 함수원형의 기본값이 사용되기 때문이다.

 AI 이동 코드

void ASCC_UEAICharacter::MoveToTarget() {
    if (!AIController || bIsMoving) return;

    AActor* SelectedTarget = bIsSucceeded ? Target : Target2;

    if (SelectedTarget) {
        bIsMoving = true;
        AIController->MoveToLocation(
            SelectedTarget->GetActorLocation(),
            AcceptanceRadius, true, true, false, true
        );
    }
}
CODE 전체 바꾸기 팁
- 코드를 가져온 후, 클래스 이름을 매치해야 하기에
- 컨트롤 F로 검색한 후에 바꿔야 할 텍스트 입력하고 Alt+A 누르면 됨.
💻 MoveToActor는 이동 중인 적을 추격하는 AI에 적합하며, MoveToLocation은 정해진 장소를 순찰하는 AI를 제작할 때 적합하다. 연산 비용을 고려하여 필요에 맞게 선택하자.

🟣오늘의 옵시디언 현황

'Dev. > UE 언리얼 엔진' 카테고리의 다른 글

[TIL_250424] 언리얼 엔진 AI Controller로 플레이어 자동 추적 구현하기  (0) 2025.04.24
[TIL_250423] 언리얼 엔진 RVO 시스템으로 AI의 동적 장애물 회피 구현하기  (0) 2025.04.23
[TIL_250421] UE5 AI 시스템 : Behavior Tree ~ Navigation Invoker  (1) 2025.04.21
[TIL_250417] 액터 이동 블루프린트 로직  (0) 2025.04.17
[TIL_250411] 프로젝트 진행 상황 점검  (0) 2025.04.11
'Dev./UE 언리얼 엔진' 카테고리의 다른 글
  • [TIL_250424] 언리얼 엔진 AI Controller로 플레이어 자동 추적 구현하기
  • [TIL_250423] 언리얼 엔진 RVO 시스템으로 AI의 동적 장애물 회피 구현하기
  • [TIL_250421] UE5 AI 시스템 : Behavior Tree ~ Navigation Invoker
  • [TIL_250417] 액터 이동 블루프린트 로직
raindrovvv
raindrovvv
raindrovvv 님의 블로그 입니다.
  • raindrovvv
    raindrovvv 님의 블로그
    raindrovvv
  • 전체
    오늘
    어제
    • 분류 전체보기 (101) N
      • Dev. (94) N
        • UE 언리얼 엔진 (49) N
        • Unity 유니티 (0)
        • Wwise 와이즈 (7)
        • 게임 네트워크 (8)
        • 그래픽스 Graphics (22)
        • 프로젝트 (4)
        • 기타 개발 관련 (4)
      • Computer Science (0)
        • 하드웨어 HW (0)
        • 소프트웨어 SW (0)
        • 통신 (0)
        • 데이터 (0)
      • 블로그 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    게임사운드
    깃
    고라니
    Wwise
    게임
    게임음향
    TA
    언리얼엔진
    머티리얼
    네트워크
    그래픽스
    unrealengine
    AI
    언리얼
    셰이더
    Git
    Unreal
    UE
    게임네트워크
    게임개발
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
raindrovvv
[TIL_250422] 언리얼 엔진 AI 이동 명령 및 경로 탐색(Pathfinding)
상단으로

티스토리툴바