기본 내비게이션

이 가이드에서는 언리얼 엔진에서 내비게이션 시스템을 사용하는 방법을 설명합니다.

Choose your operating system:

Windows

macOS

Linux

개요

언리얼 엔진 내비게이션 시스템(Unreal Engine Navigation System) 은 인공 지능 에이전트에게 경로 찾기 기능을 제공합니다.

시작 위치와 목적지 사이의 경로를 찾기 위해 내비게이션 메시(Navigation Mesh)가 월드 콜리전 지오메트리에서 생성됩니다. 이 간소화된 폴리곤 메시는 레벨에서 이동 가능한 공간을 나타냅니다. 디폴트 세팅에서는 내비게이션 메시를 타일로 분할하므로 일부분만 다시 빌드할 수 있습니다.

결과 메시는 폴리곤으로 구성되며 각 폴리곤에 비용이 할당됩니다. 경로를 찾는 동안 경로 찾기 알고리즘은 목적지까지의 비용이 가장 낮은 최적의 경로를 찾으려고 시도합니다.

이 시스템에는 에이전트의 경로 찾기 행동을 필요에 따라 커스터마이징할 수 있는 여러 기능이 포함되어 있습니다.

목표

이 퀵스타트 가이드에서는 내비게이션 시스템으로 레벨에서 돌아다니는 간단한 에이전트를 만드는 방법을 알아봅니다.

세부 목표

  • 내비게이션 메시 액터를 레벨에 사용하여 내비게이션을 구축합니다.

  • 내비게이션 메시를 레벨에서 시각화하고 필요에 맞게 조정합니다.

  • ThirdPersonCharacter 블루프린트를 수정하여 내비게이션 시스템으로 레벨에서 돌아다니게 합니다.

1 - 필수 구성

  1. 언리얼 프로젝트 브라우저(Unreal Project Browser)의 새 프로젝트 카테고리(New Project Categories) 섹션에서 게임(Games)삼인칭(Third Person) 템플릿을 선택합니다.

    게임 카테고리를 선택하고 다음을 클릭합니다

  2. 블루프린트(Blueprint)시작용 콘텐츠 없음(No Starter Content) 옵션을 선택한 뒤 생성(Create) 을 클릭합니다.

    블루프린트와 시작용 콘텐츠 없음 옵션을 선택한 뒤 프로젝트 생성을 클릭합니다

섹션 결과

새 삼인칭 프로젝트를 생성했으니 이제 내비게이션 시스템을 배울 준비가 되었습니다.

2 - 내비게이션 메시 빌드

이 섹션에서는 내비게이션 메시 바운드 볼륨(Navigation Mesh Bounds Volume) 을 사용하여 레벨에서 내비게이션을 생성할 영역을 지정합니다. 이 정보는 에이전트가 레벨을 이동하여 목적지에 도달하는 데 사용됩니다.

  1. 프로젝트의 디폴트 ThirdPersonExampleMap 에서 액터 배치(Place Actors) 패널로 가서 NavMeshBoundsVolume 을 검색하고 레벨로 드래그합니다.

    내비메시 바운드 볼륨 액터를 레벨로 드래그합니다

  2. NavMeshBoundsVolume 을 선택한 채 디테일(Details) 패널에서 볼륨의 스케일을 X = 20, Y = 20, Z = 5로 조절합니다. 아래와 같이 볼륨을 움직여서 플레이 영역 전체를 덮게 합니다.

    볼륨의 스케일을 X = 20, Y = 20, Z = 5로 조절합니다

    이제 볼륨이 플레이 영역 전체를 덮습니다

  3. 아웃라이너(World Outliner) 창에서 BP_ThirdPersonCharacter 블루프린트를 선택한 뒤 레벨에서 제거합니다.

    Third Person Character를 레벨에서 제거합니다

  4. 키보드로 P 를 누르면 레벨에서 내비게이션 메시를 시각화할 수 있습니다. 내비게이션 메시는 기본적으로 아래 이미지에서와 같이 녹색으로 시각화됩니다.

    언리얼 엔진은 내비메시 바운드 볼륨(Nav Mesh Bounds Volume) 액터가 레벨에 추가되거나 크기 조정되는 즉시 자동으로 내비게이션 메시를 생성합니다.

    P를 누르면 내비게이션 메시를 시각화할 수 있습니다

  5. 내비게이션 메시가 계단에서 비주얼 아티팩트를 일으키는 것이 보입니다. 내비게이션 메시는 레벨의 콜리전을 간소화해서 표현하기 때문입니다. 아웃라이너(Outliner) 창에서 RecastNavMesh-Default 액터를 선택한 뒤 디테일 (Details ) 패널로 이동합니다. 디스플레이(Display) 섹션으로 이동하여 오프셋 그리기(Draw Offset) 값을 50 으로 설정합니다. 그러면 내비게이션 메시가 그려진 곳에서 높이 오프셋이 조절되어 더 알아보기 쉽습니다.

    알아보기 쉽도록 드로 오프셋을 50으로 설정합니다

