过去,构建大型地图需要开发人员手动将地图划分为多个子关卡,然后使用关卡流送系统在玩家遍历地形时加载和卸载这些子关卡。此方法常常会在多个用户之间共享文件时带来问题,并且在上下文中查看整个世界会很困难。
世界分区是一种自动数据管理和基于距离的关卡流送系统,为大型世界管理提供了完整的解决方案。以前需要通过将单个持久关卡中的世界存储到网格单元格中,以便将大型关卡划分成子关卡,但现在的系统已经不需要如此操作,并且能够自动流送系统,从而根据与流送源的距离来加载和卸载这些单元格。
世界分区非常适合用于以下功能:
启用世界分区
有三种方法可在虚幻引擎中启用世界分区:
- 根据 游戏(Games) 类别中的模板创建新项目。
- 使用开放世界模板创建新关卡。
- 将现有关卡转换为使用世界分区。
使用游戏模板创建你的项目
在 游戏(Games) 类别中的许多项目模板中,世界分区默认启用。
要在创建新项目时降低复杂性并提供可扩展的解决方案,可以使用 世界设置(World Settings) 中的 启用流送(Enable Streaming) 选项启用和禁用网格单元流送。
以下模板使用世界分区,但默认禁用了 启用流送(Enable Streaming) 。
- 空白
- 第一人称
- 第三人称
- 自上而下
- 载具高级
使用开放世界默认地图
开放世界默认地图类型设计为作为创建大型开放世界地图的起始点,并默认启用了以下功能:
- 世界分区
- 一个Actor一个文件
- 数据层
- 分层细节级别
地图包含一个2千米x2千米的示例地形,带有适用于户外环境的地形材质和光照设置。这包括天空大气、天空光照、定向光源、指数高度雾和体积云。
要在项目中使用开放世界默认地图类型:
- 打开 文件(File) 菜单并选择 新建关卡(New Level) 。
- 选择 开放世界(Open World) 地图类型。
- 点击 创建(Create) 按钮创建新的地图。
将现有关卡转换为使用世界分区
你可以使用 工具(Tools)> 转换关卡(Convert Level) 菜单选项或使用世界分区转换命令,将世界分区添加到任意关卡。
要使用世界分区转换命令,请执行以下步骤:
命令: UnrealEditor.exe QAGame -run=WorldPartitionConvertCommandlet Playground.umap -AllowCommandletRendering
要将现有关卡转换为世界分区:
-
在Windows中,打开"命令提示符"窗口。
-
在提示符下,首先浏览到
UnrealEditor.exe
可执行文件的位置。在上述示例中:c:\Builds\Home_UE5_Engine\Engine\Binaries\Win64
。 - 接下来,使用将运行命令的.exe文件的名称
UnrealEditor.exe
开始命令 -
添加项目的名称。此处为
QAGame
。 - 使用要运行的命令的名称
-run=WorldPartitionConversionCommandlet
继续。 - 添加将转换的地图文件的名称。在以上示例中是
Playground.umap
。 -
使用额外的参数
-AllowCommandletRendering
完成命令。 - 按 Enter 键,命令会将地图转换为使用世界分区。
以下可选的参数可用于此命令:
可选参数 | 说明 |
---|---|
-SCCProvider=(None,Perforce...) | 指定要使用的源码控制提供程序。要在不使用源码控制的情况下运行,请指定 -SCCProvider=None 。 |
-Verbose | 显示详细日志记录。 |
-ConversionSuffix | 将_WP后缀附加到转换后的地图。这很适合用于转换关卡以用于测试,同时使源关卡保持完好。 |
-DeleteSourceLevels | 在转换之后删除源关卡。 |
-ReportOnly | 报告在转换期间会发生什么。不执行转换。 |
-GenerateIni | 生成此地图的默认 .ini 转换文件。不执行转换。 |
-SkipStableGUIDValidation | 跳过不稳定的Actor GUID验证过程。带有不稳定的Actor GUID的关卡会在多次转换时产生不同的转换输出。重新保存关卡可修复此问题。 |
-OnlyMergeSubLevels | 将关卡和子关卡转换且合并为一个Actor一个文件,不使用世界分区。转换后的关卡可以用作世界分区关卡中的关卡实例。 |
-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
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))
使用世界分区
世界分区系统的工作方式是将世界存储在单个持久关卡文件中,并使用可配置的运行时网格将空间细分为多个可流送的网格单元。 运行时存在流送源(例如玩家)就会加载和卸载这些单元。这样一来,虚幻引擎在给定时刻仅加载玩家看到并与之交互的关卡部分。
世界分区中的Actor
编辑世界时,Actor可以添加到任意地方,并会基于其 是否在空间上加载(Is Spatially Loaded) 设置(位于其 细节(Details) 面板的 世界分区(World Partition) 分段中)自动分配到某个网格单元。
选项 | 说明 |
---|---|
运行时网格 | 确定此Actor放置到的分区网格。如果选择 无(None) ,网格将由分区系统选择。 |
是否在空间上加载 | 确定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 在组件完成它与之相交的网格单元的流送时返回true。
运行时网格设置
决定运行时是加载还是卸载网格单元的第二个因素是运行时网格本身的设置。运行时网格设置位于 世界分区设置(World Partition Setup) 分段中的 世界设置(World Settings) 面板中。
默认情况下提供了一个 2D运行时哈希(2D Runtime Hash) 网格。使用多个网格可能对性能造成负面影响。
如需详细了解针对2D运行时哈希网格的推荐设置,请参阅位于城市示例项目中的 大城市(Big City) 地图。
选项 | 说明 |
---|---|
网格名称(Grid Name) | 包含运行时网格的名称。 |
单元大小(Cell Size) | 确定用于生成流送关卡的网格单元的大小。在示例中, 单元大小(Cell Size) 是256平方米。 |
加载范围(Loading Range) | 确定与流送源距离多远的范围之内会加载单元。在上图中, 加载范围(Loading Range) 是流送源周围768米的半径。 |
在缓慢流送时阻止(Block on Slow Streaming) | 在网格单元加载速度不够快的情况下阻止加载。 |
优先级(Priority) | 确定流送源的优先级。如果某个网格单元与多个流送源相交,其优先级将是所有流送源中最高的。 |
调试颜色(Debug Color) | 确定启用 预览网格(Preview Grids) 时显示的网格线颜色。 |
预览网格(Preview Grids) | 启用时,将在视口中显示网格线。 |
加载和卸载编辑器中的区域
为了支持开发大型世界,世界最初处于卸载状态。关卡打开时,编辑器仅加载将其 是否在空间上加载(Is Spatially Loaded) 设置标记为 False 的Actor,例如环境背景和管理器。这样即使无法在编辑器中加载整个地图,也能开发大型世界。
使用世界分区窗口加载和卸载区域
在世界分区窗口中,你可以手动选择要工作的区域。从主菜单选择 窗口(Window)> 世界分区(World Partition)> 世界分区编辑器(World Partition Editor) 以打开窗口。
在窗口中,点击并拖出区域。然后,右键点击选择内容打开上下文菜单,并选择 根据选择内容加载区域(Load Region from Selection) 。
使用位置体积加载和卸载区域
还可以使用 位置体积(Location Volumes) 加载和卸载区域。
位置体积是一种仅限编辑器的体积,放置在关卡中表示世界分区窗口中的地图区域。
要将位置体积添加到你的关卡,请执行下面的步骤:
- 如果 放置Actor(Place Actors) 窗口尚未打开,请将其打开。
- 搜索 位置体积(Location Volume) 。点击它并拖移到你的关卡中。
- 保存你的关卡。
保存关卡后,世界分区窗口中将显示与位置体积(Location Volume)同名的新区域。
选择该区域并右键点击以打开上下文菜单。点击 加载所选区域(Load Selected Region) 加载该区域。要同时加载或卸载多个区域,可以拖动选择或按住Ctrl键点击多个区域。
位置体积有以下支持的设置:
笔刷设置(Brush settings)
设置 | 说明 |
---|---|
显示着色体积(Display Shaded Volume) | 显示带有着色体积的笔刷。 |
着色体积不透明度值(Shaded Volume Opacity Value) | 使用0.0-1.0的值设置着色体积的不透明度。 |
笔刷设置(Brush settings) 分段中的许多选项依赖于你选择的 笔刷形状(Brush Shape) 。
世界分区(World Partition)
设置 | 说明 |
---|---|
加载和卸载(Load and Unload) | 加载和卸载所选体积内的区域。 |
生成世界分区窗口的小地图
你可以生成小地图,以便可以使用 构建(Build) 菜单的"世界分区(World Partition)"分段中的 构建小地图(Build Minimap) 选项或使用世界分区小地图构建器命令,更轻松地在世界分区窗口中导览。
运行此命令会创建你的世界分区世界的小地图图像,并将其放置在世界分区窗口中。
如果你构建了小地图,而它没有显示在世界分区窗口中,你将需要在项目中启用虚拟纹理支持。要启用虚拟纹理,请从主菜单转至 编辑(Edit)> 项目设置(Project Settings) 。然后,启用 启用虚拟纹理支持(Enable virtual texture support) 复选框。
世界分区窗口中有用的快捷方式和选项
热键 | 说明 |
---|---|
Shift+拖动 | 将选择内容对齐到当前运行时网格大小。 |
双击 | 在所有视口中将摄像机移至该位置。 |
Shift+ 双击 | 在点击的位置启动PIE会话。 |
Ctrl+双击 | 加载点击的位置周围的区域。 |
MMB+拖动 | 显示从点击的点到结束点的距离(以虚幻单位计)。 |
生成分层细节级别(HLOD)
HLOD是使用"构建(Build)"菜单的"世界分区(World Partition)"分段中的"构建HLOD(Build HLODs)"选项或使用世界分区HLOD构建器命令生成的。
运行此命令会根据你在HLOD层中指定的生成设置为你的世界分区单元创建HLOD Actor。 如需详细了解如何使用世界分区中的分层细节级别(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
。
如需详细了解如何使用Cook命令,请参阅内容烘焙。
将世界分区用于蓝图
蓝图类和关卡蓝图在世界分区世界中都受支持。但是,首选蓝图类,因为关卡蓝图中引用的Actor会标记为"总是加载(Always Loaded)"。
测试分区的世界
调试和运行时覆盖
有一些很有用的控制台命令可用于在运行时期间调试世界分区世界。
控制台命令 | 说明 |
---|---|
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是使用 世界分区HLOD构建器(World Partition HLODs Builder) 命令生成的。运行此命令会根据你在HLOD层中指定的生成设置为你的世界分区单元创建HLOD Actor。
命令: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -builder=WorldPartitionHLODsBuilder
如需详细了解如何使用世界分区中的分层细节级别(HLOD)以及如何使用WorldPartitionHLODsBuilder命令,请参阅世界分区 - 分层细节级别文档。
世界分区小地图构建器
世界分区小地图构建器(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
执行以上示例时,Actor在OpenWorldTest关卡中的所有程序包都会重新保存。
你可以使用 -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 | 显示详细日志记录。 |
-Log | 将日志输出到特定文件。 |
-CleanPackages | 清理所有寻路数据包而不是构建它们。 |
世界分区智能对象集合构建器
世界分区智能对象集合构建器命令可根据你的世界分区关卡中的所有智能对象组件重新构建智能对象集合。
命令: UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -builder=WorldPartitionSmartObjectCollectionBuilder
执行以上示例时,OpenWorldTest关卡中的所有智能对象集合都会重新构建。你可以将 -SCCProvider
参数用于此命令,指定要使用的源码控制提供程序。