以往制作者在制作大型地图时,需要手动将其分为多个子关卡,然后在玩家探索地图时使用关卡流送系统加载卸载不同的子关卡。这样的方法往往导致多用户共用文件的问题,并且使得制作者难以同时审视整个地图。
世界分区是一种自动数据管理和基于距离进行加载的关卡流送系统,它针对大型世界管理提供了一个完整的解决方案。这个系统将整个世界划分为网格单元,保存在一个固定的关卡,使制作者不再需要划分繁冗的子关卡,并提供一个自动流送系统,基于与流送源之间的距离来加载和卸载这些网格。
世界分区常常与以下功能搭配使用:
启用世界分区
在虚幻引擎中启用世界分区的三种方法:
- 使用 游戏(Games) 类目下的模板创建新项目。
- 使用开放世界(Open World)模板创建新关卡。
- 转化已有的关卡来使用世界分区。
使用游戏模板创建你的项目
由 游戏(Games) 类目下的大部分模板创建新项目时,世界分区将默认启用。
为了简化并提供可拓展的解决方案,网格流送可以在 世界设置(World Settings) 中的 启用流送(Enable Streaming) 设置中选择启用或者禁用。
以下模板使用世界分区,但是 启用流送(Enable Streaming) 选项默认禁用:
- 空白(Blank)
- 第一人称(First Person)
- 第三人称(Third Person)
- 俯视角(Top Down)
- 高级载具(Vehicle Advanced)
使用开放世界(Open World)默认地图
默认的开放世界(Open World)地图被设计为创建大型开放世界地图的起始参考,并且默认启用以下功能:
- 世界分区(World Partition)
- 一Actor一文件(One File Per Actor)
- 数据层(Data Layers)
- HLOD (Hierarchical Levels of Detail)
该地图包括一个示例2 km x 2 km的地形,采用户外环境的材质和光影设定。包括天空大气系统、天空光照、定向光源、数型高度雾、体积云。
在你的项目中使用默认的开放世界(Open World)类型地图:
- 在 文件(File) 菜单中选择 新关卡(New Level)。
- 选择 开放世界(Open World) 地图类型。
- 点击 创建(Create) 按钮创建新地图。
转化已有的关卡来使用世界分区
你可以通过 工具(Tools)> 转化关卡(Convert Level) 选项向任何关卡中添加世界分区,或者使用世界分区转化命令行(World Partition Convert Commandlet)。
通过以下步骤使用世界分区转化命令行(World Partition Convert Commandlet):
指令:UnrealEditor.exe QAGame -run=WorldPartitionConvertCommandlet Playground.umap -AllowCommandletRendering
转化已有的关卡来使用世界分区
-
在Windows系统中打开一个命令提示符窗口。
-
首先找到
UnrealEditor.exe
可执行文件的位置。比如在以上示例中:c:\Builds\Home_UE5_Engine\Engine\Binaries\Win64
。 - 接下来,开始输入指令,由运行命令行的可执行文件名开始,
UnrealEditor.exe
。 -
继续输入指令,加上项目的名称。此处示例中为
QAGame
。 - 输入将要运行的命令行的名称,
-run=WorldPartitionConversionCommandlet
。 - 加入将要转化的地图文件名。在以上示例中为
Playground.umap
。 -
最终加上附加参数
-AllowCommandletRendering
。 - 指令输入完成后按下 回车(Enter) 键,命令行会转化地图使其启用世界分区。
命令行中还可以加入以下参数:
参数 | 描述 |
---|---|
-SCCProvider=(None,Perforce...) | 指定使用源控制提供者。若要不带源控制运行,输入-SCCProvider=None 。 |
-Verbose | 显示详细日志记录 |
-ConversionSuffix | 在转化后的地图名后面添加_WP后缀。这在测试时很有用,避免更改源关卡。 |
-DeleteSourceLevels | 在转化后删除源关卡。 |
-ReportOnly | 只显示转化时会发生的事情,而不实际执行转化。 |
-GenerateIni | 针对此地图生成一个默认 .ini 转化文件,而不实际执行转化。 |
-SkipStableGUIDValidation | 跳过不稳定Actor GUIDs的验证过程。带有不稳定Actor GUIDs的关卡在多次转化时会产生不同的输出结果。重新保存关卡可以解决该问题。 |
-OnlyMergeSubLevels | 不使用世界分区转化合并关卡和子关卡至一Actor一文件。转化后的关卡可以在使用世界分区的关卡中作为关卡实例。 |
-FoliageTypePath=[Path] | 将植被类型作为资产提取到指定路径。若关卡包含嵌入的植被类型,使用此参数。 |
如果想要更改转换设置,在命令行中使用一个默认的 .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
WorldImageTopLeftW=(X=0.000000,Y=0.000000)
WorldImageBottomRightW=(X=0.000000,Y=0.000000)
[/Script/Engine.WorldPartitionRuntimeSpatialHash]
Grids=(GridName="MainGrid",CellSize=3200,LoadingRange=25600.000000,DebugColor=(R=0.500000,G=0.500000,B=0.500000,A=1.000000))
使用世界分区
世界分区系统将创建的世界储存在一个固定的关卡中,并且使用可配置的运行时网格(Runtime Grid)将空间划分为可流送的网格单元。 这些网格单元在运行时由流送源(比如玩家)控制加载和卸载。这样一来,虚幻引擎只加载关卡中玩家能看到并与之互动的部分。
世界分区中的Actor
编辑世界时,Actor可以加入到任何地点,并且会基于它们的 是否空间加载(Is Spatially Loaded) 设置被自动分配至一个网格单元。该选项位于Actor的 细节(Details) 面板中的 世界分区(World Partition) 部分。
设置 | 描述 |
---|---|
运行时网格(Runtime Grid) | 判定Actor被放置在哪一个分区网格。如果选为 无(None) ,网格将会由分区系统决定。 |
是否空间加载(Is Spatially Loaded) | 判定Actor是否为空间加载:
|
由于一Actor一文件系统中,Actor都储存在各自独立的文件中,你不必从源控制中打开关卡文件来更改世界中的Actor。这样你在编辑Actor时,团队的其他成员仍然可以使用关卡文件。
更多有关一Actor一文件系统和虚幻引擎的集成源控制,参考 一Actor一文件 文档.
关卡中引用其他Actor的Actor将会被捆绑并且同时加载。
流送源
运行时网格中单元的流送由两个因素判定:
- 流送源
- 运行时网格设定
前者为关卡中流送源的位置。