섹션 결과

이 섹션에서는 내비메시 바운드 볼륨 액터를 레벨에 추가하고 플레이 영역에 맞게 스케일을 조절했습니다. 또한 P를 눌러서 최종 내비게이션 메시를 시각화하는 방법을 알아보았습니다.

3 - 내비게이션 메시 시각화하기

이 섹션에서는 다양한 내비게이션 메시 세팅을 수정하는 방법과 레벨에서 메시를 시각화하는 방식을 변경하는 방법을 알아봅니다.

  1. 아웃라이너(Outliner) 에서 RecastNavMesh-Default 액터를 선택합니다.

    월드 아웃라이너에서 Recast Nav Mesh Actor Default를 선택합니다

  2. 액터를 선택한 상태로 디테일(Details) 패널을 아래로 스크롤하여 디스플레이(Display) 섹션으로 이동합니다. 여기에는 생성된 내비게이션 메시를 보다 잘 시각화하기 위한 여러 옵션이 있습니다. 아래 예시에서는 메시를 구성하는 폴리곤을 보기 위해 폴리 에지 그리기(Draw Poly Edge) 를 선택했습니다.

    메시를 구성하는 폴리곤을 보기 위해 폴리 에지 그리기를 선택합니다

  3. 타일 바운드 그리기(Draw Tile Bounds) 체크박스를 활성화하여 개별 내비게이션 타일(Navigation Tile)을 시각화할 수도 있습니다.

    타일 바운드 그리기를 활성화하여 내비게이션 타일을 시각화합니다

  4. 생성(Generation) 섹션의 옵션을 바꿔서 내비게이션 메시가 생성되는 방식을 수정할 수도 있습니다.

섹션 결과

이 섹션에서는 내비게이션 메시의 디스플레이 세팅을 변경하는 방법과 다양한 옵션을 조정하여 내비게이션 메시의 생성에 인플루언스를 주는 방법을 알아보았습니다.

4 - 첫 에이전트 생성하기

