icon
8장 : AI 시스템 구축

내비게이션 시스템을 통한 기본 AI 이동


지난 절에서 우리는 비헤이비어 트리와 EQS를 통해 AI가 "무엇을 할 것인가?"와 "어디서 할 것인가?"를 결정하는 방법을 배웠습니다. 이제 AI가 결정한 목표 위치로 "어떻게 이동할 것인가?" 에 대한 문제를 해결해야 합니다. 언리얼 엔진은 AI가 복잡한 3D 환경에서 효율적으로 길을 찾아 이동할 수 있도록 강력한 내비게이션 시스템(Navigation System) 을 제공합니다.

이번 절에서는 언리얼 엔진의 내비게이션 시스템, 특히 내비메시(NavMesh) 의 기본 개념과 AI 이동에 이를 활용하는 방법에 대해 자세히 알아보겠습니다.


내비게이션 시스템과 내비메시란 무엇인가?

내비게이션 시스템(Navigation System) 은 AI가 게임 세계에서 장애물을 피하고 목표 지점까지 최적의 경로를 찾아 이동할 수 있도록 지원하는 기능들의 집합입니다. 이 시스템의 핵심은 바로 내비메시(NavMesh) 입니다.

내비메시(Navigation Mesh) 내비메시는 AI가 이동할 수 있는 공간을 나타내는 2D 또는 3D 폴리곤 메시입니다. 언리얼 엔진은 레벨에 배치된 지오메트리(바닥, 벽, 오브젝트 등)를 분석하여 AI가 걸어 다닐 수 있는 영역을 자동으로 계산하고, 이 영역을 녹색으로 표시되는 메시 형태로 생성합니다. AI는 이 내비메시 위에서만 이동 경로를 탐색하고 움직일 수 있습니다.

내비메시가 필요한 이유

  • 경로 탐색 (Pathfinding): AI가 복잡한 환경에서 장애물을 피하고 목표까지 가장 효율적인 경로를 계산할 수 있게 합니다.
  • 성능 최적화: AI가 이동 가능한 영역만 미리 계산해두므로, 런타임에 매번 복잡한 지오메트리 계산을 할 필요 없이 빠르게 경로를 찾을 수 있습니다.
  • 현실적인 이동: AI가 벽을 뚫거나 공중에 뜨는 등 비정상적인 움직임을 하지 않도록 제어합니다.
  • 유연성: 점프, 낙하, 특정 높이까지의 이동 등 다양한 이동 방식을 내비메시 설정으로 제어할 수 있습니다.

내비메시 생성 및 설정

내비메시는 기본적으로 프로젝트에 내비게이션 시스템이 활성화되어 있다면 자동으로 생성됩니다.

내비게이션 시스템 활성화 확인

  • 편집(Edit) > 프로젝트 세팅(Project Settings) > 엔진(Engine) > 내비게이션 시스템(Navigation System)으로 이동합니다.
  • Generate Navigation Data가 체크되어 있는지 확인합니다. (기본적으로 체크되어 있습니다.)

내비메시 볼륨 배치

  • 플레이스 액터(Place Actors) 패널에서 볼륨(Volumes) 섹션으로 이동합니다.
  • Nav Mesh Bounds Volume 을 레벨에 드래그 앤 드롭하여 배치합니다.
  • 이 볼륨의 크기를 조절하여 AI가 이동할 수 있는 모든 영역을 포함하도록 합니다.
  • 볼륨을 배치하면 자동으로 내비메시가 계산되어 녹색으로 표시됩니다.
  • Tip: P 키를 누르면 내비메시를 토글하여 켜고 끌 수 있습니다.

내비메시 설정 조정 (선택 사항)

  • Nav Mesh Bounds Volume을 선택한 상태에서 디테일(Details) 패널을 확인합니다.
  • 내비게이션 메시(Navigation Mesh) 섹션에서 다양한 설정을 조정할 수 있습니다.
    • Agent Radius: AI 캐릭터의 반지름. 이 값보다 좁은 통로는 내비메시에서 제외됩니다.
    • Agent Height: AI 캐릭터의 높이. 이 값보다 낮은 천장은 내비메시에서 제외됩니다.
    • Agent Max Slope: AI가 오를 수 있는 최대 경사각. 이 각도보다 가파른 경사는 내비메시에서 제외됩니다.
    • Agent Max Step Height: AI가 오를 수 있는 최대 계단 높이. 이 높이보다 높은 계단은 내비메시에서 점프나 다른 특별한 이동 액션 없이는 이동 불가능한 것으로 간주됩니다.
    • 이 값들을 AI 캐릭터의 크기와 이동 능력에 맞게 조정해야 합니다.
  • 설정을 변경하면 내비메시가 자동으로 다시 계산됩니다.

AI 이동 구현: Move To 노드

비헤이비어 트리에서 AI를 이동시키는 가장 기본적인 태스크 노드는 Move To 입니다. 이 노드는 내비메시를 사용하여 목표 지점까지의 경로를 찾아 AI를 이동시킵니다.

Move To 태스크 노드 사용법

비헤이비어 트리 열기: AI의 비헤이비어 트리(BT_EnemyAI)를 엽니다.

Move To 태스크 노드 추가

  • 비헤이비어 트리의 태스크 노드를 추가할 위치(예: Sequence 노드의 자식)에 Move To 노드를 배치합니다.

