世界分区

介绍世界分区系统以及在游戏项目中的使用方式

Choose your operating system:

Windows

macOS

Linux

以往制作者在制作大型地图时,需要手动将其分为多个子关卡,然后在玩家探索地图时使用关卡流送系统加载卸载不同的子关卡。这样的方法往往导致多用户共用文件的问题,并且使得制作者难以同时审视整个地图。

世界分区是一种自动数据管理和基于距离进行加载的关卡流送系统,它针对大型世界管理提供了一个完整的解决方案。这个系统将整个世界划分为网格单元,保存在一个固定的关卡,使制作者不再需要划分繁冗的子关卡,并提供一个自动流送系统,基于与流送源之间的距离来加载和卸载这些网格。

世界分区常常与以下功能搭配使用:

启用世界分区

在虚幻引擎中启用世界分区的三种方法:

  • 使用 游戏(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)类型地图:

  1. 文件(File) 菜单中选择 新关卡(New Level)

  2. 选择 开放世界(Open World) 地图类型。

  3. 点击 创建(Create) 按钮创建新地图。

转化已有的关卡来使用世界分区

你可以通过 工具(Tools)> 转化关卡(Convert Level) 选项向任何关卡中添加世界分区,或者使用世界分区转化命令行(World Partition Convert Commandlet)。

通过以下步骤使用世界分区转化命令行(World Partition Convert Commandlet):

指令:UnrealEditor.exe QAGame -run=WorldPartitionConvertCommandlet Playground.umap -AllowCommandletRendering

转化已有的关卡来使用世界分区

  1. 在Windows系统中打开一个命令提示符窗口。

  2. 首先找到 UnrealEditor.exe 可执行文件的位置。比如在以上示例中: c:\Builds\Home_UE5_Engine\Engine\Binaries\Win64

  3. 接下来,开始输入指令,由运行命令行的可执行文件名开始,UnrealEditor.exe

  4. 继续输入指令,加上项目的名称。此处示例中为`QAGame`。

  5. 输入将要运行的命令行的名称, -run=WorldPartitionConversionCommandlet

  6. 加入将要转化的地图文件名。在以上示例中为 Playground.umap

  7. 最终加上附加参数 -AllowCommandletRendering

  8. 指令输入完成后按下 回车(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一文件 文档.

关卡中引用其他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) 网格。它包含一个可定制的网格数组,用于满足关卡的具体需求。

选项

说明

网格名称(Grid Name)

包含运行时网格的名称。

单元大小(Cell Size)

确定用于生成流式水平的网格单元的大小。在这个例子中,单元大小 是256平方米。

加载范围(Loading Range)

流送源周围多少范围内的单元需要加载。在上图中,加载范围 是流送源周围的768米半径。

阻塞缓慢流送(Block on Slow Streaming)

在网格单元加载速度不够快的情况下阻塞加载。

优先级(Priority)

设置流送源的优先级。如果一个网格单元与多个流送源相交,其优先级将是所有流送源中的最高优先级。

调试颜色(Debug Color)

启用 预览网格 后显示的网格线框的颜色。

预览网格(Preview Grids)

启用后在视口中显示网格线框。

实例化植被网格大小(Instanced Foliage Grid Size)

实例化植被Actor的网格大小。

默认世界分区设置(Default World Partition Settings)

将当前的网格设置重置为默认,或者将当前的设置保存为新的默认值。

世界分区编辑器单元大小(World Partition Editor Cell Size)

设置世界分区编辑器单元格大小。新尺寸会在下次世界重载时生效。

在编辑器中加载和卸载网格单元

为了便于开发大型世界,所有网格单元初始都是卸载状态。关卡打开后,编辑器只会加载那些将其网格放置(Grid Placement)设置标记为"始终加载(Always Loaded)"的Actor,例如场景背景和管理类。这有助于开发大型世界,因为这类场景通常无法在编辑器中同时加载整个地图。

在"世界分区"窗口中,你可以手动选择要在哪些网格单元中工作。在主菜单中选择 窗口 > 世界分区 来打开该窗口。

在窗口中,点击并拖动网格单元来选中它们。然后,右键单击所选内容,打开上下文菜单,加载和卸载单元格。

为世界分区窗口生成小地图

你可以使用 构建(Build) 菜单的世界分区部分中的 构建小地图(Build Minimap) 选项,或者使用构建器命令来生成小地图,以便在世界分区窗口中更容易导航。

运行这个命令可以为世界分区世界创建一个小地图,并将其放在世界分区窗口中。

如果你生成了小地图,但没有出现在世界分区窗口中,你需要在项目中启用虚拟纹理支持。要启用虚拟纹理,请在主菜单中点击 编辑(Edit) > 项目设置(Project Settings)。然后勾选 启用虚拟纹理支持(Enable virtual texture support) 复选框。

生成HLOD

生成HLOD需要用到构建菜单世界分区分段中的构建HLOD选项,或使用世界分区HLOD构建器(World Partition HLODs Builder)命令来生成。

运行该命令会根据你在HLOD层中指定的生成设置,为你的世界分区单元创建HLOD Actor。 关于在世界分区中使用HLOD和世界分区HLOD构建命令的更多信息,请参见世界分区-HLOD文档。

烘焙世界分区世界

烘焙世界分区地图需要用到烘焙命令:

命令: UnrealEditor.exe QAGame -run=cook -targetplatform=WindowsNoEditor -Unversioned -map=Playground

要烘焙世界分区地图:

  1. 在Windows中,打开命令行窗口。

  2. 在窗口下,首先导航到 UnrealEditor.exe 可执行文件的位置。

  3. 接下来,输入需要运行命令的 .exe 文件的名称,即 UnrealEditor.exe

  4. 添加项目名称,这里是 QAGame

  5. 继续添加要运行的命令名称,-run=cook

  6. 添加以下参数,完成命令:

    • -targetplatform=WindowsNoEditor ,表示为Windows平台烘焙项目。

    • -UnVersioned 以无版本模式保存所有烘焙过的包。这些包在加载时被视为当前版本。

    • -map=Playground 指定地图名称,这里是 Playground.umap

关于使用烘焙命令的更多信息,请参见内容烘焙。

不支持即时烘焙(Cook on the Fly)和使用 -game 命令行运行游戏的编辑器构建版本。

使用世界分区与蓝图

在"世界分区"世界中,蓝图类和关卡蓝图都受到支持。不过首选是蓝图类,因为在关卡蓝图中引用的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

设置运行时加载范围。接受以下参数:

  • -grid=[index]:设置你想影响的运行时网格。

  • -range=[override_loading_range]: 设置新的运行时加载范围

wp.Runtime.MaxLoadingLevelStreamingCells

限制并发加载的世界分区流单元的数量。

wp.Runtime.HLOD 0

使用 wp.Runtime.HLOD 显示没有HLOD的世界。

世界分区构建器命令

世界分区通过 UWorldPartitionBuilderCommandletUWorldPartitionBuilder 基类引入了一个构建器命令框架。

这些命令用于完成自动化批处理,以及生成/修改世界分区中的数据。大型世界不必一次性全部加载,就能完成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构建器

The 世界分区重新保存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 这个参数来指定使用哪个版本控制提供者。