이 섹션에서는 간단한 에이전트를 생성하고 주변에서 랜덤 위치를 선택하여 이동하는 식으로 레벨에서 돌아다니게 하겠습니다. 이 에이전트는 목적지에 도착하면 몇 초 대기한 뒤 같은 프로세스를 반복할 것입니다.

  1. 콘텐츠 드로어(Content Drawer) 에서 우클릭하고 새 폴더(New Folder) 를 선택하여 새 폴더를 생성합니다. 폴더를 NavigationSystem 으로 명명합니다.

  2. 콘텐츠 드로어(Content Drawer) 에서 ThirdPersonBP > Blueprints 폴더로 이동하여 BP_ThirdPersonCharacter 블루프린트를 선택합니다. NavigationSystem 폴더로 드래그하고 여기에 복사(Copy Here) 옵션을 선택합니다.

    ThirdPersonCharacter 블루프린트를 NavigationSystem 폴더로 드래그하고 여기에 복사를 선택합니다

  3. NavigationSystem 폴더로 이동하여 블루프린트 이름을 BP_NPC_NavMesh 로 변경합니다. 블루프린트를 더블클릭하여 열고 이벤트 그래프(Event Graph) 로 이동합니다. 모든 입력 노드를 선택해서 지웁니다.

  4. 이벤트 그래프 를 우클릭한 뒤 커스텀 이벤트 추가(Add Custom Event) 를 검색하고 선택합니다. 이벤트를 MoveNPC 로 명명합니다.

    이벤트 그래프를 우클릭한 뒤 커스텀 이벤트 추가를 검색합니다

  5. 이벤트 그래프 를 우클릭한 뒤 Get Actor Location 을 검색하고 선택합니다.

    이벤트 그래프를 우클릭한 뒤 Get Actor Location을 검색하고 선택합니다

  6. GetActorLocation 노드에서 드래그하여 GetRandomReachablePointInRadius 를 검색하고 선택합니다. Radius 를 1,000유닛으로 설정합니다.

    GetActorLocation 노드에서 드래그하여 GetRandomReachablePointInRadius를 검색하고 선택합니다

  7. GetRandomReachablePointInRadius 노드의 Random Location 핀을 드래그하여 변수로 승격(Promote to variable) 을 선택합니다.

    GetRandomReachablePointInRadius 노드의 Random Location 핀을 드래그하여 변수로 승격을 선택합니다

  8. 방금 만든 RandomLocation 노드에 MoveNPC 노드를 연결합니다.

    RandomLocation 노드에 MoveNPC 노드를 연결합니다

  9. 이벤트 그래프(Event Graph) 를 우클릭한 뒤 AI MoveTo 를 검색하고 선택합니다. RandomLocation 노드를 AI MoveTo 노드에 연결합니다.

    이벤트 그래프를 우클릭한 뒤 AI MoveTo를 검색하고 선택합니다

  10. 이벤트 그래프 를 우클릭한 뒤 셀프 레퍼런스 가져오기(Get a reference to self) 를 검색하고 선택합니다.

    이벤트 그래프를 우클릭한 뒤 셀프 레퍼런스 가져오기를 검색하고 선택합니다.

  11. Self 노드를 AI MoveTo 노드의 Pawn 핀에 연결합니다. 아래와 같이 Random Location 노드의 노란색 핀을 AI MoveTo 노드의 Destination 핀에 연결합니다.

    Self 노드를 AI MoveTo 노드의 Pawn 핀에 연결합니다

  12. AI MoveTo 노드의 On Success 핀에서 드래그하여 Delay 를 검색하고 선택합니다. Delay 노드의 Duration4 로 설정합니다. 아래와 같이 Delay 노드의 Completed 핀에서 드래그하여 Move NPC 를 검색하고 선택합니다.

    AI MoveTo 노드의 On Success 핀에서 드래그하여 Delay 노드를 추가합니다. Duration을 0.4로 설정합니다. Delay 노드에서 드래그하여 MoveNPC 노드를 추가합니다

  13. 위 단계를 반복하여 AI MoveTo 노드의 On Fail 핀에도 노드를 추가합니다. Delay 노드의 Duration 을 0.1로 설정합니다.

    위 단계를 반복하여 AI MoveTo 노드의 On Fail 핀에도 노드를 추가합니다

  14. 이벤트 그래프 를 우클릭한 뒤 이벤트 BeginPlay 를 검색하고 선택합니다. BeginPlay 이벤트 노드에서 드래그하여 MoveNPC 를 검색하고 선택합니다.

    이벤트 그래프를 우클릭한 뒤 이벤트 BeginPlay를 검색하고 선택합니다

    BeginPlay 이벤트 노드에서 드래그하여 MoveNPC를 검색하고 선택합니다

  15. 블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다.

  16. BP_NPC_NavMesh 블루프린트를 레벨로 드래그하고 시뮬레이트(Simulate) 를 클릭합니다. 에이전트가 레벨에서 돌아다니는 것을 볼 수 있습니다.

    레벨에서 이동하는 에이전트

    레벨에서 이동하는 다수의 에이전트

섹션 결과

이 섹션에서는 내비게이션 메시(Navigation Mesh) 를 사용하여 레벨에서 돌아다니는 간단한 에이전트를 만드는 방법을 알아보았습니다.

태그