UE4大地图(流关卡、无缝地图)

原作者:xiaosongfang

对于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吧。
-----------------------------------
©著作权归作者所有:来自51CTO博客作者xiaosongfang的原创作品,如需转载,请注明出处,否则将追究法律责任
UE4大地图(流关卡、无缝地图)
https://blog.51cto.com/u_13638120/2335587

posted @ 2021-12-02 18:08  SD-KT007  阅读(1805)  评论(0编辑  收藏  举报