虚幻引擎(UE5)-大世界分区WorldPartition教程(一)

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新出的,为了解决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提供了大量能使我们快速便捷地构建自己的大世界场景。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值