上一篇教程完成之后,有不少人给我反馈,还蛮开心的.
有兴趣的看看上一篇:
Vinni.D:UE4 傻瓜教程? -1zhuanlan.zhihu.com从这一节教程开始,我尽量用GIF来演示过程,方便大家理解.所以会有很多动图,流量不够的建议wifi看~
反馈的有一个人提到的我觉得很有趣,他说如果把金币改成一个平台,那我踩在上面平台就没有了,就会掉下去,然后说和FC上魂斗罗一代的第一关桥很像.
我觉得很有意思,所以打算第二篇教程主要实现这座桥.
我找朋友切好了图片:
为了研究这个 我专门又玩了一下魂斗罗,发现原来只要你到达某个位置,不管你碰没碰那座桥,都会开始爆炸:
这种也没问题 我们就按照这种的实现好了.
上一节我们实现的是单个触发,现在我们试试链式触发.
先把我们的资源导入到项目中:
这里导入后做了两个操作.
1:应用设置
这一步操作是更改贴图属性. 当一个图片被拖进引擎后,会被识别为贴图类型保存下来.
由于像素风格的图片本身分辨率很小,使用默认的配置,放大后会很模糊:
在应用这个设置后,效果就很明显了:
2:生成了Sprite.
贴图本身是没有办法放置到场景中的.
同样的道理,我们导入爆炸的图片.
接下来我们制作一个爆炸特效.
爆炸特效有很多种实现方式,其中一种是使用Particle(例子系统)实现,另一种是自己做一个帧动画的Actor实现.
如果用Particle(粒子系统)实现,那我还要讲很多关于粒子编辑器的内容,这并不是本节的重点. 以后我会专门用一节教程详细讲粒子系统. 我们现在用普通的actor来实现爆炸特效吧.
我们创建一个Flipbook.
什么是Flipbook?
理解 Paper 2D Flipbooks(简称 Flipbooks)的最佳方式是把它看做一种手绘动画的表现形式。原理是一系列有细微不同之处的图片快速“翻过”,从而产生动画的效果。在虚幻引擎 4 中,Flipbooks 由一系列关键帧组成,每帧均包含一个需要展示的 Sprite和展示时长(以帧数为单位)。 每秒帧率选项将决定帧的播放速度,确定每秒中存在多少动画“节奏”;可在 细节面板中编辑关键帧,或使用 Flipbook 编辑器下方的 时间轴进行编辑。理解Paper 2D Flipbooksdocs.unrealengine.com
打开我们刚才创建的Flipbook,把我们剩下的几帧也拖进去:
这样就做好了爆炸的动画.
我们把这个FB拖入到场景 可以看到效果了. 但是它会无限循环播放,我们要的是播放一次然后就消失.所以我们要制作一个播放一次就把自己销毁的Actor.
新建一个Actor 命名完成之后打开
把我们刚才创建好的爆炸FB拖进去:
设置碰撞. 默认的Sprite或者Flipbook都是有碰撞的. 比如上一节我讲的金币.如果把金币的Sprite调到比触发范围大,那就永远触发不了了.
所以我们要把碰撞全部关. 他本来就是一个表现的东西,不需要能够挡住玩家的去路.
然后我们制作简单的蓝图逻辑.
基本思路就是,获取这个Flipbook播放一次的时间长度,然后在这个时间之后销毁这个actor.
UE4中,所有的Actor都有个叫做Lifespan的属性,就是这个Actor的寿命时间.这个时间默认是0.
如果是默认值0,那这个Actor的寿命是无限的,只要你不主动销毁它,它就一直在那里.
这个就正好用来制作我们的逻辑. 我们获取到Flipbook的时间长度,然后赋予给Lifespan,然后Actor在这个时间长度之后会自动销毁. 也就是刚好4帧播放一遍就没了.
验证一下我们刚制作的Actor.
现在我们新建一个基于PickUpItem_Base的子类. 这个的作用是当你走过之后,播放一个Flipbook动画.
创建好后 打开蓝图 我们开始写逻辑.
我们的这套PickUp系统,有一个OnPicked事件.
在玩家走过去的时候,就会调用这个事件. 我们的逻辑就写在这里.
这里介绍一个非常重要的概念:SpawnActor
他的意思就是生成一个Actor在场景里.
Class:你需要在场景中生成的类. 在我们这里,就是刚才做好的那个爆炸特效Actor
SpawnTransform: 可以理解为要生成的Actor的大小,旋转和缩放的数据.
CollisionHandlingOverride: 生成的时候是否检擦碰撞,以及检查规则.举个例子,如果不检查碰撞,直接把玩家生成在一个障碍物里,那么玩家就会卡住不能动弹了.
Default:默认
AlwaysSpawn, Ignore Collisions:不检查碰撞,直接生成.
Try To Adjust Location, But Always Spawn: 有碰撞冲突时,尝试调整位置,失败了也仍然生成.
Try To Adjust Location, Don't Spawn If Still Colliding:同上,只是失败了就不生成.
Do Not Spawn: 不生成.
我们这里因为碰撞都关闭了,所以选哪个都无所谓.
其他的选项在用到的时候再详细讲解.
然后设置生成的Transform信息. 我们就在原地生成,所以把这个PickUpItem_PlayFlipbook的Transform传进去即可.
保存编译. 现在拖一个到场景看看.(GIF帧率问题 可能会丢帧)
好了我们爆炸Actor就算是完成了.
接下来是制作连环爆炸的桥.
为了能够实现连环爆炸的桥,我们需要制作连环触发器.
基本思路就是A被触发后,找到下一个被触发对象B,然后等待一段时间,触发B,B再触发C这样.
现在新建一个Actor蓝图,我们来做一个链式触发器的基类.
先讲一下思路.
我们需要新建两个事件,DoTrigger 和 OnTrigger.
DoTrigger 是从外部触发事件,通常是由触发链中上一个触发器,或者其他系统的主动触发,例如我们的PickUp类.
OnTrigger 触发通知. 触发以外的逻辑我们都在这里处理. 例如生成爆炸动画,然后摧毁桥梁.
然后新建一个变量.
变量可以理解成一个这个蓝图的属性,一个成员.
举个例子,我们有一个类,叫做学生.
学生有好几个属性,如姓名,年龄,性别.
每个学生都有这个属性,但是这个属性都是每个人都不太相同.
所以我们这里的变量,是连锁反应的下一个触发器.
然后设置类型为ChainTriggerBase类型
其中,
的作用就是可以在生成的实例上编辑这个属性. 也就是说我们可以直接在场景摆好的Actor上改变这个属性的值了.
接下来,再介绍一个节点:
Delay 延迟结点.
这个节点顾名思义,就是等待多少秒之后再继续后面的流程.
但是如果多次触发同一个Delay结点,并且当前还在倒计时阶段的时候,就不会继续后面的流程了.
比如,我设置了Delay的Duration(持续时间)为1秒,但是我多次触发了这个Delay,只要它还没结束倒计时,就不会继续后面的内容了.
接下来 我们再创建一个属性,用来保存延迟时间:
这个小眼睛和
是一样的.
我们把逻辑串联起来.
但其实这里会有一个问题.
如果下一个触发器没有指定,那么这里就会报错了. 因为引擎不知道要触发谁的DoTrigger
UE4的蓝图中,出现这种情况,会报错.但是如果是C++,这种情况会直接崩溃啦!
一定要养成检查是否合法的习惯.
所以我们这样改:
这里再介绍一个结点:
这个结点是用来验证传入的Object是否是合法的. 如果合法,就走IsValid逻辑,如果不合法,就走IsNotValid.
Object这里不详细讲,Actor也是Object的一个子类,所以这个节点对Actor也有效.
最后,把OnTrigger也加进来.
因为我们的顺序是:
触发->生成爆炸特效->等待时间(一般是爆炸时间)->触发下一个桥体.
所以OnTrigger我们要放在触发之后,等待之前:
在触发完成之后,当前的触发器使命就完成了. 我们要销毁掉.
这个蓝图最终是这样:
接下来是激动人心的时刻,终于要开始做桥啦!
我们先创建一个子类:
双击打开后,调一下参数. 目前我们就只有一个参数,就是桥的爆炸时间. 我们改成0.5秒. 魂斗罗是多少秒? 我懒得去测了~
然后我们在这个Actor的蓝图中,在OnTrigger事件中Spawn一个爆炸特效.
如果你想在蓝图中添加事件的入口,点击Override:
这个桥体蓝图逻辑很简单
最后我们导入图片:
差点忘记,我们还少一个入口触发器---就是玩家走过去之后触发桥梁爆炸.
这个好说. 我们创建一个PickUpItem的子类,用来触发触发链.
这个的作用,就好比多米诺骨牌,你总得有人去推一下第一个,后面才会有连锁反应. 现在要做的就是那个发动的人.
这个Actor同理,也要创建一个属性,指定第一个触发的链式触发器:
同理,逻辑也很简单
现在桥梁所需的Actor我们都准备好了.
我们把桥梁摆到场景里.
在拖动过程中,按住Shift+Alt就可实现复制多份.
Shift+拖动时复制,
Alt是跟随你当前的选择.
操作方法是Shift+Alt+鼠标按下拖动,松开鼠标后完成一次复制.
但是现在好多白色的球挡住了视线,我们可以把它改小一点:(按住Ctrl点击来多选)
现在要把图替换掉.
最后桥梁是这样:
然后我们再拖入触发器:
因为太小了 所以我们要调大一点:(通过直接调整触发球的半径)
最后就是在场景中设置触发器,桥梁之间的关系了.
首先,我们要把PickUp触发器和桥头关联起来:
注意看这里
就是选择成功了.
同样,桥梁之间的顺序也是这样选择:(在场景中用右键拖拽来实现场景移动)
现在,做最后的三个调整.
1:层级关系. 因为爆炸特效和桥体在同一个Y值,所以可能会造成爆炸效果消失的问题.(可能会出现在桥后方,被挡出了)
2:爆炸的大小调整. 现在的爆炸太小了.不显眼.
3:时间调整.调整爆炸的播放速度. 一座桥0.5秒爆炸,那就是
0.5秒 / 4帧 = 0.125秒/帧, 那1秒就是8帧.
要改层级关系,就要先改爆炸动画蓝图. 从第一节教程我们知道,Y值越大,越靠前.
所以我们改一下蓝图中的图片位置. 打开BP_Explosion:
只要大10就足够了.
然后是缩放. 同理,我感觉扩大3倍差不多了吧.
修改缩放的时候,如果这个小锁是锁住的状态,那么我们改一个数值,其他的值也会一起改便.这是方便保持比例.如果要做不等比的缩放,点击小锁,解锁后配置各个轴上的缩放.
最后,更改动画播放速率. 打开我们的Flipbook:
保存 然后运行!
知乎视频www.zhihu.com这一节教程就到此为止啦~
https://github.com/NexusEast/TreasureLegendgithub.com项目源文件再Github上 需要的可以自己去取.
这一次的作业是:
魂斗罗的桥在爆炸的时候其实不止一个爆炸特效,是多个爆炸特效叠加的.
试试看实现那种效果.