流送源组件在世界中确定一个位置并且触发其周围网格单元的加载。玩家的控制器便是一种流送源。使用 世界分区流送源(World Partition Streaming Source) 组件也可以添加其他的流送源。比如,如果玩家要传送至某个位置,此处的流送源组件便会启动,这样可以加载其周围的网格单元。当网格单元加载完毕,玩家到达此位置,该流送源组件便会停用。玩家原本所在位置已经没有流送源,所以那里的网格单元会从内存中卸载。
将玩家作为流送源
选择 启用流送源(Enable Streaming Source) 选项,每一个玩家控制器都会被用作世界分区中的流送源。该选项默认启用:
使用世界分区流送源组件
世界分区流送也是通过世界分区流送源组件完成的。
该组件有以下选项。
选项 | 说明 |
---|---|
默认可视化器加载范围(Default Visualizer Loading Range) | 可视化器启用时,调试可视化器网格的大小。 |
目标网格(Target Grid) | 受此源影响的流送网格。 |
调试颜色(Debug Color) | 调试时使用的颜色。 |
目标HLOD层(Target HLOD Layer) | 受流送源影响的HLOD层。 |
形状(Shapes) | 用于为此流送源构件自定义形状的形状列表。如果为空,将使用半径等于网格加载范围的球体。 |
优先级(Priority) | 流送源的优先级。如果一个网格单元与多个流送源相交,其优先级将是所有流送源中的最高优先级。 |
流送源已启用(Streaming Source Enabled) | 组件是否启用。 |
目标状态(Target State) | 确定相交的网格单元应处于哪种状态(已加载或已激活)。如果一个网格单元与多个流送源相交,目标状态(目标状态)将是最高的目标数值(激活的大于加载的)。 |
蓝图函数 启用流送源(Enable Streaming Source) 和 禁用流送源(Disable Streaming Source) 用于启用和禁用该组件的流送。
当组件流送完与之相交的所有网格单元后,蓝图函数 流送完成(Is Streaming Completed) 会返回真。
运行时网格设置
决定网格单元在运行时是否加载/卸载的第二个因素是运行时网格本身的设置。运行时网格设置位于 世界设置 面板中的 世界分区设置(World Partition Setup) 部分。
系统会默认提供一个 2D运行时哈希(2D Runtime Hash) 网格。超过一个网格时,可能会降低运行性能。
关于2D运行时哈希网格的推荐设置和更多详情,请参阅城市示例中的 Big City 地图。
选项 | 说明 |
---|---|
网格名称(Grid Name) | 包含运行时网格的名称。 |
单元大小(Cell Size) | 确定用于生成流式水平的网格单元的大小。在这个例子中,单元大小 是256平方米。 |
加载范围(Loading Range) | 流送源周围多少范围内的单元需要加载。在上图中,加载范围 是流送源周围的768米半径。 |
阻塞缓慢流送(Block on Slow Streaming) | 在网格单元加载速度不够快的情况下阻塞加载。 |
优先级(Priority) | 设置流送源的优先级。如果一个网格单元与多个流送源相交,其优先级将是所有流送源中的最高优先级。 |
调试颜色(Debug Color) | 启用 预览网格 后显示的网格线框的颜色。 |
预览网格(Preview Grids) | 启用后在视口中显示网格线框。 |
在编辑器中加载和卸载网格单元
为了便于开发大型世界,世界初始都是卸载状态。关卡打开后,编辑器只会加载那些将其 空间化加载(Is Spatially Loaded) 设置标记为 False 的Actor,例如场景背景和管理类。这有助于开发大型世界,因为这类场景通常无法在编辑器中同时加载整个地图。
使用世界分区窗口加载和卸载区域
在"世界分区"窗口中,你可以手动选择要在哪些网格单元中工作。在主菜单中选择 窗口 > 世界分区 来打开该窗口。
在窗口中,点击并拖动网格单元来选中它们。然后,右键单击所选内容,打开上下文菜单,加载和卸载单元格。
使用位置体积加载和卸载区域
区域也可以通过 位置体积(Location Volume) 来加载和卸载。
位置体积是编辑器专用体积,可以被放置在关卡中,在世界分区窗口中表示地图的一个区域。
要将位置体积添加到关卡,请执行以下操作:
- 如果没有打开 放置Actor(Place Actors) 窗口,则现将其打开。
- 搜索 Location Volume。点击它并将其拖放到关卡中。
- 保存关卡。
保存过关卡后,世界分区窗口中将出现一个与位置体积同名的新区域。
选中该区域,右键点击打开快捷菜单。点击 加载所选区域(Load Selected Region) 以加载区域。拖动选择或Ctrl+点击多个区域可以一次性加载或卸载多个区域。
位置体积支持以下设置:
笔刷设置(Brush Settings)
设置 | 说明 |
---|---|
显示着色体积(Display Shaded Volume) | 显示带着色体积的笔刷。 |
着色体积不透明度值(Shaded Volume Opacity Value) | 使用0.0-1.0之间的值设置着色体积的不透明度。 |
笔刷设置 分段的许多选项都取决于你所选的 笔刷形状(Brush Shape)。
世界分区(World Partition)
设置 | 说明 |
---|---|
加载/卸载(Load and Unload) | 加载/卸载所选体积内的区域。 |
为世界分区窗口生成小地图
你可以使用 构建(Build) 菜单的世界分区部分中的 构建小地图(Build Minimap) 选项,或者使用构建器命令来生成小地图,以便在世界分区窗口中更容易导航。
运行这个命令可以为世界分区世界创建一个小地图,并将其放在世界分区窗口中。
如果你生成了小地图,但没有出现在世界分区窗口中,你需要在项目中启用虚拟纹理支持。要启用虚拟纹理,请在主菜单中点击 编辑(Edit) > 项目设置(Project Settings)。然后勾选 启用虚拟纹理支持(Enable virtual texture support) 复选框。
世界分区窗口中的实用快捷键与选项
快捷键 | 描述 |
---|---|
Shift+拖曳 | 将所选对象与当前运行时网格大小对齐。 |
双击 | 将所有视口中摄像机移动到该位置。 |
Shift+双击 | 在点击位置发起PIE会话。 |
Ctrl+双击 | 加载点击位置周围的区域。 |
MMB+拖曳 | 显示从点击起始点到末端的距离(以虚幻单位计)。 |
生成HLOD
生成HLOD需要用到构建菜单世界分区分段中的构建HLOD选项,或使用世界分区HLOD构建器(World Partition HLODs Builder)命令来生成。
运行该命令会根据你在HLOD层中指定的生成设置,为你的世界分区单元创建HLOD Actor。 关于在世界分区中使用HLOD和世界分区HLOD构建命令的更多信息,请参见世界分区-HLOD文档。
烘焙世界分区世界
烘焙世界分区地图需要用到烘焙命令:
命令: 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
。
关于使用烘焙命令的更多信息,请参见内容烘焙。
使用世界分区与蓝图
在"世界分区"世界中,蓝图类和关卡蓝图都受到支持。不过首选是蓝图类,因为在关卡蓝图中引用的Actor都会被标记为始终加载。
测试分区世界
调试和运行时覆盖
系统提供了一些控制台命令,用于在运行时调试世界分区世界。
控制台命令 | 说明 |
---|---|
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 | 使用 wp.Runtime.HLOD 显示没有HLOD的世界。 |
世界分区构建器命令
世界分区通过 UWorldPartitionBuilderCommandlet 和 UWorldPartitionBuilder 基类引入了一个构建器命令框架。
这些命令用于完成自动化批处理,以及生成/修改世界分区中的数据。大型世界不必一次性全部加载,就能完成HLOD、AI导航数据的生成,或重新保存大量Actor等。
世界分区HLOD构建器
HLOD通过 世界分区HLODs构建器 命令生成的。根据你在HLOD层中指定的生成设置,运行这个小命令为你的世界分区单元创建HLOD角色。
命令: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -builder=WorldPartitionHLODsBuilder
关于在世界分区中使用HLOD和使用WorldPartitionHLODsBuilder命令的更多信息,请参见世界分区-HLOD。
世界分区小地图构建器
世界分区小地图构建器(World Partition MiniMap Builder) 命令可以生成或更新显示在世界分区编辑器窗口中的小地图。
命令: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -builder=WorldPartitionMiniMapBuilder
世界分区重命名复制构建器
世界分区重命名复制构建器(World Partition Rename Duplicate Builder) 命令可以自动重命名或复制现有的世界分区关卡及其所有Actor。
命令:UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -SCCProvider=None -builder=WorldPartitionRenameDuplicateBuilder -NewPackage=/Game/ThirdPersonBP/Maps/NewPackage
该命令会为 OpenWorldTest 地图创建一个名为 NewPackage 的世界分区关卡副本,而不会改动原始地图。
如需重新命名你的世界分区地图而不是创建副本,请添加 -Rename
参数。
世界分区重新保存Actor构建器
世界分区重新保存Actor构建器(World Partition Resave Actors Builder) 命令可以重新保存世界分区关卡中的所有Actor,它还支持类型筛选,以便只重新保存部分的Actor。
命令:UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -SCCProvider=None -builder=WorldPartitionResaveActorsBuilder
在执行上面这段命令后,OpenWorldTest中所有的Actor都会被重新保存。
你可以使用 -ActorClass
参数,只保存某一类的Actor。例如,添加 -ActorClass=StaticMeshActor
会只重新保存指定关卡中的静态网格体Actor。
世界分区植被构建器
在世界分区地图中,默认的实例化植被网格大小为256米。世界分区植被构建器(World Partition Foliage Builder) 命令可以改变当前的世界分区关卡中的实例化植被网格大小。
命令: UnrealEditor.exe QAGame Playground.umap -run=WorldPartitionBuilderCommandlet -Builder=WorldPartitionFoliageBuilder -NewGridSize=Value
关于使用世界分区的植被模式的更多信息,请参阅植被模式。
世界分区导航数据构建器
世界分区导航数据构建器(World Partition Navigation Data Builder) 命令可以重新生成世界分区关卡的寻路系统。
命令: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -builder=WorldPartitionNavigationDataBuilder -SCCProvider=None
该命令接受以下参数;
可选参数 | 说明 |
---|---|
-SCCProvider | 指定要使用的源码控制提供方。如需在没有源码控制的情况下运行,请使用 -SCCProvider=None 。 |
-Verbose | 显示Verbose日志记录。 |
-Log | 将日志输出到一个指定文件。 |
-CleanPackages | 擦除所有的寻路数据包,而不是构建它们。 |
世界分区智能对象集合构建器
世界分区智能对象集合构建器命令(World Partition Smart Object Collection Builder)可以基于世界分区关卡中的所有智能对象组件,重建智能对象集合。
命令: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -builder=WorldPartitionSmartObjectCollectionBuilder
在执行上面的命令时,OpenWorldTest关卡中的所有智能对象集合都会被重新构建。你可以使用 -SCCProvider
这个参数来指定使用哪个版本控制提供者。
世界分区PCG构建器
世界分区PCG构建器(World Partition PCG Builder) 命令完全加载关卡,等待异步进程完成,例如静态网格体构建,然后在匹配的PCG组件上安排生成。所有生成完成后,进程会保存世界分区关卡并退出。
命令行: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -Builder=PCGWorldPartitionBuilder -IncludeGraphNames=PCG_GraphA;PCG_GraphB
控制台命令: pcg.BuildComponents -IncludeGraphNames=PCG_GraphA;PCG_GraphB
此命令接受以下参数:
可选参数 | 说明 |
---|---|
-IncludeGraphNames | 在生成中包括图表名称的列表,以 ; 分隔。如果提供,系统将安排分配有第一个图表的所有PCG组件的生成,然后是分配有第二个图表的组件,以此类推。如果省略,则PCG组件不会按图表筛选。 |
-GenerateComponentEditingModeNormal | 生成编辑模式为 正常(Normal) 的组件。默认情况下,仅生成使用编辑模式 加载为预览(Load As Preview) 保存的组件。 |
-GenerateComponentEditingModePreview | 生成编辑模式为 预览(Preview) 的组件。默认情况下,仅生成使用编辑模式 加载为预览(Load As Preview) 保存的组件。 |
-IgnoreGenerationErrors | 将结果提交到源码控制,忽略错误(但错误仍会报告,并且作业状态仍将为失败(Failed))。这可以在有错误的情况下使作业保持在线,但应该谨慎使用。默认情况下,组件正包含成时发生的错误将向构建器注册,并将使构建作业失败,并且结果不会提交。 |
-IncludeActorIDs | 包括以 ; 分隔的唯一Actor ID的列表。如果提供,将仅生成匹配的Actor上的PCG组件。尤其适合用于调试单个组件/Actor。 |
-OneComponentAtATime | 安排一次生成一个组件,并在每个生成完成后再安排新组件。调试时很有用,可确保异步进程不会彼此干扰。 |
-Unattended | 避免初始化编辑器UI,改为在控制台中运行。 |
-AllowCommandletRendering | 初始化渲染子系统。很有用,因为PCG有一些利用GPU的功能。 |
-AutoSubmit | 尝试将结果提交到源码控制(如果可用)。 |
-AssetGatherAll | 为项目中的所有资产构建完整资产注册表。构建器需要访问关卡中未引用的资产时为必需。 |