UE4大地图(流关卡、无缝地图)
更新:HHH   时间:2023-1-7


对于UE4来说我只是个菜鸟,研究一下网上的教程稍微尝试的做一下demo,所以可能下面会有描述不准确或者说没解释清的地方请多谅解哈。也非常欢迎指出我说的不对的地方一起学习。

接下来开始教程。
UE4的原生功能LevelStreaming就非常适合用来做大地图,这也是生存竞技类游戏首选UE4来开发的原因之一。现在就稍微解释一下UE4的大地图实现。
对于UE4来说,Level(关卡)的概念很重要,但是为了更快的进入本文内容,我们可以把Level先当作这个大地图世界的切片,比如一个大地图你把它横竖切过成9宫格,每一片就是一个Level。而LevelStreaming(流关卡)就是用来把这些Level加载进来的方案。
现在我们就来做一个demo。功能就是像下图这样,这个世界有两个Level:A、B。角色从A走到B。两个level在合适的时机加载。

因为我自己本身也刚学习,所以我的教程也尽量详细,尽量把每个过程都照顾到。

场景建造

首先我们创建一个第一人称项目,建造这个场景

通过选择这几个cube复制粘贴,稍微摆放一下场景物件来把场景扩大,并且把中间的墙删掉

如果这时候build的话会提示场景光照需要先build,并且下面会出现这个提示

所以先等这个光照build完我们可以跑来看看。

这时候需要把场景分成两个Level,左边是A,右边是B。
先打开Level面板(Windows->Levels)

创建一个新Level,把Level放在和现在用的这个map同一路径下(必须放在同一路径,后面会讲到)

同样的方法创建LevelB。

这时候需要把当前关卡设置为LevelA

然后把场景种的所有左边的物件选中(一个一个点...),设置为LevelA的物件

可以通过隐藏这个关卡物件的按钮来看是否迁移正确

同样的方法处理LevelB

这样子处理之后,我们需要的场景就建造完成了

流关卡实现

根据我尝试的结果,最少有四种方法可以实现。

方法1:通过触发器触发你的蓝图逻辑:
首先在场景中间放置一个BoxTrigger。(先把FirstPersonExampleMap切换为当前关卡)

选中BoxTrigger,之后打开关卡蓝图

这时候可以直接右键生成这个触发器的触发事件

然后就是调用这个流程最关键的接口

完成之后如果这时候你点了Play的话,会自己掉落到空场景。所以需要先把LevelA先加载进来

这时候play,从LevelA走到LevelB,你就能看到能正常加载并通过

方法2:通过代码加载
通过代码加载就是如果你有自己的加载需求,自己在你的代码逻辑中调用上面的加载和卸载接口。这里就不演示了

方法3:通过StreamingVolumes控制加载卸载
这个方法是,通过UE的控件LevelStreamingVolume,来判断是否在Level显示范围内,是则加载,否则卸载
先把刚刚的关卡蓝图的事件流程断开
在LevelB上放置一个完整包含LevelB的LevelStreamingVolume

打开LevelB的LevelDetails,设置VolumeB为它的StreamingVolume。

这时你就能看到,当你走过去LevelB的时候就自动加载了。当你离开就会卸载。

方法4:通过系统的场景与照相机的距离,自动加载卸载(吃鸡大世界主要方法)

这个方法会比较复杂,首先需要先把这个场景中的子Level都删掉。所以之前的demo是不能通用的。这时候我们先把刚刚的项目备份。再开始做这个。

先把子Level删掉

打开WorldComposition功能。(Window->World Setting ->World -> EnableWorldComposition勾上)


然后你能看到你一直用的Levels面板多了一个按钮

同时你也会发现,你的LevelA和LevelB也在里面。
这就是为什么之前说必须放在和你当前Level同一个文件夹的原因。放在同一个文件夹下的Level都会加载到这里,作为默认可能打开的level
这时候在Levels面板里双击这两个level,就会把这两个Level加载进来
这时候Play的话,你会看到两个场景都自动加载进来了
这是因为,现在的加载距离非常远,你两个小Level都包含在里面

所以现在我们要加一个新layer,加载距离只有20m(20m以外卸载)

然后把LevelA和LevelB加载到Layer20M这(这里操作有点奇怪,有时候不显示AssignToLayer这个按钮,这个的话Unload再Load一下,瞎折腾一下就好了。。。)

这时候你在场景里走一下就能发现,超过20M的距离Layer就会卸载,在20M以内就会加载。

进阶一下

上面用的方法4,可以简单拓展一下做一个距离裁剪
新建4个Level,按区域把场景中的控件分别放到对应level里


建一个新layer,加载距离为5m,把刚刚这几个新建的level放进来

这时候Play就能看到,从LevelA走到LevelB时,会先加载LevelB的场景,再走到LevelB的物件非常近的地方,物件才会加载。

这样子就实现了一个简单的距离裁剪。

demo的话,因为公司上传不方便,其实根据我上面的指示也非常清楚了,实在有需要我就上传demo吧。

返回游戏开发教程...