文章目录
- WC与WP的区别
- 一、如何开启WP
- 1.默认创建WP
- 2.手动创建WP
- 3.转换创建WP
- 二、设置World Partition参数
- 三、启动流送
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
WC与WP的区别
WorldCompostion(WC)
是UE4中制作大世界的解决方案,但是WC有下面三个的问题:
其一是:多人协作的工作流冲突,大世界的编辑肯定需要多人来协作完成,在WC中需要先将大关卡(PersistentLevel)人为切分为若干个SubLevel,编辑是以SubLevel为单位的,A如果想编辑SubLevel1中的某些Actor,则签出SubLevelA进行编辑,如果此时B想编辑SubLevelA中的另外一些Actor,则必须等待A签入SubLevelA之后再签出进行编辑,降低了协作效率。
其二是:对其中某个SubLevel进行修改如果改变了它的LevelBounds,可能需要重新划分SubLevel,否则可能导致关卡流送错误,因为流送机制是用BBCC包围盒算法(SphereAABBIntersection)来决定是否流送某个SubLevel的。
其三是:坐标精度限制,在UE4中坐标采用的是32位的单精度浮点数据类型,这在一定程度上限制了大世界的规模以及Actor的位置精度。
WorldPartition(WP)
而UE5新出的WorldPartition为了解决WC的问题提供了下面三种方法:
其一是:正对WC出了一个叫One File Per Actor(OFPA)直译意思是一个Actor保存为一个文件,这个机制,完美的解决了WC中协作冲突问题,究其原因是编辑粒度问题,在WC中编辑的最小单位是SubLevel,它由若干个Actor组成,它并非大世界中可编辑的最小单位Actor,UE5中的OFPA机制会将大世界中的Actor实例保存到额外的一个文件中,编辑人员可以针对某个Actor进行编辑,协作互不影响。
其二是:编辑SubLevel有可能导致LevelBounds变化的问题,UE5中编辑大世界无需人为手动划分SubLevel,而是在运行或烘焙(Cook)时,程序自动将大世界中的Actor划分到若干个Cell中,因此不存在LevelBounds问题,同时也省去了在WC中排布这些SubLevel的工作。
其三是:坐标精度问题,UE5引入了大世界坐标Large World Coordinates(LWC),支持64为的双精度浮点数据类型,为制作次世代超大世界提供了支持。
一、如何开启WP
1.默认创建WP
在创建工程时,选择游戏->空白模板
创建完成后在上方菜单栏中选择 窗口->时间分区->世界分区编辑器,即可看到默认创建的关卡就是大世界光卡
2.手动创建WP
在菜单栏中,文件→新建关卡,然后选择Open World或空白开发世界模板即可,这样创建的关卡会默认开启流送属性
3.转换创建WP
普通关卡是指除了通过上述两种方式
1.创建的关卡,比如在内容浏览器中通过右键创建的关卡
2.通过菜单文件->创建新关卡中选择Basic或空白关卡模板创建的关卡
以上两种方式创建的都是普通的关卡
以上创建的关卡无法开启WP,这可以从世界设置中的世界分区中可以看出,其中World Partition被置灰,无法修改
要想将上述的普通关卡转成WP关卡,UE中提供了两种方式:
第一种:通过工具来转,上方工具栏中→转换关卡
第二种:通过命令来进行转换
UnrealEditor.exe 工程名 -run=WorldPartitionConvertCommandlet 目标关卡 -AllowCommandletRendering
可以参考一下官方文档:World Partition
二、设置World Partition参数
World Partition系统会将整个大世界中的Actor自动划分到若干个单元格网格中,那么这个单元格式大小是多少呢?它实际上是我们在世界分区设置->运行时设置 中配置的:
默认情况下,会为WP关卡生成一个Grid,该Grid就是整个关卡的大小,当然你也可以手动创建或删除Grid,但至少要保证有一个Grid,否则运行时无法加载关卡
其中有两个参数值得注意:
CellSize,在运行或烘焙时,WP系统会根据设定的CellSize来将Grid划分为若干个Cell,这个CellSize的具体大小应根据项目来设置,但不易过大或过小,因为流式加载是以Cell为单位的,过大可能会导致加载较慢,且可能加载了一些不必要的Actor,过小可能会导致频繁的加载卸载
Loading Range,划分好的Cell会根据Grid的LoadingRange来流式加载,同样的,LoadingRange的大小也应该根据具体的项目来设置
这其实和UE4中WC的LevelLayer差不多,一个LevelLayer相当于一个Grid,每个LevelLayer都可以设定SteamingDistance,SteamingDistance就相当于LoadingRange
但也有不同的地方,那就是WC中需要先将大关卡切成一个个的子关卡,然后再在WC中进行排布这些子关卡,而WP中是自动划分Cell的
前面提到了可以手动创建Grid,那么如何指定Actor属于哪个Grid,它具体操作如下:
首先创建自己的Grid,然后选中关卡中的Actor,去到它的Details面板的World Partition部分
其中的两个设置:
Runtime Grid:在其中填入自己创建的Grid的名字,如果为不填(None),该Actor将属于默认创建的Grid
Is Spatially Load:如果勾选会,则会根据LoadingRange来流式加载,如果没有勾选,那么将直接加载(类似UE4中的Always Load),注意,如果该Actor处于DataLayer中并且该DataLayer被设为Unload状态,此时无论勾选与否,Actor都不会被加载
三、启动流送
也可以通过创建Actor并添加WorldPartitionStreamingSource组件来让Actor变成Streaming Source
这里可以运行打开关卡流送调试图,运行后输入命令:
开启该调试的指令:wp.Runtime.ToggleDrawRuntimeHash2D
白色圈圈表示StreamingSource所在位置和LoadingRange大小,与白色圈圈有交集的Cell会被加载
绿色表示已加载的Cell,黄色表示正在加载的Cell,紫色表示已卸载的Cell
总结
WorldPartition是一套复杂且完善的构建大世界的解决方案,这样一套解决方案的背后,是一系列技术的支持,其中主要包括:
- One File Per Actor(OFPA),将大世界中的每个Actor实例都保存为一个额外的文件,文件编辑粒度变小。
- Level Instancing,在编辑时可以将某些Actor合并为一个LevelInstance,以方便对某些Actor重用和一些特殊的操作。
- Hierarchical Levels of Detail(HLOD),为了降低超大世界在运行时的内存和渲染压力,需要对大世界做LOD处理,例如将远处的山脉、树林等静态网格的Actor合并为一个静态网格等。
- 自动划分Cell,在运行时或烘焙的时候将大世界中的Actor自动划分到若干个Cell中,然后流式加载Cell。
- Data Layers,在编辑时,将Actors放到不同的DataLayer中,并可以动态的加载卸载DataLayer内的Actor,以方便编辑时管理复杂关卡,同时也可用它来做一些Gameplay功能,比如将白天和黑夜相关的Actor放到不同的DataLayer中来完成白天黑夜切换。
- Large World Coordinates(LWC),支持64为的双精度浮点数据类型,为制作次世代超大世界提供了支持大世界坐标。
以上就是今天要讲的内容,本文仅仅简单介绍了WorldPartition的使用,而WorldPartition提供了大量能使我们快速便捷地构建自己的大世界场景。
下一篇:虚幻引擎(UE5)-大世界分区WorldPartition教程(二)