개요
언리얼 엔진 내비게이션 시스템(Unreal Engine Navigation System) 은 인공 지능 에이전트에게 경로 찾기 기능을 제공합니다.
시작 위치와 목적지 사이의 경로를 찾기 위해 내비게이션 메시(Navigation Mesh)가 월드 콜리전 지오메트리에서 생성됩니다. 이 간소화된 폴리곤 메시는 레벨에서 이동 가능한 공간을 나타냅니다. 디폴트 세팅에서는 내비게이션 메시를 타일로 분할하므로 일부분만 다시 빌드할 수 있습니다.
결과 메시는 폴리곤으로 구성되며 각 폴리곤에 비용이 할당됩니다. 경로를 찾는 동안 경로 찾기 알고리즘은 목적지까지의 비용이 가장 낮은 최적의 경로를 찾으려고 시도합니다.
이 시스템에는 에이전트의 경로 찾기 행동을 필요에 따라 커스터마이징할 수 있는 여러 기능이 포함되어 있습니다.
목표
이 퀵스타트 가이드에서는 내비게이션 시스템으로 레벨에서 돌아다니는 간단한 에이전트를 만드는 방법을 알아봅니다.
세부 목표
-
내비게이션 메시 액터를 레벨에 사용하여 내비게이션을 구축합니다.
-
내비게이션 메시를 레벨에서 시각화하고 필요에 맞게 조정합니다.
-
ThirdPersonCharacter 블루프린트를 수정하여 내비게이션 시스템으로 레벨에서 돌아다니게 합니다.
1 - 필수 구성
-
언리얼 프로젝트 브라우저(Unreal Project Browser)의 새 프로젝트 카테고리(New Project Categories) 섹션에서 게임(Games) 및 삼인칭(Third Person) 템플릿을 선택합니다.
-
블루프린트(Blueprint) 와 시작용 콘텐츠 없음(No Starter Content) 옵션을 선택한 뒤 생성(Create) 을 클릭합니다.
섹션 결과
새 삼인칭 프로젝트를 생성했으니 이제 내비게이션 시스템을 배울 준비가 되었습니다.
2 - 내비게이션 메시 빌드
이 섹션에서는 내비게이션 메시 바운드 볼륨(Navigation Mesh Bounds Volume) 을 사용하여 레벨에서 내비게이션을 생성할 영역을 지정합니다. 이 정보는 에이전트가 레벨을 이동하여 목적지에 도달하는 데 사용됩니다.
-
프로젝트의 디폴트 ThirdPersonExampleMap 에서 액터 배치(Place Actors) 패널로 가서 NavMeshBoundsVolume 을 검색하고 레벨로 드래그합니다.
-
NavMeshBoundsVolume 을 선택한 채 디테일(Details) 패널에서 볼륨의 스케일을 X = 20, Y = 20, Z = 5로 조절합니다. 아래와 같이 볼륨을 움직여서 플레이 영역 전체를 덮게 합니다.
-
아웃라이너(World Outliner) 창에서 BP_ThirdPersonCharacter 블루프린트를 선택한 뒤 레벨에서 제거합니다.
-
키보드로 P 를 누르면 레벨에서 내비게이션 메시를 시각화할 수 있습니다. 내비게이션 메시는 기본적으로 아래 이미지에서와 같이 녹색으로 시각화됩니다.
언리얼 엔진은 내비메시 바운드 볼륨(Nav Mesh Bounds Volume) 액터가 레벨에 추가되거나 크기 조정되는 즉시 자동으로 내비게이션 메시를 생성합니다.
-
내비게이션 메시가 계단에서 비주얼 아티팩트를 일으키는 것이 보입니다. 내비게이션 메시는 레벨의 콜리전을 간소화해서 표현하기 때문입니다. 아웃라이너(Outliner) 창에서 RecastNavMesh-Default 액터를 선택한 뒤 디테일 (Details ) 패널로 이동합니다. 디스플레이(Display) 섹션으로 이동하여 오프셋 그리기(Draw Offset) 값을 50 으로 설정합니다. 그러면 내비게이션 메시가 그려진 곳에서 높이 오프셋이 조절되어 더 알아보기 쉽습니다.
섹션 결과
이 섹션에서는 내비메시 바운드 볼륨 액터를 레벨에 추가하고 플레이 영역에 맞게 스케일을 조절했습니다. 또한 P를 눌러서 최종 내비게이션 메시를 시각화하는 방법을 알아보았습니다.
3 - 내비게이션 메시 시각화하기
이 섹션에서는 다양한 내비게이션 메시 세팅을 수정하는 방법과 레벨에서 메시를 시각화하는 방식을 변경하는 방법을 알아봅니다.
-
아웃라이너(Outliner) 에서 RecastNavMesh-Default 액터를 선택합니다.
-
액터를 선택한 상태로 디테일(Details) 패널을 아래로 스크롤하여 디스플레이(Display) 섹션으로 이동합니다. 여기에는 생성된 내비게이션 메시를 보다 잘 시각화하기 위한 여러 옵션이 있습니다. 아래 예시에서는 메시를 구성하는 폴리곤을 보기 위해 폴리 에지 그리기(Draw Poly Edge) 를 선택했습니다.
-
타일 바운드 그리기(Draw Tile Bounds) 체크박스를 활성화하여 개별 내비게이션 타일(Navigation Tile)을 시각화할 수도 있습니다.
-
생성(Generation) 섹션의 옵션을 바꿔서 내비게이션 메시가 생성되는 방식을 수정할 수도 있습니다.
섹션 결과
이 섹션에서는 내비게이션 메시의 디스플레이 세팅을 변경하는 방법과 다양한 옵션을 조정하여 내비게이션 메시의 생성에 인플루언스를 주는 방법을 알아보았습니다.
4 - 첫 에이전트 생성하기
이 섹션에서는 간단한 에이전트를 생성하고 주변에서 랜덤 위치를 선택하여 이동하는 식으로 레벨에서 돌아다니게 하겠습니다. 이 에이전트는 목적지에 도착하면 몇 초 대기한 뒤 같은 프로세스를 반복할 것입니다.
-
콘텐츠 드로어(Content Drawer) 에서 우클릭하고 새 폴더(New Folder) 를 선택하여 새 폴더를 생성합니다. 폴더를 NavigationSystem 으로 명명합니다.
-
콘텐츠 드로어(Content Drawer) 에서 ThirdPersonBP > Blueprints 폴더로 이동하여 BP_ThirdPersonCharacter 블루프린트를 선택합니다. NavigationSystem 폴더로 드래그하고 여기에 복사(Copy Here) 옵션을 선택합니다.
-
NavigationSystem 폴더로 이동하여 블루프린트 이름을 BP_NPC_NavMesh 로 변경합니다. 블루프린트를 더블클릭하여 열고 이벤트 그래프(Event Graph) 로 이동합니다. 모든 입력 노드를 선택해서 지웁니다.
-
이벤트 그래프 를 우클릭한 뒤 커스텀 이벤트 추가(Add Custom Event) 를 검색하고 선택합니다. 이벤트를 MoveNPC 로 명명합니다.
-
이벤트 그래프 를 우클릭한 뒤 Get Actor Location 을 검색하고 선택합니다.
-
GetActorLocation 노드에서 드래그하여 GetRandomReachablePointInRadius 를 검색하고 선택합니다. Radius 를 1,000유닛으로 설정합니다.
-
GetRandomReachablePointInRadius 노드의 Random Location 핀을 드래그하여 변수로 승격(Promote to variable) 을 선택합니다.
-
방금 만든 RandomLocation 노드에 MoveNPC 노드를 연결합니다.
-
이벤트 그래프(Event Graph) 를 우클릭한 뒤 AI MoveTo 를 검색하고 선택합니다. RandomLocation 노드를 AI MoveTo 노드에 연결합니다.
-
이벤트 그래프 를 우클릭한 뒤 셀프 레퍼런스 가져오기(Get a reference to self) 를 검색하고 선택합니다.
-
Self 노드를 AI MoveTo 노드의 Pawn 핀에 연결합니다. 아래와 같이 Random Location 노드의 노란색 핀을 AI MoveTo 노드의 Destination 핀에 연결합니다.
-
AI MoveTo 노드의 On Success 핀에서 드래그하여 Delay 를 검색하고 선택합니다. Delay 노드의 Duration 을 4 로 설정합니다. 아래와 같이 Delay 노드의 Completed 핀에서 드래그하여 Move NPC 를 검색하고 선택합니다.
(convert:false)
-
위 단계를 반복하여 AI MoveTo 노드의 On Fail 핀에도 노드를 추가합니다. Delay 노드의 Duration 을 0.1로 설정합니다.
-
이벤트 그래프 를 우클릭한 뒤 이벤트 BeginPlay 를 검색하고 선택합니다. BeginPlay 이벤트 노드에서 드래그하여 MoveNPC 를 검색하고 선택합니다.
-
블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다.
-
BP_NPC_NavMesh 블루프린트를 레벨로 드래그하고 시뮬레이트(Simulate) 를 클릭합니다. 에이전트가 레벨에서 돌아다니는 것을 볼 수 있습니다.
섹션 결과
이 섹션에서는 내비게이션 메시(Navigation Mesh) 를 사용하여 레벨에서 돌아다니는 간단한 에이전트를 만드는 방법을 알아보았습니다.