기존에는 큰 맵을 만들려면 개발자가 직접 맵을 서브 레벨로 나눈 다음, 레벨 스트리밍 시스템을 통해 플레이어가 랜드스케이프를 이동할 때 로딩, 언로딩해야 했습니다. 이 메서드로는 다수의 사용자가 파일을 공유할 때 종종 문제가 생겼고, 전체 월드의 컨텍스트를 파악하기가 어려웠습니다.
월드 파티션(World Partition)은 대규모 월드를 관리하기에 완벽한 솔루션인 자동 데이터 관리 및 거리 기반 레벨 스트리밍 시스템입니다. 그리드 셀로 나눠진 단일 퍼시스턴트 레벨에 월드를 저장함으로써 대규모 레벨을 서브 레벨로 나눠야 했던 기존 방식과 달리, 스트리밍 소스로부터 떨어진 거리에 따라 그리드 셀을 로드하거나 언로드하는 자동 스트리밍 시스템입니다.
월드 파티션은 다음 기능과 밀접한 관련이 있습니다.
월드 파티션 활성화하기
언리얼 엔진에서 월드 파티션을 활성화하는 방법에는 다음 세 가지가 있습니다.
게임 카테고리에 있는 템플릿에서 새 프로젝트 생성하기
오픈 월드 템플릿을 사용하여 새 레벨 생성하기
월드 파티션을 사용할 수 있도록 기존의 레벨 변환하기
게임 템플릿을 사용하여 프로젝트 생성하기
게임(Games) 카테고리에 있는 많은 프로젝트 템플릿에는 월드 파티션이 기본적으로 활성화되어 있습니다.
새 프로젝트를 생성할 때 복잡도를 줄이고 확장 가능한 솔루션을 제공하려는 경우, 월드 세팅(World Settings)에 있는 스트리밍 활성화(Enable Streaming) 옵션을 사용하여 그리드 셀 스트리밍을 활성화하거나 비활성화할 수 있습니다.
다음 템플릿에서는 월드 파티션을 사용하지만, 스트리밍 활성화(Enable Streaming)가 기본적으로 비활성화되어 있습니다.
기본
1인칭
3인칭
내려보기
고급 차량
오픈 월드 디폴트 맵 사용하기
오픈 월드 디폴트 맵 타입은 대규모 오픈 월드 맵을 만들기 위한 시발점으로 삼을 수 있도록 설계되었으며, 다음 기능이 디폴트로 활성화되어 있습니다.
월드 파티션
One File Per Actor
데이터 레이어
계층형 레벨 오브 디테일
맵에는 랜드스케이프 머티리얼이 포함된 2km×2km 크기의 샘플 랜드스케이프와 야외 환경을 위한 라이팅 설정이 포함되어 있습니다. 여기에는 스카이 애트머스피어, 스카이라이트, 디렉셔널 라이트, 익스포넨셜 하이트 포그, 볼류메트릭 클라우드가 포함됩니다.
프로젝트에 오픈 월드 디폴트 맵 타입을 사용하려면 다음 단계에 따릅니다.
파일(File) 메뉴를 열고 새 레벨(New Level)을 선택합니다.
오픈 월드(Open World) 맵 타입을 선택합니다.
만들기(Create) 버튼을 클릭하여 새 맵을 생성합니다.
월드 파티션을 사용할 수 있도록 기존의 레벨 변환하기
툴(Tools) > 레벨 변환(Convert Level) 메뉴 옵션을 사용하여 변환하거나 월드 파티션 변환(World Partition Convert) 커맨드릿을 사용하여 레벨에 월드 파티션을 추가할 수 있습니다.
월드 파티션 변환 커맨드릿을 사용하려면 다음 단계를 따르세요.
명령: UnrealEditor.exe QAGame -run=WorldPartitionConvertCommandlet Playground.umap -AllowCommandletRendering
기존 레벨을 월드 파티션으로 변환
Windows에서 명령 프롬프트 창을 엽니다.
프롬프트에서
UnrealEditor.exe
실행파일이 있는 위치로 이동합니다. 위의 예시에서는c:\Builds\Home_UE5_Engine\Engine\Binaries\Win64
입니다.다음으로 커맨드릿을 실행할 .exe 파일의 이름인
UnrealEditor.exe
로 명령어 작성을 시작합니다.프로젝트 이름을 추가합니다. 여기서는
QAGame
입니다.계속해서 실행할 커맨드릿의 이름인
-run=WorldPartitionConvertCommandlet
을 추가합니다.변환할 맵 파일의 이름을 추가합니다. 위의 예시에서는
Playground.umap
입니다.-AllowCommandletRendering
실행인자를 추가하여 명령을 완료합니다.Enter를 누르면 월드 파티션을 사용할 수 있도록 커맨드릿이 맵을 변환합니다.
다음과 같은 실행인자도 커맨드릿에 선택적으로 사용할 수 있습니다.
실행인자 옵션 | Description |
---|---|
-SCCProvider=(None,Perforce...) | 사용할 소스 컨트롤 제공자를 지정합니다. 소스 컨트롤을 사용하지 않고 실행하려면 |
-Verbose | 자세한 로깅을 표시합니다. |
-ConversionSuffix | 변환된 맵의 이름 끝에 _WP를 추가합니다. 테스트용으로 레벨을 변환하면서 소스 레벨은 그대로 유지할 때 유용합니다. |
-DeleteSourceLevels | 변환 후 소스 레벨을 삭제합니다. |
-ReportOnly | 변환 중에 발생할 일들을 보고합니다. 실제 변환은 하지 않습니다. |
-GenerateIni | 이 맵의 디폴트 |
-SkipStableGUIDValidation | 불안정한 액터 GUID 유효성 검사 프로세스를 건너뜁니다. 불안정한 액터 GUID가 있는 레벨을 여러 번 변환할 경우 변환 결과가 달라질 수 있습니다. 레벨을 다시 저장하면 이 문제가 해결됩니다. |
-OnlyMergeSubLevels | 월드 파티션을 사용하지 않고 레벨과 서브 레벨을 액터당 한 개의 파일로 변환하고 병합합니다. 변환된 레벨은 월드 파티션 레벨에서 레벨 인스턴스로 사용할 수 있습니다. |
-FoliageTypePath=[Path] | 폴리지 타입을 지정된 경로에 에셋으로 추출합니다. 레벨에 자체 폴리지 타입이 포함된 경우 이 옵션을 사용합니다. |
변환 세팅을 바꾸고 싶은 경우 커맨드릿과 함께 디폴트 .ini
변환 파일을 사용합니다. .ini
파일은 맵 파일과 같은 폴더에 있어야 하고, 파일명이 맵과 같지만 확장자가 .ini
여야 합니다. 예를 들어 FirstPersonExampleMap.umap
용으로 작성된 .ini
파일 이름은 FirstPersonExampleMap.ini
여야 합니다.
다음은 디폴트 .ini
변환 파일의 예시입니다.
[/Script/UnrealEd.WorldPartitionConvertCommandlet]
EditorHashClass=Class'/Script/Engine.WorldPartitionEditorSpatialHash
RuntimeHashClass=Class'/Script/Engine.WorldPartitionRuntimeSpatialHash
LevelsGridPlacement=(("/Game/Maps/Highrise_Audio", Bounds),("/Game/Maps/Highrise_Collisions_Temp", Bounds),("/Game/Maps/Highrise_Gameplay", Bounds),("/Game/Maps/Highrise_Lights", Bounds),("/Game/Maps/Highrise_Vista", AlwaysLoaded))
HLODLayerAssetsPath=
DefaultHLODLayerName=
[/Script/Engine.WorldPartitionEditorSpatialHash]
CellSize=51200
WorldImage=None
월드 파티션 사용하기
월드 파티션 시스템은 월드를 단일 퍼시스턴트 레벨 파일에 저장하고, 환경설정 가능한 런타임 그리드를 사용해 공간을 스트리밍 가능한 그리드 셀로 다시 나눔으로써 작동합니다. 이러한 셀은 플레이어 같은 스트리밍 소스의 존재로 인해 로딩, 언로딩됩니다. 엔진은 특정 시간에 플레이어가 보고 상호작용하는 부분만 로드합니다.
월드 파티션 내 액터
월드를 편집할 때 액터는 어디든 추가될 수 있고, 디테일(Details) 패널의 월드 파티션(World Partition) 섹션에 있는 공간적으로 로드되었는지 여부(Is Spatially Loaded) 세팅에 따라 그리드 셀에 자동으로 할당됩니다.
옵션 | Description |
---|---|
런타임 그리드 | 이 액터가 배치되는 파티션 그리드를 결정합니다. 없음(None)으로 지정한 경우 파티션 시스템이 그리드를 선택합니다. |
공간적으로 로드되었는지 여부 | 액터가 공간적으로 로드되는지 여부를 결정합니다.
|
'액터당 한 개의 파일' 기능을 사용하면 액터가 개별 파일에 저장되므로, 소스 컨트롤에서 레벨 파일을 체크아웃하고 월드 내 액터를 변경할 필요가 없습니다. 이 기능으로 다른 팀원도 레벨 파일을 이용할 수 있습니다.
액터당 한 개의 파일 시스템과 언리얼 엔진의 통합 소스 컨트롤에 대한 자세한 내용은 액터당 한 개의 파일 문서를 참조하세요.
레벨에서 다른 액터를 참조하는 액터는 하나로 묶여서 동시에 로딩될 것입니다.
스트리밍 소스
런타임의 그리드 내 그리드 셀의 스트리밍은 다음 두 가지 요소로 결정됩니다.
스트리밍 소스
런타임 그리드 세팅
첫 번째는 레벨 내 스트리밍 소스의 위치입니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
스트리밍 소스는 월드 내 위치를 결정하고, 주변 셀의 로딩을 유발하는 컴포넌트입니다. 플레이어 컨트롤러(Player Controllers)는 스트리밍 소스입니다. 월드 파티션 스트리밍 소스(World Partition Streaming Source) 컴포넌트를 사용하여 다른 스트리밍 소스를 월드에 추가할 수 있습니다. 예를 들어 스트리밍 소스 컴포넌트는 플레이어가 텔레포트할 위치에서 활성화되어 그곳의 셀을 로딩할 수 있습니다. 그리드 셀이 로딩되면 플레이어는 그 위치로 텔레포트하고 스트리밍 소스 컴포넌트가 비활성화됩니다. 플레이어의 이전 위치에는 이제 스트리밍 소스가 없으므로, 해당 그리드 셀은 언로딩됩니다.
플레이어를 스트리밍 소스로 사용하기
스트리밍 소스 활성화(Enable Streaming Source) 옵션을 선택하면 각 플레이어 컨트롤러가 월드 파티션 스트리밍 소스로 사용됩니다. 이 옵션은 디폴트로 활성화되어 있습니다.
월드 파티션 스트리밍 소스 컴포넌트 사용하기
월드 파티션 스트리밍은 월드 파티션 스트리밍 소스 컴포넌트로도 이뤄집니다.
이 컴포넌트에는 다음과 같은 옵션이 있습니다.
옵션 | Description |
---|---|
디폴트 시각화 툴 로딩 범위(Default Visualizer Loading Range) | 디버그 시각화 툴이 활성화되었을 때 나타나는 디버그 시각화 툴 그리드의 크기를 설정합니다. |
타깃 그리드(Target Grid) | 해당 소스의 영향을 받는 스트리밍 그리드를 설정합니다. |
디버그 컬러(Debug Color) | 디버깅에 사용되는 색상을 설정합니다. |
타깃 HLOD 레이어(Target HLOD Layer) | 스트리밍 소스의 영향을 받는 HLOD 레이어를 설정합니다. |
셰이프(Shapes) | 해당 스트리밍 소스의 커스텀 셰이프를 빌드하는 데 사용되는 셰이프 목록을 설정합니다. 비워 두면 그리드 로딩 범위와 동일한 반경의 구체를 사용합니다. |
우선순위(Priority) | 스트리밍 소스의 우선순위를 설정합니다. 그리드 셀이 여러 스트리밍 소스와 교차하는 경우, 그리드 셀의 우선순위가 모든 스트리밍 소스에 최우선하여 적용됩니다. |
스트리밍 소스 활성화됨(Streaming Source Enabled) | 해당 컴포넌트의 활성화 여부를 설정합니다. |
타깃 상태(Target State) | 교차하는 그리드 셀의 상태(로드됨(Loaded) 또는 활성화(Activated))를 설정합니다. 그리드 셀이 여러 스트리밍 소스와 교차하는 경우 타깃 상태 옵션이 최우선으로 적용됩니다('활성화'가 '로드'보다 우선합니다). |
블루프린트 함수 스트리밍 소스 활성화(Enable Streaming Source)와 스트리밍 소스 비활성화(Disable Streaming Source)는 이 컴포넌트를 사용하여 스트리밍을 활성화 및 비활성화합니다.
컴포넌트가 교차하는 그리드 셀의 스트리밍을 완료하면 블루프린트 함수 Is Streaming Completed가 'true'를 반환합니다.
런타임 그리드 세팅
런타임에 그리드 셀의 로딩 또는 언로딩 여부를 결정하는 두 번째 요소는 런타임 그리드의 세팅 자체입니다. 런타임 그리드 세팅은 월드 세팅(World Settings) 패널의 월드 파티션 세팅(World Partition Setu) 섹션에 있습니다.
2D 런타임 해시(Runtime Hash) 그리드가 기본적으로 제공됩니다. 두 가지 이상의 그리드를 사용하면 퍼포먼스에 악영향을 줄 수 있습니다.
2D 런타임 해시 그리드의 권장 설정 및 세팅에 대한 자세한 내용은 도시 샘플 프로젝트의 빅 시티(Big City) 맵을 참조하세요.
옵션 | Description |
---|---|
그리드 이름(Grid Name) | 런타임 그리드의 이름입니다. |
셀 크기(Cell Size) | 스트리밍 레벨을 생성하는 데 사용되는 그리드 셀의 크기를 설정합니다. 예시의 셀 크기(Cell Size)는 256m x 256m x 256m입니다. |
로딩 범위(Loading Range) | 셀이 로딩될 스트리밍 소스와의 거리 범위를 설정합니다. 위 이미지에서 로딩 범위는 스트리밍 소스로부터 반경 768미터까지입니다. |
느린 스트리밍 차단(Block on Slow Streaming) | 그리드 셀의 로딩 속도가 느린 경우 로딩을 중지합니다. |
우선순위(Priority) | 스트리밍 소스의 우선순위를 설정합니다. 그리드 셀이 여러 스트리밍 소스와 교차하는 경우, 그리드 셀의 우선순위가 모든 스트리밍 소스에 최우선하여 적용됩니다. |
디버그 컬러(Debug Color) | 프리뷰 그리드(Preview Grids)가 활성화되었을 때 표시되는 그리드 선의 색을 설정합니다. |
프리뷰 그리드(Preview Grids) | 활성화하면 뷰포트에 그리드 선이 표시됩니다. |
에디터에서 영역 로드 및 언로드하기
거대한 월드 개발을 지원하기 위해, 처음에는 월드가 언로드되어 있습니다. 레벨이 열리면, 에디터는 환경 배경과 매니저처럼 공간적으로 로드되었는지 여부(Is Spatially Loaded) 세팅이 false로 표시된 액터만 로드합니다. 그러면 에디터에 맵 전체를 로딩할 수 없는 거대 월드를 개발할 때 도움이 됩니다.
월드 파티션 창을 사용하여 영역 로드 및 언로드
월드 파티션 창에서 작업할 영역을 수동으로 선택할 수 있습니다. 메인 메뉴에서 창(Window) > 월드 파티션(World Partition) > 월드 파티션 에디터(World Partition Editor)를 선택하여 창을 엽니다.
창에서 영역을 클릭하여 드래그합니다. 선택한 영역을 우클릭하여 컨텍스트 메뉴를 열고 선택에서 영역 로드(Load Region from Selection)를 선택합니다.
위치 볼륨을 사용하여 영역 로드 및 언로드
위치 볼륨(Location Volumes)을 사용하여 영역을 로드 및 언로드할 수도 있습니다.
위치 볼륨은 레벨에 배치된 에디터 전용 볼륨으로 월드 파티션 창에서 맵의 영역을 나타냅니다.
레벨에 위치 볼륨을 추가하려면 다음 단계를 따릅니다.
아직 열려 있지 않은 경우 액터 배치(Place Actors) 창을 엽니다.
위치 볼륨(Location Volumes)을 검색합니다. 클릭하여 레벨로 드래그합니다.
레벨을 저장합니다.
레벨을 저장하면 월드 파티션 창에 위치 볼륨과 이름이 동일한 새 영역이 표시됩니다.
영역을 선택하고 우클릭하여 컨텍스트 메뉴를 엽니다. 선택된 영역 로드(Load Selected Region)를 클릭하여 영역을 로드합니다. 드래그하여 선택하거나 Ctrl을 누른 채로 여러 영역을 클릭하여 몇 군데의 영역을 동시에 로드 또는 언로드할 수 있습니다.
위치 볼륨에서는 다음 세팅이 지원됩니다.
브러시 세팅(Brush Settings)
세팅 | Description |
---|---|
셰이딩된 볼륨 표시(Display Shaded Volume) | 셰이딩 된 볼륨과 함께 브러시를 표시합니다. |
셰이딩된 볼륨 오파시티 값(Shaded Volume Opacity Value) | 0.0~1.0의 값을 사용하여 셰이딩된 볼륨의 오파시티를 설정합니다. |
브러시 세팅(Brush Settings) 섹션의 대다수 옵션은 선택한 브러시 셰이프(Brush Shape)에 따라 달라집니다.
월드 파티션(World Partition)
세팅 | Description |
---|---|
로드 및 언로드(Load and Unload) | 선택한 볼륨 내의 영역을 로드 및 언로드합니다. |
월드 파티션 창용 미니맵 생성하기
빌드(Build) 메뉴의 월드 파티션 섹션에 있는 미니맵 빌드(Build Minimap) 옵션을 사용하거나 월드 파티션 미니맵 빌더(World Partition Minimap Builder) 커맨드릿을 사용하여 미니맵을 생성하면 월드 파티션 창을 더 쉽게 탐색할 수 있습니다.
이 커맨드릿을 실행하면 월드 파티션 월드의 미니맵 이미지가 생성되어 월드 파티션 창에 배치됩니다.
미니맵을 빌드했는데 월드 파티션 창에 나타나지 않으면 프로젝트에서 버추얼 텍스처 지원을 활성화해야 합니다. 버추얼 텍스처를 활성화하려면 메인 메뉴에서 편집(Edit) > 프로젝트 세팅(Project Settings)으로 이동합니다. 그런 다음 버추얼 텍스처 지원 활성화(Enable virtual texture support) 체크박스를 선택하여 활성화합니다.
월드 파티션 창의 유용한 단축키 및 옵션
단축키 | Description |
---|---|
Shift+드래그 | 현재 런타임 그리드 크기로 선택을 스냅합니다. |
더블클릭 | 카메라를 모든 뷰포트의 위치로 이동합니다. |
Shift+더블클릭 | 클릭한 위치에서 PIE 세션을 시작합니다. |
Ctrl+더블클릭 | 클릭한 위치 주변의 영역을 로드합니다. |
마우스 휠 버튼+드래그 | 클릭한 지점에서 끝 지점까지의 거리를 언리얼 유닛으로 표시합니다. |
계층형 레벨 오브 디테일(HLOD) 생성하기
HLOD는 빌드 메뉴의 월드 파티션 섹션에 있는 빌드 HLOD 옵션을 사용하거나 월드 파티션 HLOD 빌더(World Partition HLODs Builder) 커맨드릿을 사용하여 생성할 수 있습니다.
이 커맨드릿을 실행하면 HLOD 레이어에서 지정한 생성 세팅에 따라 월드 파티션 셀의 HLOD 액터를 생성합니다. 월드 파티션에서 HLOD를 사용하는 방법과 월드 파티션 HLOD 빌더 커맨드릿을 사용하는 방법에 대한 자세한 내용은 월드 파티션 - HLOD 문서를 참조하세요.
월드 파티션 월드 쿠킹하기
월드 파티션 맵을 쿠킹하려면 쿠킹(Cook) 커맨드릿을 사용해야 합니다.
명령: UnrealEditor.exe QAGame -run=cook -targetplatform=WindowsNoEditor -Unversioned -map=Playground
월드 파티션 맵을 쿠킹하려면:
Windows에서 명령 프롬프트 창을 엽니다.
프롬프트에서
UnrealEditor.exe
실행파일이 있는 위치로 이동합니다.다음으로 커맨드릿을 실행할 .exe 파일의 이름인
UnrealEditor.exe
로 명령어 작성을 시작합니다.프로젝트 이름을 추가합니다. 여기서는
QAGame
입니다.계속해서 실행할 커맨드릿의 이름인
-run=cook
을 추가합니다.다음 실행인자를 사용하여 명령을 완료합니다.
-targetplatform=WindowsNoEditor
는 Windows 플랫폼용 프로젝트를 쿠킹합니다.-UnVersioned
는 쿠킹된 패키지 전부를 버전 없이 저장합니다. 이 인수를 사용하여 저장한 패키지는 로드했을 때 현재 버전으로 취급합니다.-map=Playground
는 맵의 이름을 지정하며, 이 경우에는Playground.umap
입니다.
쿠킹 커맨드릿 사용법에 대한 자세한 내용은 콘텐츠 쿠킹을 참조하세요.
블루프린트에서 월드 파티션 사용하기
월드 파티션 월드에서는 블루프린트 클래스와 레벨 블루프린트를 모두 지원합니다. 하지만 블루프린트 클래스가 선호되며, 레벨 블루프린트에 참조된 모든 액터는 항상 로딩됨으로 표시됩니다.
파티션된 월드 테스트하기
디버깅 및 런타임 오버라이드
런타임 중에 월드 파티션 월드를 디버깅하는 데 유용한 여러 가지 콘솔 명령이 있습니다.
콘솔 명령 | Description |
---|---|
wp.Runtime.ToggleDrawRuntimeHash2D | 월드 파티션 런타임 해시의 2D 디버그 디스플레이를 토글합니다. |
wp.Runtime.ToggleDrawRuntimeHash3D | 월드 파티션 런타임 해시의 3D 디버그 디스플레이를 토글합니다. |
wp.Runtime.ShowRuntimeSpatialHashGridLevel | 월드 파티션 런타임 해시를 보여줄 때 표시할 그리드 레벨을 선택합니다. |
wp.Runtime.ShowRuntimeSpatialHashGridLevelCount | 월드 파티션 런타임 해시를 보여줄 때 표시할 그리드 레벨 개수를 선택합니다. |
wp.Runtime.ShowRuntimeSpatialHashGridIndex | 월드 파티션 런타임 해시를 보여줄 때 특정 그리드를 보여줍니다. 무효한 인덱스는 모든 그리드를 보여줍니다. |
wp.Runtime.RuntimeSpatialHashCellToSourceAngleContributionToCellImportance | 스트리밍 소스에서 셀까지의 벡터와 소스의 포워드 벡터 사이의 각도를 셀 중요도 판단에 얼마나 반영할지 0~1 범위에서 조절합니다. 0에 가까울수록 각도가 셀 중요도에 기여하는 정도가 낮아집니다. |
wp.Runtime.OverrideRuntimeSpatialHashLoadingRange | 런타임 로딩 범위를 설정합니다. 다음 실행인자가 필요합니다.
|
wp.Runtime.MaxLoadingLevelStreamingCells | 동시에 로딩할 월드 파티션 스트리밍 셀의 수를 제한합니다. |
wp.Runtime.HLOD 0 |
|
월드 파티션 빌더 커맨드릿
월드 파티션에는 UWorldPartitionBuilderCommandlet 및 UWorldPartitionBuilder 베이스 클래스를 통해 빌더 커맨드릿 프레임워크가 추가됩니다.
이 커맨드릿은 배치 프로세스를 자동화하고 월드 파티션 레벨에서 데이터를 생성하거나 수정합니다. HLOD를 생성하거나, AI 내비게이션 데이터를 생성하거나, 다수의 액터를 다시 저장하는 등의 작업을 수행할 때도 거대 월드를 한 번에 전부 로드할 필요가 없습니다.
월드 파티션 빌더 커맨드릿 사용에 대한 자세한 내용은 월드 파티션 빌더 커맨드릿 레퍼런스를 참조하세요.