目标
结合官方文档以及实践,学习WorldComposition的一些基础知识。
0. 资源准备
为了实验,先准备一些关卡:
新建一个文件夹用于容纳接下来的测试关卡,比如文件夹名叫 TestWC。
以 Default 为模板创建关卡:
这个关卡将作为主关卡,保存为 TestWC/main。
接着,新建一个文件夹 TestWC/SubLevels 用于存放所有的子关卡。
然后,再次新建关卡。但是将地板之外的Actor全部删除。然后将地板的X位置移动1000,保存为TestWC/SubLevels/l1。同样的方式移动2000保存为 l2、移动3000保存为l3。
1. 启用WorldComposition
打开main关卡,打开 World Settings面板。
然后在 World Settings面板中启用 Enable World Composition。
当启用时可以看到提示:
意思是:
点击确定后,将会把创建的 l1、l2、l3 作为main的子关卡。
2. 关卡流送(Level Streaming)的相关概念
正如官方文档所说:
The Level Streaming feature makes it possible to load and unload map files into memory as well as toggle their visibility during play. This makes it possible to have worlds broken up into smaller chunks so that only the relevant parts of the world are taking up resources and being rendered at any point. If done properly, this allows for the creation of very large, seamless games that can make the player feel as if they are playing within a world that dwarfs them in size.
关卡流送功能可以将地图文件加载到内存中,或者从内存中卸载,并在游戏运行时切换地图的可见性。 这样一来,场景便能拆分为较小的地图块,而只有相关部分才会占用资源并被渲染。正确设置后,开发者便能创建大型、无缝衔接的游戏场景,让玩家仿佛置身于"大世界"之中。
World Composition is a specific form of level streaming used to create large worlds. Levels are arranged in a planar grid, and streamed in as the player approaches them.
而 WorldComposition 是一种特定形式的关卡流送,用于创建大世界。关卡排列在平面网格中,并随着玩家的靠近而流入。
在主关卡中打开Levels面板可以看到子关卡的各种状态:
(可参见管理多个关卡 | 虚幻引擎文档来了解更多内容)
比如当前的main之下就有三个子关卡:
关卡之间的状态有所不同:
加载 & 未加载
关卡名字处于灰色的时候表示未加载(比如当前 l3 关卡没有被加载)。
关卡名字处于白色的时候表示已经加载了。
可以右键关卡进行加载和卸载:
The Persistent Level(持久关卡、主关卡)& Streaming Levels(流送关卡、子关卡)
只有一个 Persistent Level,即主关卡,它将会一直加载,无法卸载。(比如当前 main 中的内容就无法被卸载)
子关卡,又称为 Streaming Levels,将根据不同的方式比如 WorldComposition 来进行加载和卸载。(比如当前的 l1、l2、l3)
当前关卡(Current Level)
“当前关卡”的名字会是蓝色,当添加一个Actor时就会加入到这个关卡中。(比如现在就是 l2)
同一时间的当前关卡只有一个。当前关卡必须是已加载的。
可以右键将一个关卡设置为当前关卡:
所选择关卡
黄色背景表示此关卡被选择:
3. WorldComposition小地图
点击Levels面板的按钮可以进入WorldComposition小地图
可以看到所有已加载的关卡的缩略图
在官方文档中可以找到对其界面的介绍:
编号 | 名字 | 说明 |
---|---|---|
1 | 层(Layers) | 单击图层名称来切换该图层的过滤,或单击 + 来创建新图层。 |
2 | 比例尺 | 比例尺 |
3 | 世界场景原点(World Origin) | 世界场景原点的当前位置。 |
4 | 当前关卡(Current Level) | 当前关卡的名称。 |
5 | 鼠标光标位置 | 鼠标光标的当前世界场景位置。 |
6 | 框选 | 以世界场景单位显示的选取框的大小。 |
7 | 世界场景大小 | 世界场景的大小,计算为所有关卡边界框的总和。 |
4. Layer(层)——决定流送距离
默认情况下,所有关卡被分配给 Uncategorized(未分类) Layer。Layer 存储了有关流送距离的信息(鼠标悬停时可看到距离)
因此分配给特定 Layer 的关卡会继承这个流送距离。分配给“禁用流送距离”的 Layer 的关卡将从距离流送中排除(不过可以用蓝图来控制流送)。每个关卡一次只能分配给一个 Layer。
单击现有 Layer 名称右侧的+按钮可以创建新 Layer。
Layer 无法删除或编辑,因此如果想更改流送距离设置,需要创建具有想要的设置的新 Layer 并为其分配到对应的关卡。下次打开关卡时,会自动删除未分配关卡的 Layer。
单击小地图上的 Layer 名称,可以过滤掉除此之外的其他层。你可以使用 Control+鼠标单击来选择多个Layer。如果没有任何 Layer 选择,则不执行过滤。
接下来实践一下。
新建一个层 test1,设置距离为1000:
现在,可以在两个Layer之间进行切换过滤:
右键关卡可以将其分配给其他Layer:
现在将 l1、l2、l3 都分配给test1这个层。
然后点Play:
(为了测试,在main中间放了一条方块作为标记)
可以看到逐渐流入和流出的关卡。而且能观察出其判断的中心应该是相机而非角色(至于流送距离是如何精确计算的,可能需要看代码中的逻辑了)
5. 子关卡细节面板
点击 Levels 面板中的按钮,可以打开所选关卡的细节面板:
其中可以指定这个关卡块的位置等信息,以及LOD设置。详见 世界场景构成用户指南 | 虚幻引擎文档。
另外,这个面板显示的所选关卡的信息,如果所选关卡有多个,则就会批量地修改。
6. 控制台命令
输入stat levels
可在运行时看到关卡地加载状态:
详见Stat命令 | 虚幻引擎文档,其中指出不同颜色的含义是:
颜色 | 说明 |
---|---|
绿色 | 关卡已加载并可见。 |
红色 | 关卡已卸载。 |
橙色 | 关卡正在变成可见的过程中。 |
黄色 | 关卡已加载,但不可见。 |
蓝色 | 关卡已卸载,但仍驻留在内存中,当发生垃圾回收时将清除它。 |
紫色 | 关卡是预加载的。 |