12 KiB
12 KiB
title, date, excerpt, tags, rating
title | date | excerpt | tags | rating |
---|---|---|---|---|
World Partition(世界分区) | 2024-04-26 14:18:36 | ⭐ |
前言
- 知乎文章:
- UE5
- UE5 World Partition不完全指南:https://zhuanlan.zhihu.com/p/687020988
- UE4
- UE4旧版方案:WorldComposition https://zhuanlan.zhihu.com/p/270172506
- UE4场景流送机制:(一)场景加载: https://zhuanlan.zhihu.com/p/269493281
- UE4场景流送机制:(二)LevelStreamingVolume&WorldComposition https://zhuanlan.zhihu.com/p/270172506
- UE5
PS.可以使用Tools-Convert Level,或者World Partition Convert Commandlet对普通关卡来进行转换。
调试命令
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的世界。 |
关卡实例化
这2个选项在Actor右键菜单中(ActorSelection)
- Level Instance
- 可以将任意Actor塞进去
- 采用OFPA系统保存关卡信息
- Packed Level Actor
- 继承自Level Instance
- 将所选的Actor变为component,在创建Level的同时创建一个Blueprint
- 内部Actor不再使用OFPA的方式,同时意味着整个Packed Level Actor只会按整体流送
- 在Pack时只会打包场景资产类型,功能性的蓝图会被排除
官方文档阅读笔记
概念
- 流送源:#PlayerController是一种流送源,其他流送源可以使用 世界分区流送源组件(UWorldPartitionStreamingSourceComponent) 添加到关卡中,使得加载指定位置的Grid。
- #DataLayer:是世界分区系统中的一个子系统,用于将Actor划分到单独的层中。通过加载和卸载数据层,
将现有关卡转换为使用世界分区
可以使用工具(Tools)> 转换关卡(Convert Level) 菜单选项或使用世界分区转换命令:
UnrealEditor.exe 项目名称 -run=WorldPartitionConvertCommandlet Playground.umap -AllowCommandletRendering
相关设置
WorldSettings
- 启用流送(Enable Streaming): 选项启用和禁用网格单元流送。
- 使用MovieRenderQueue进行渲染时,需要关闭这个选项,不然场景不会加载。
- Use External Actors:为整个Level启用每个Actor per File存储方式。
网格名称(Grid Name) | 包含运行时网格的名称。 |
单元大小(Cell Size) | 确定用于生成流送关卡的网格单元的大小。在示例中, 单元大小(Cell Size) 是256平方米。 |
加载范围(Loading Range) | 确定与流送源距离多远的范围之内会加载单元。在上图中, 加载范围(Loading Range) 是流送源周围768米的半径。 |
在缓慢流送时阻止(Block on Slow Streaming) | 在网格单元加载速度不够快的情况下阻止加载。 |
优先级(Priority) | 确定流送源的优先级。如果某个网格单元与多个流送源相交,其优先级将是所有流送源中最高的。 |
调试颜色(Debug Color) | 确定启用 预览网格(Preview Grids) 时显示的网格线颜色。 |
预览网格(Preview Grids) | 启用时,将在视口中显示网格线。 |
Actor
- Runtime Grid:用于指定Actor的分区Grid名称,如果没有指定则会自动选择。
- Is Spatially Loaded:
- 如果启用,此Actor在未分配到禁用的数据层且在任何流送源的范围内时加载。
- 如果禁用,此Actor在未分配到禁用的数据层时加载。
- Packaging Mode:选择是否将Actor设置成Actor Per File存储方式。
PlayerController
- Enable Streaming Source:将控制器作为作为流送源。
UWorldPartitionStreamingSourceComponent
默认可视化器加载范围(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 将启用和禁用此组件的流送。 |
ALocationVolume
一种用于加载/卸载 指定区域的Volumn。可以在WorldPartition编辑器上点击来进行控制。也有三个蓝图函数用于控制加载与卸载:
- void Load()
- void Unload()
- bool IsLoaded() const
构建WorldPartition编辑器小地图
Build - Build Minimap
DataLayer
1 | 在关卡编辑器中切换关卡的可视性。仅当某个Actor所有关联数据层都隐藏时,它才能被隐藏。 |
2 | 表示"动态加载(Is Dynamically Loaded)"的状态。动态加载的层将会影响运行时的Actor加载。可以使用蓝图或C++代码激活这些层。 |
3 | 切换"编辑器动态加载(Editor Dynamically Loaded)"标记。在关卡编辑器中,如果Actor启用了数据层并且在世界分区中加载了编辑器单元格,将加载Actor。 |
4 | 切换此数据层中所有Actor的可见情况 |
5 | 决定启动时数据层是否在编辑器中显示。 |
6 | 决定是否应该为此数据层中的Actor生成HLOD。仅当启用"动态加载(Is Dynamically Loaded)"时可用。 |
7 | 决定启用了"动态加载(Is Dynamically Loaded)"的数据层在运行时加载、卸载还是激活。 |
8 | 决定数据层是否影响Actor的运行时加载。 |
使用蓝图或者c++控制DataLayer加载
通过UDataLayerSubsystem的SetDataLayerState()来控制DataLayer的加载与卸载。
Level Instance
关卡实例化是一种基于关卡的工作流程,旨在改善和精简关卡编辑体验。将关卡实例化工作流程用于一个或多个Actor来创建可以在你的整个世界内放置和复用的关卡实例。这个工作流程具有以下优势:
- 关卡实例在相关环境中编辑,可以立即看到所做更改对你的世界的影响。对一个实例所做的更改在保存后将复用于所有实例。
- 快速创建静态网格体排列(兴趣点、建筑和Gameplay设置中的任何内容)的副本作为模板。
- 在创建Epic Games所创建的城市示例和Valley of the Ancient演示时所使用的生产级流程。
相关CommandLet
- 烘焙WorldPartition:UnrealEditor.exe QAGame -run=cook -targetplatform=WindowsNoEditor -Unversioned -map=Playground
- HLOD Build:
UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -builder=WorldPartitionHLODsBuilder
- WorldPartition重命名复制:
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
- WorldPartition重新保存Actor:
UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -SCCProvider=None -builder=WorldPartitionResaveActorsBuilder
- WorldPartition植被构建:
UnrealEditor.exe QAGame Playground.umap -run=WorldPartitionBuilderCommandlet -Builder=WorldPartitionFoliageBuilder -NewGridSize=Value
- WorldPartition Nav构建:
UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -AllowCommandletRendering -builder=WorldPartitionNavigationDataBuilder -SCCProvider=None
- WorldPartition智能对象构建:
UnrealEditor.exe "C:\Users\user.name\Documents\Unreal Projects\MyProject\MyProject.uproject" "/Game/ThirdPersonBP/Maps/OpenWorldTest" -run=WorldPartitionBuilderCommandlet -builder=WorldPartitionSmartObjectCollectionBuilder
- 转换子关卡为WorldPartition:
UnrealEditor.exe -run=ConvertLevelsToExternalActorsCommandlet -nosourcecontrol -convertsublevels "Game/Maps/TestMaps/ExternalActors/MainMap