BlueRoseNote/03-UnrealEngine/LevelScene/World Partition(世界分区).md

13 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
World Partition(世界分区) 2024-04-26 14:18:36

前言

文档地址: https://dev.epicgames.com/documentation/en-us/unreal-engine/world-partition-in-unreal-engine?application_version=5.3

PS.可以使用Tools-Convert Level或者World Partition Convert Commandlet对普通关卡来进行转换。

调试命令

  • 图形化Debug显示
    • wp.Runtime.ToggleDrawRuntimeHash2D
    • wp.Runtime.ToggleDrawRuntimeHash3D
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存储方式。
  • Preview Grid可以在Viewport中大致预览一下每个Grid对应的Cell Size和Loading Range的设置是否合理。Preview Gird Level可以修改预览层级。
网格名称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

官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/world-partition---data-layers-in-unreal-engine?application_version=5.2

!WorldPartition_LayerData.png

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的加载与卸载。

相关CommandLet

  • 烘焙WorldPartitionUnrealEditor.exe QAGame -run=cook -targetplatform=WindowsNoEditor -Unversioned -map=Playground
  • HLOD BuildUnrealEditor.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重新保存ActorUnrealEditor.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
  • 转换子关卡为WorldPartitionUnrealEditor.exe -run=ConvertLevelsToExternalActorsCommandlet -nosourcecontrol -convertsublevels "Game/Maps/TestMaps/ExternalActors/MainMap

修改WorldPartition场景中出现已删除物体的物体问题

猜测执行WorldPartitionBuilderCommandlet -builder=WorldPartitionResaveActorsBuilder。还未经过测试。

cd /d D: 
cd D:\Projects\ASoul_UE5\Engine\Engine\Binaries\Win64
UnrealEditor.exe "D:\Projects\ASoul_UE5\LiveDirector\LiveDirector.uproject" "/Game/Maps/Map_WuTai_WP/Map_WuTai_WP" -run=WorldPartitionBuilderCommandlet -SCCProvider=None -builder=WorldPartitionResaveActorsBuilder

统计文件数量 p4 sizes -s //Project/Development/LiveDirector/Content/ExternalActors/Maps/Map_WuTai_WP/Map_WuTai_WP/...

WorldPartition Runtime Sequence驱动物体问题

  1. WorldSettings关闭 EnableStreaming。所有场景Actor都会一直加载。
  2. 对应Actor关闭Is Spatially LoadedActor会一直加载。
  3. 使用WorldPartitionRuntimeStateVolumn设置DataLayer加载即可。 经过测试无效
  4. Sequence使用DataLayerTracker设置为Activated无效。

UE-173838 Actors in Level Sequence in a World Partitioned level do not move https://issues.unrealengine.com/issue/UE-173838

但5.2已经修复这个问题。

曹老师提供思路

使用在进行大世界之后对Sequence中的物体进行重新Binding。