개요
이 문서에서는 언리얼 엔진의 월드 파티션(World Partition) 시스템으로 월드 파티션 처리된 내비게이션 메시(Navigation Mesh) 를 사용하는 방법을 간략히 알아봅니다.
월드 파티션(World Partition)은 대규모 월드를 관리하기에 완벽한 솔루션인 자동 데이터 관리 및 거리 기반 레벨 스트리밍 시스템입니다. 기존에 대규모 레벨을 서브레벨로 나누려면 그리드 셀로 나뉘는 단일 퍼시스턴트 레벨에 월드를 저장해야 했던 것과 달리, 자동 스트리밍 시스템인 월드 파티션은 스트리밍 소스와의 거리에 따라 셀을 로드, 언로드합니다.
시스템에 대한 추가 정보는 월드 파티션 문서를 참조하세요.
월드 파티션 처리된 내비게이션 메시
월드 파티션 내비메시는 다른 월드 파티션 처리된 리소스처럼 로드/언로드되는 여러 내비메시 청크 액터로 분할됩니다.
월드 파티션 내비메시는 월드 파티션 처리된 맵에서만 사용할 수 있습니다. 월드 파티션을 사용하도록 맵을 변환하는 방법은 월드 파티션 문서를 참고하세요.
또는 새 레벨을 생성하고 오픈 월드 템플릿을 선택해 월드 파티션 처리된 맵을 생성할 수도 있습니다.
런타임 생성
월드 파티션 내비게이션 메시는 사용 가능한 모든 생성 모드를 지원합니다. 스태틱(Static) , 다이내믹 모디파이어만(Dynamic Modifiers Only) , 다이내믹(Dynamic) 모드가 있습니다.
다이내믹 모드
다이내믹 생성 모드를 사용하면 내비메시 타일이 런타임에 생성됩니다. 그러나 베이스 내비메시의 일부면서 로드 및 언로드되는 오브젝트에 대해서는 내비게이션을 리빌드해야 할 필요성인 내비게이션 더티니스가 무시됩니다(아래 참고). 이를 통해 월드 로딩 및 언로딩으로 인한 과도한 더티니스를 방지합니다.
월드 파티션 다이내믹 내비메시를 사용할 때 다이내믹 타일 빌드는 로드된 스페이스로 제한됩니다.
베이스 내비게이션 메시 및 데이터 레이어
모든 런타임 내비게이션 생성 모드는 베이스 내비메시 를 사용합니다. 셀이 로드될 때 스트리밍을 통해 로드되는 첫 내비메시입니다.
스태틱 모드에서는 이 내비메시가 변경되지 않습니다. 다이내믹모드에서는 내비게이션과 관련된 스폰된 액터가 베이스 내비메시를 더티하게 만들고 내비게이션 타일의 리빌드를 트리거합니다.
베이스 내비메시에는 무엇이 포함되어 있나요?
데이터 레이어 외부의 내비게이션 관련 오브젝트는 베이스 내비메시에 포함되어 첫 내비메시에 구워집니다. 또한 에디터 데이터 레이어의 모든 오브젝트도 포함됩니다.
마지막으로, 런타임 데이터 레이어를 포함한 베이스 내비메시 데이터 레이어 목록의 모든 레이어는 베이스 내비메시에 포함되는 것으로 간주됩니다.
월드 파티션 데이터 레이어에 대해 더 자세히 알아보려면 데이터 레이어 문서를 참고하세요.
외부 패키징
월드 파티션 처리된 내비메시를 빌드할 때 내비게이션 데이터 액터(ANavigationData)는 외부 패키징됩니다. 이는 월드 파티션 처리된 내비메시 빌드가 메인 맵을 더티로 만들지 않는다는 의미입니다.
외부 패키징에 대한 자세한 정보는 액터당 한 개의 파일 문서를 참고하세요.
월드 파티션 처리된 내비게이션 메시 생성
1 - 필수 설정
-
게임(Games) 카테고리에 있는 템플릿으로 새 프로젝트를 생성합니다. 이 예시에서는 삼인칭(Third Person) 템플릿을 선택했습니다.
-
에디터에서 파일(File) > 새 레벨(New Level) 을 클릭합니다. Open World 맵 타입을 선택하고 생성(Create) 을 클릭합니다. 레벨을 저장합니다.
오픈 월드 디폴트 맵 타입은 대규모 오픈 월드 맵을 만들기 위한 출발점으로 사용할 수 있도록 설계되었으며, 다음 기능이 디폴트로 활성화되어 있습니다.
- 월드 파티션(World Partition)
- 액터당 한 개의 파일(One File Per Actor)
- 데이터 레이어(Data Layers)
- HLOD(Hierarchical Levels of Detail)
-
월드 세팅(World Settings) 창으로 이동하여 월드 파티션(World Partition) 섹션으로 내려갑니다.
-
런타임 세팅(Runtime Settings) > 그리드(Grids) > 인덱스 0 을 펼칩니다.
-
로딩 범위(Loading Range) 값을 12800 으로 변경합니다. 값이 작으면 내비게이션 메시가 월드 파티션으로 로드될 때 시각화하기가 더 쉽습니다.
-
섹션 결과
이 섹션에서는 새 프로젝트와 월드 파티션을 사용하도록 설정된 레벨을 생성했습니다. 다음 섹션에서는 내비게이션 메시가 월드 파티션과 함께 작동하도록 구성하겠습니다.
2 - 월드 파티션을 사용할 내비게이션 메시 구성을 사용할지 정합니다.
-
세팅(Settings) > 프로젝트 세팅(Project Settings) 을 클릭하여 프로젝트 세팅 창을 엽니다.
-
내비게이션 메시(Navigation Mesh) 카테고리를 클릭하고 런타임(Runtime) 섹션으로 내려갑니다. 런타임 생성(Runtime Generation) 드롭다운을 클릭하고 Static 을 선택합니다.
-
프로젝트가 대형 월드로 구성된다면, 생성(Generation) 섹션으로 이동해 고정 타일 풀 크기(Fixed Tile Pool Size) 체크박스를 활성화하고 타일 풀 크기(Tile Pool Size) 를 조절해 메모리 활용을 제한할 수 있습니다. 풀 크기 설정은 내비게이션 메시가 활용하는 메모리 크기를 제한합니다.
풀의 타일 수는 다음을 추가할 수 있을 만큼 충분해야 합니다. 런타임에 로딩 버블의 내비메시 액터를 로드하는 데 필요한 최대 타일 수 월드 파티션 처리된 맵의 일부를 로드할 때 에디터에서 시각화하려는 최대 타일 수
-
추가(+) > 볼륨(Volumes) > NavMeshBoundsVolume 을 클릭하여 내비게이션 메시(Navigation Mesh) 볼륨 액터를 레벨에 추가합니다.
-
아웃라이너(Outliner) 창에서 NavMeshBoundsVolume 액터를 선택하고 디테일(Details) 패널로 이동합니다.
-
액터가 레벨 내의 플레이 가능 공간을 모두 덮도록 스케일(Scale)을 조절합니다.
-
P 를 눌러 내비게이션이 빌드되는 것을 뷰포트에서 확인합니다.
-
-
아웃라이너(Outliner) 창에서 RecastNavMesh-Default 액터를 선택하고 디테일(Details) 패널로 이동합니다. 생성(Generation) 섹션으로 내려가 월드 파티션 처리된 내비메시 여부(Is World Partitioned Navmesh) 체크박스를 활성화 합니다.
섹션 결과
이 섹션에서는 내비게이션 메시 바운드 볼륨을 레벨에 추가했습니다. 월드 파티션과 함께 작동할 내비게이션 메시도 구성했습니다.
다음 섹션에서는 워크플로를 개선하기 위해 에디터를 환경설정하겠습니다.
3 - 에디터 환경설정
아주 큰 레벨에서 작업할 것이므로, 워크플로를 개선하기 위해 자동 내비게이션 메시 생성을 비활성화하는 것이 좋습니다.
그렇게 하려면 다음 단계를 따릅니다.
-
편집(Edit) > 에디터 개인설정(Editor Preferences) 을 클릭하여 에디터 개인설정(Editor Preferences) 창을 엽니다.
-
레벨 에디터(Level Editor) 섹션으로 내려가 기타(Miscellaneous) 카테고리를 클릭합니다. 편집(Editing) 카테고리에서 내비게이션 자동 업데이트(Update Navigation Automatically) 체크박스를 비활성화합니다.
섹션 결과
이 섹션에서는 내비게이션 메시가 자동으로 업데이트되지 않도록 환경설정했습니다. 이렇게 하면 월드 파티션을 사용하여 대규모 월드를 작업할 때 일반적으로 워크플로가 개선됩니다.
다음 섹션에서는 레벨에 내비게이션 메시를 빌드하겠습니다.
4 - 내비게이션 메시 빌드
월드 파티션 처리된 맵으로 작업할 때 보통 일부 에셋은 로드되지만, 일부는 언로드됩니다. 그래서 전체 내비게이션 메시를 빌드하려면 다른 프로세스가 필요합니다.
레벨에 내비게이션 메시를 빌드하려면 다음 단계를 따릅니다.
-
명령줄에 다음 콘솔 명령을 입력하고 Enter 를 누릅니다. n.bNavmeshAllowPartitionedBuildingFromEditor 1
-
빌드(Build) > 빌드 경로(Build Paths) 를 클릭하여 레벨에 내비게이션 메시를 빌드합니다.
-
내비게이션 빌드 세팅(Build Navigation Settings) 창에서 확인(Ok) 을 클릭하여 내비게이션 메시를 빌드합니다. 다음과 같은 옵션도 사용할 수 있습니다.
-
상세(Verbose) - 더욱 자세한 빌드 프로세스 로그를 확인하려면 이 체크박스를 활성화합니다. 출력 로그는 프로젝트의 Saved > Logs 디렉터리에서 WPNavigationBuilderLog.txt 라는 이름으로 찾을 수 있습니다.
-
패키지 정리(Clean Packages) - 월드 파티션 처리된 내비메시 액터 패키지를 프로젝트에서 모두 제거하려면 활성화합니다. 이 옵션은 내비게이션을 빌드하지 않습니다.
-
-
아웃라이너(Outliner) 창으로 이동하면 4개의 NavDataChunkActor 가 있습니다. 이 액터에는 월드 파티션으로 로드 및 언로드된 내비게이션 데이터가 있습니다. 생성되는 NavDataChunkActor의 수는 데이터 청크 그리드의 크기에 따라 달라집니다. 자세한 내용은 섹션 6을 참조하세요.
섹션 결과
이 섹션에서는 레벨에 내비게이션을 빌드하는 방법을 알아보았습니다. 또한 내비게이션 세팅 옵션을 살펴보고 레벨에서 NavDataChunkActor가 어떻게 생성되는지 알아보았습니다.
다음 섹션에서는 에디터 밖에서 내비게이션을 빌드하는 방법을 알아봅니다.
5 - 월드 파티션 내비게이션 데이터 빌더로 내비게이션 메시 빌드하기
월드 파티션 빌더 커맨드릿(WorldPartitionBuilderCommandlet) 과 월드 파티션 내비게이션 데이터 빌더(WorldPartitionNavigationDataBuilder) 를 사용하여 에디터 밖에서 월드 파티션 처리된 스태틱 내비게이션 메시를 빌드할 수도 있습니다.
그 방법을 알아보려면 월드 파티션 문서의 월드 파티션 내비게이션 데이터 빌더(World Partition Navigation Data Builder) 섹션의 지시를 따르세요.
6 - 내비게이션 메시를 위한 추가 세팅
-
월드 세팅(World Settings) 창에서 내비게이션(Navigation) 섹션으로 내려가면 레벨에 대한 내비게이션 메시(Navigation Mesh) 세팅이 있습니다.
옵션은 다음과 같습니다.
세팅 설명 내비게이션 데이터 청크 그리드 크기(Navigation Data Chunk Grid Size) 각 월드 파티션 셀에 로드되는 데이터 청크 액터의 크기를 정의합니다. 숫자가 적을수록 데이터가 더 상세해집니다. 내비게이션 데이터 빌더 로딩 셀 크기(Navigation Data Builder Loading Cell Size) 내비게이션 데이터를 메모리에 로드하는 데 사용되는 로딩 셀의 크기를 정의합니다. 내비게이션 데이터 청크 그리드 크기 를 25600 으로 설정합니다. 이렇게 낮은 값으로 설정하면 내비게이션 메시가 월드 파티션으로 로드 및 언로드되는 모습이 더 잘 표시됩니다. 이 값은 게임플레이 요구 사항, 로딩 범위, 필요한 세분화 정도에 따라 조정해야 합니다.
-
빌드(Build) > 빌드 경로(Build Paths) 를 클릭하여 레벨에 내비게이션 메시를 빌드합니다.
-
아웃라이너(Outliner) 창으로 이동하면 레벨에 NavDataChunkActor 가 더 많아진 것을 볼 수 있습니다. 청크 그리드 크기가 줄어들었기 때문에 예상된 결과입니다.
섹션 결과
이 섹션에서는 내비게이션 데이터 청크 그리드 크기를 변경하는 방법과 이 변경이 레벨에서 생성되는 NavDataChunkActor의 수에 미치는 영향을 알아보았습니다.
다음 섹션에서는 플레이어가 레벨에서 이동할 때 내비게이션 메시가 로드 및 언로드되는 방식을 알아봅니다.
7- 월드 파티션 세팅
내비게이션 메시 세팅과 함께 다음 월드 파티션 세팅도 사용해 맵을 설정할 수 있습니다.
명령 | 설명 |
---|---|
wp.Runtime.RuntimeSpatialHashPlacePartitionActorsUsingLocation = 0 | 0으로 설정된 경우 파티션 액터가 로드되어야 할지 여부를 확인할 때 자신의 위치 대신 바운드를 사용합니다. 작은 로딩 반경을 가진 대형 랜드스케이프 타일을 사용할 때 유용할 수 있습니다. |
s.ForceGCAfterLevelStreamedOut = 1 | 레벨이 스트림 아웃된 후 가비지 컬렉션을 강제하는 설정입니다. 월드 파티션에 의해 언로드된 내비게이션 액터를 제거합니다. 설정하지 않으면 언로드된 액터가 수거되는 데 시간이 걸릴 수 있습니다. |
8 - 결과 보기
다음 단계를 따르면 내비게이션 메시가 월드 파티션 셀에서 로드 및 언로드되는 모습을 확인할 수 있습니다.
-
명령줄에 다음과 같은 내비게이션 메시 게임플레이 디버거 콘솔 명령을 입력하고 Enter 를 누릅니다.
-
ai.debug.nav.RefreshInterval 0.3
-
ai.debug.nav.DisplaySize 100
이 명령들은 디스플레이 크기와 내비게이션 메시의 시각화가 업데이트되는 빈도를 조정합니다.
-
-
플레이(Play) 를 눌러 게임을 시작합니다. 물결표(~) 를 눌러 명령줄을 열고 다음 월드 파티션 디버그 명령을 입력합니다.
-
wp.Runtime.ToggleDrawRuntimeHash2D
-
wp.Runtime.ShowRuntimeSpatialHashGridLevel 2
이 명령은 플레이어 주변에 어떤 월드 파티션 셀이 로드되는지 표시합니다.
-
-
작은따옴표(') 를 눌러 게임플레이 디버거(Gameplay Debugger) 를 활성화하고, 숫자 0 을 눌러 내비게이션(Navigation) 뷰로 전환합니다. 이제 플레이어 주변에 내비게이션 메시가 로드되는 것을 볼 수 있습니다.
-
레벨에서 돌아다니면서 플레이어 주변에 각 월드 파티션 셀이 로드될 때 내비게이션 메시가 어떻게 로드되는지 살펴봅니다.
섹션 결과
이 섹션에서는 내비게이션 메시가 월드 파티션으로 로드 및 언로드되는 모습을 시각화하는 방법을 알아보았습니다.