목표 설정

  • Move To 노드를 선택하고 디테일(Details) 패널에서 Blackboard Key를 설정합니다.
  • Blackboard Key는 AI가 이동할 목표 위치를 담고 있는 블랙보드 키여야 합니다.
  • 예시
    • TargetLocation (Vector 타입): 특정 월드 좌표로 이동할 때 사용합니다.
    • TargetActor (Object/Actor 타입): 특정 액터(예: 플레이어)에게 이동할 때 사용합니다. 이 경우 AI는 해당 액터의 위치로 이동합니다.

이동 관련 설정 (선택 사항)

  • Acceptable Radius: AI가 목표 지점에 얼마나 가까이 도달해야 '도착'으로 간주할지 설정합니다. 이 반경 내에 들어오면 Move To 태스크는 성공으로 간주됩니다.
  • Stop On Overlap: 목표 지점에 도착했을 때 AI가 완전히 멈출지 여부를 설정합니다.
  • Allow Partial Path: 목표 지점까지 완전한 경로를 찾지 못하더라도 부분적인 경로라도 따라 이동할지 여부를 설정합니다.
  • Observe BlackBoard Value: Blackboard Key의 값이 변경될 때 Move To 태스크를 다시 시작할지 여부를 설정합니다. (예: 플레이어의 위치가 계속 변할 때 추적)

컴파일 및 저장합니다.

예시: 플레이어 추적 AI (비헤이비어 트리 구조)

Root
  |
  Selector (플레이어가 보이는가? -> 공격 / 아니면 순찰)
    |
    +--- Sequence (플레이어 추적 및 공격)
    |      |
    |      +--- Decorator: Blackboard Based Condition (플레이어가 보이는가?)
    |      |      (블랙보드 키: TargetActor, 조건: Not Set == false)
    |      +--- Service: Update Player Location (주기적으로 플레이어 위치를 TargetActor에 저장)
    |      |
    |      +--- Task: Move To (Blackboard Key: TargetActor, Acceptable Radius: 150)
    |      |      (플레이어에게 150 유닛까지 접근)
    |      +--- Task: Attack Player (커스텀 태스크)
    |
    +--- Sequence (순찰)
           |
           +--- Task: Find Random Location (블랙보드에 RandomLocation 저장)
           +--- Task: Move To (Blackboard Key: RandomLocation)
           +--- Task: Wait (5초 대기)

이 예시에서 Move To 노드는 TargetActor (플레이어) 또는 RandomLocation (순찰 지점)으로 AI를 이동시킵니다. 내비메시가 없으면 Move To 노드는 경로를 찾지 못하고 실패하게 됩니다.


내비게이션 시스템의 고급 활용 (선택 사항)

  • 내비게이션 링크 (Navigation Links): AI가 점프, 클라이밍, 특정 오브젝트와의 상호작용을 통해 이동할 수 있는 경로를 수동으로 지정할 때 사용합니다. (예: 절벽 사이를 점프하거나 사다리를 오르는 경로)
  • 내비게이션 리캐스트 (Navigation Recast): 동적으로 변하는 환경(예: 문이 열리거나 닫히는 경우, 파괴 가능한 오브젝트)에 맞춰 내비메시를 실시간으로 업데이트합니다.
  • 내비게이션 쿼리 (Navigation Query): 경로 탐색 외에, 특정 위치가 이동 가능한지, 가장 가까운 이동 가능한 지점은 어디인지 등을 쿼리할 수 있습니다.
  • AI Move To 노드 (블루프린트): 비헤이비어 트리가 아닌 일반 블루프린트에서 AI를 이동시킬 때 AI Move To 노드를 사용할 수 있습니다.

테스트 및 디버깅

  • 내비메시 확인: P 키를 눌러 내비메시가 올바르게 생성되었는지 확인합니다. AI가 이동해야 할 모든 영역이 녹색으로 표시되어야 합니다.
  • AI 디버깅: 게임 플레이 중 ~ 키를 눌러 콘솔을 열고 ai.debugdrawpath 1 명령어를 입력하면 AI의 이동 경로를 시각적으로 확인할 수 있습니다. show navigation 명령어도 유용합니다.
  • 블랙보드 디버깅: 비헤이비어 트리 에디터에서 디버그(Debug) 드롭다운 메뉴를 통해 현재 실행 중인 AI를 선택하면, 블랙보드의 값 변화와 비헤이비어 트리의 실행 흐름을 실시간으로 확인할 수 있습니다.

내비게이션 시스템은 AI가 게임 세계에서 '살아있는' 것처럼 움직이게 만드는 기반입니다. 비헤이비어 트리와 EQS를 통해 AI의 의사결정을 내리고, 내비게이션 시스템을 통해 그 의사결정을 실제 이동으로 구현함으로써, 더욱 몰입감 있고 반응적인 게임 경험을 제공할 수 있습니다.


이번 절에서는 언리얼 엔진의 내비게이션 시스템, 특히 내비메시의 개념과 설정, 그리고 비헤이비어 트리의 Move To 노드를 활용한 AI 이동 구현 방법에 대해 알아보았습니다. AI가 게임 세계를 지능적으로 탐색하고 이동하는 데 내비게이션 시스템은 필수적인 요소입니다.