本文共 2217 字,大约阅读时间需要 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吧。
转载于:https://blog.51cto.com/13638120/2335587