ue4 时间轴是什么意思_UE4 傻瓜教程? -2 用UE4制作魂斗罗的桥

0d5401680ff7b5275f3398130f5f1856.png

上一篇教程完成之后,有不少人给我反馈,还蛮开心的.

有兴趣的看看上一篇:

Vinni.D:UE4 傻瓜教程? -1​zhuanlan.zhihu.com

从这一节教程开始,我尽量用GIF来演示过程,方便大家理解.所以会有很多动图,流量不够的建议wifi看~

反馈的有一个人提到的我觉得很有趣,他说如果把金币改成一个平台,那我踩在上面平台就没有了,就会掉下去,然后说和FC上魂斗罗一代的第一关桥很像.

我觉得很有意思,所以打算第二篇教程主要实现这座桥.

4365f3ca0016077072135710539efcac.png

我找朋友切好了图片:

0753e531c0fd4e6d8a9e0b990989ec3a.png

为了研究这个 我专门又玩了一下魂斗罗,发现原来只要你到达某个位置,不管你碰没碰那座桥,都会开始爆炸:

88c2a003f517da1ffce4a03e823cd9b5.gif

这种也没问题 我们就按照这种的实现好了.

上一节我们实现的是单个触发,现在我们试试链式触发.

先把我们的资源导入到项目中:

a8581e55e47456b1e0fa3d1f9092dc6b.gif

这里导入后做了两个操作.

1:应用设置

0cec7fe963c6100e94012f5bc85c396e.png

这一步操作是更改贴图属性. 当一个图片被拖进引擎后,会被识别为贴图类型保存下来.

由于像素风格的图片本身分辨率很小,使用默认的配置,放大后会很模糊:

a4e213be32862718d23918c9965b3633.png
72X72的图放大后变得很模糊了.

在应用这个设置后,效果就很明显了:

4bafc342e8f9b36bdb8f9039b3e772c6.png

2:生成了Sprite.

贴图本身是没有办法放置到场景中的.

同样的道理,我们导入爆炸的图片.

95d5ac66e68513efb4f10e93e9f2b447.png

接下来我们制作一个爆炸特效.

爆炸特效有很多种实现方式,其中一种是使用Particle(例子系统)实现,另一种是自己做一个帧动画的Actor实现.

如果用Particle(粒子系统)实现,那我还要讲很多关于粒子编辑器的内容,这并不是本节的重点. 以后我会专门用一节教程详细讲粒子系统. 我们现在用普通的actor来实现爆炸特效吧.

我们创建一个Flipbook.

什么是Flipbook?

理解 Paper 2D Flipbooks(简称 Flipbooks)的最佳方式是把它看做一种手绘动画的表现形式。原理是一系列有细微不同之处的图片快速“翻过”,从而产生动画的效果。在虚幻引擎 4 中,Flipbooks 由一系列关键帧组成,每帧均包含一个需要展示的 Sprite和展示时长(以帧数为单位)。 每秒帧率选项将决定帧的播放速度,确定每秒中存在多少动画“节奏”;可在 细节面板中编辑关键帧,或使用 Flipbook 编辑器下方的 时间轴进行编辑。
理解Paper 2D Flipbooks​docs.unrealengine.com

f1237367b96ac0a80651d20aa089a0a4.gif

打开我们刚才创建的Flipbook,把我们剩下的几帧也拖进去:

e73d2a4a648f578433b778a61373c512.gif

这样就做好了爆炸的动画.

我们把这个FB拖入到场景 可以看到效果了. 但是它会无限循环播放,我们要的是播放一次然后就消失.所以我们要制作一个播放一次就把自己销毁的Actor.

70de2182b8384d5df8ed90e9a97e3b9f.gif

新建一个Actor 命名完成之后打开

318c935a8a6c6c89b2f41b337f2d0a21.png

把我们刚才创建好的爆炸FB拖进去:

0d273eaa9a121d46eaa35ed1cc28d7f7.gif

设置碰撞. 默认的Sprite或者Flipbook都是有碰撞的. 比如上一节我讲的金币.如果把金币的Sprite调到比触发范围大,那就永远触发不了了.

所以我们要把碰撞全部关. 他本来就是一个表现的东西,不需要能够挡住玩家的去路.

0ef7fac916489187ed3571e6db4d0323.gif

然后我们制作简单的蓝图逻辑.

基本思路就是,获取这个Flipbook播放一次的时间长度,然后在这个时间之后销毁这个actor.

UE4中,所有的Actor都有个叫做Lifespan的属性,就是这个Actor的寿命时间.这个时间默认是0.

如果是默认值0,那这个Actor的寿命是无限的,只要你不主动销毁它,它就一直在那里.

这个就正好用来制作我们的逻辑. 我们获取到Flipbook的时间长度,然后赋予给Lifespan,然后Actor在这个时间长度之后会自动销毁. 也就是刚好4帧播放一遍就没了.

75a6bfb9e378718857458ee0c270ef68.gif

验证一下我们刚制作的Actor.

现在我们新建一个基于PickUpItem_Base的子类. 这个的作用是当你走过之后,播放一个Flipbook动画.

4d5552fa976b3066e78efa529f56eb8a.gif

创建好后 打开蓝图 我们开始写逻辑.

我们的这套PickUp系统,有一个OnPicked事件.

在玩家走过去的时候,就会调用这个事件. 我们的逻辑就写在这里.

这里介绍一个非常重要的概念:SpawnActor

他的意思就是生成一个Actor在场景里.

f1af40cd1b9ddb7b53173e898c393533.png

Class:你需要在场景中生成的类. 在我们这里,就是刚才做好的那个爆炸特效Actor

SpawnTransform: 可以理解为要生成的Actor的大小,旋转和缩放的数据.

CollisionHandlingOverride: 生成的时候是否检擦碰撞,以及检查规则.举个例子,如果不检查碰撞,直接把玩家生成在一个障碍物里,那么玩家就会卡住不能动弹了.

884cc56da3ae127b2a7735c8a2abb50e.png

Default:默认

AlwaysSpawn, Ignore Collisions:不检查碰撞,直接生成.

Try To Adjust Location, But Always Spawn: 有碰撞冲突时,尝试调整位置,失败了也仍然生成.

Try To Adjust Location, Don't Spawn If Still Colliding:同上,只是失败了就不生成.

Do Not Spawn: 不生成.

我们这里因为碰撞都关闭了,所以选哪个都无所谓.

其他的选项在用到的时候再详细讲解.

dac8764edb76970054415a9db6cf6f7a.gif

然后设置生成的Transform信息. 我们就在原地生成,所以把这个PickUpItem_PlayFlipbook的Transform传进去即可.

54e21c3cefe46fa137d401a7671475c8.gif

保存编译. 现在拖一个到场景看看.(GIF帧率问题 可能会丢帧)

c1f4c126ce623be895559ccf9dcc41c2.gif

好了我们爆炸Actor就算是完成了.

接下来是制作连环爆炸的桥.


为了能够实现连环爆炸的桥,我们需要制作连环触发器.

基本思路就是A被触发后,找到下一个被触发对象B,然后等待一段时间,触发B,B再触发C这样.

现在新建一个Actor蓝图,我们来做一个链式触发器的基类.

d195f1b7c7f9403fd3e61fe9d45c2b07.png

先讲一下思路.

我们需要新建两个事件,DoTrigger 和 OnTrigger.

b1157bf81f5e8c78c8beb789ea58045a.png

DoTrigger 是从外部触发事件,通常是由触发链中上一个触发器,或者其他系统的主动触发,例如我们的PickUp类.

OnTrigger 触发通知. 触发以外的逻辑我们都在这里处理. 例如生成爆炸动画,然后摧毁桥梁.

然后新建一个变量.

变量可以理解成一个这个蓝图的属性,一个成员.

举个例子,我们有一个类,叫做学生.

学生有好几个属性,如姓名,年龄,性别.

每个学生都有这个属性,但是这个属性都是每个人都不太相同.

所以我们这里的变量,是连锁反应的下一个触发器.

1c0c3d49d97e2a4626390ed98b63adab.gif
新建一个变量

然后设置类型为ChainTriggerBase类型

74ddc50fc17bccfca3a767b67247f883.gif

其中,

f5a915cdb828dede8f2d03f3bbb9d287.png

的作用就是可以在生成的实例上编辑这个属性. 也就是说我们可以直接在场景摆好的Actor上改变这个属性的值了.

接下来,再介绍一个节点:

d0d65c7efa1e1da8fd48811f869cfce8.png

Delay 延迟结点.

这个节点顾名思义,就是等待多少秒之后再继续后面的流程.

但是如果多次触发同一个Delay结点,并且当前还在倒计时阶段的时候,就不会继续后面的流程了.

比如,我设置了Delay的Duration(持续时间)为1秒,但是我多次触发了这个Delay,只要它还没结束倒计时,就不会继续后面的内容了.

接下来 我们再创建一个属性,用来保存延迟时间:

85b53bcdd2039015b1d6a9808fd70838.gif

9d3f831cf8558bfd49eff5058716e662.png

这个小眼睛和

f5a915cdb828dede8f2d03f3bbb9d287.png

是一样的.

我们把逻辑串联起来.

696dba83a9cdddc67ffea987626fda6c.gif

但其实这里会有一个问题.

如果下一个触发器没有指定,那么这里就会报错了. 因为引擎不知道要触发谁的DoTrigger

UE4的蓝图中,出现这种情况,会报错.但是如果是C++,这种情况会直接崩溃啦!

一定要养成检查是否合法的习惯.

所以我们这样改:

38e08b5b1513708193c5836575bc8c64.gif

这里再介绍一个结点:

6474f69b78bf6a0c4a18bf54904e2c39.png

这个结点是用来验证传入的Object是否是合法的. 如果合法,就走IsValid逻辑,如果不合法,就走IsNotValid.

Object这里不详细讲,Actor也是Object的一个子类,所以这个节点对Actor也有效.

最后,把OnTrigger也加进来.

因为我们的顺序是:

触发->生成爆炸特效->等待时间(一般是爆炸时间)->触发下一个桥体.

所以OnTrigger我们要放在触发之后,等待之前:

9f038bb753b8052a4681f4f23093d177.gif

在触发完成之后,当前的触发器使命就完成了. 我们要销毁掉.

这个蓝图最终是这样:

fba257012fdff41a4bc1da276655b761.png

接下来是激动人心的时刻,终于要开始做桥啦!

我们先创建一个子类:

8f28e3715437f60c09f8d5c609dd75b7.png

双击打开后,调一下参数. 目前我们就只有一个参数,就是桥的爆炸时间. 我们改成0.5秒. 魂斗罗是多少秒? 我懒得去测了~

48f03773e3b0af8a33d36b65e5ead111.gif

然后我们在这个Actor的蓝图中,在OnTrigger事件中Spawn一个爆炸特效.

如果你想在蓝图中添加事件的入口,点击Override:

be2cd5115a5e4f013e4762c24ddff9a0.png

这个桥体蓝图逻辑很简单

26105b6e32bcd5e86281a83adad8b329.png

最后我们导入图片:

bd780fdcf8a088441a1685df41a51e08.gif

差点忘记,我们还少一个入口触发器---就是玩家走过去之后触发桥梁爆炸.

这个好说. 我们创建一个PickUpItem的子类,用来触发触发链.

这个的作用,就好比多米诺骨牌,你总得有人去推一下第一个,后面才会有连锁反应. 现在要做的就是那个发动的人.

de0639c0ea8b3dc692efc92fd97da4f6.png

这个Actor同理,也要创建一个属性,指定第一个触发的链式触发器:

75717f273fb75919354fa22d057fa923.png

4930c657e9b602d8f8a6d9c4e3646fb0.png

同理,逻辑也很简单

933aac24fcf7102f403baae44e875ff7.png

现在桥梁所需的Actor我们都准备好了.

我们把桥梁摆到场景里.

在拖动过程中,按住Shift+Alt就可实现复制多份.

Shift+拖动时复制,

Alt是跟随你当前的选择.

操作方法是Shift+Alt+鼠标按下拖动,松开鼠标后完成一次复制.

d1339579271433f659c11bb111fc90ba.gif

但是现在好多白色的球挡住了视线,我们可以把它改小一点:(按住Ctrl点击来多选)

2010192b19e31710c5eb6cbd3c5d9099.gif

现在要把图替换掉.

v2-fc4d2c137d84aed62562491f842680ec_b.gif

最后桥梁是这样:

0ac2ca5b6a0874fc4dafc45f375198ce.png

然后我们再拖入触发器:

867672edc26b8f13a41e4fbfdc90fec6.gif

因为太小了 所以我们要调大一点:(通过直接调整触发球的半径)

f2fd7ebe3a8ac089be89b8197ae14153.gif

最后就是在场景中设置触发器,桥梁之间的关系了.

首先,我们要把PickUp触发器和桥头关联起来:

77e21671dd0d54f14114ef15f5e1b831.gif

注意看这里

d146409da9d42863360e701e959e6739.png

就是选择成功了.

同样,桥梁之间的顺序也是这样选择:(在场景中用右键拖拽来实现场景移动)

f455953ab023cead7693735064c667c1.gif

现在,做最后的三个调整.

1:层级关系. 因为爆炸特效和桥体在同一个Y值,所以可能会造成爆炸效果消失的问题.(可能会出现在桥后方,被挡出了)

2:爆炸的大小调整. 现在的爆炸太小了.不显眼.

3:时间调整.调整爆炸的播放速度. 一座桥0.5秒爆炸,那就是

0.5秒 / 4帧 = 0.125秒/帧, 那1秒就是8帧.

要改层级关系,就要先改爆炸动画蓝图. 从第一节教程我们知道,Y值越大,越靠前.

所以我们改一下蓝图中的图片位置. 打开BP_Explosion:

a9e78af2efb2559b0b08f00cd960880a.gif

只要大10就足够了.

然后是缩放. 同理,我感觉扩大3倍差不多了吧.

f0b04c5eb8b9e7e0302c35db01d9cce0.gif

修改缩放的时候,如果这个小锁是锁住的状态,那么我们改一个数值,其他的值也会一起改便.这是方便保持比例.如果要做不等比的缩放,点击小锁,解锁后配置各个轴上的缩放.

f79185c8d15f712c3512b49ed33ee72b.png

最后,更改动画播放速率. 打开我们的Flipbook:

f31b600daf98a69ba3678f44b8bd3e4b.gif

保存 然后运行!

知乎视频​www.zhihu.com

这一节教程就到此为止啦~

https://github.com/NexusEast/TreasureLegend​github.com

项目源文件再Github上 需要的可以自己去取.

这一次的作业是:

魂斗罗的桥在爆炸的时候其实不止一个爆炸特效,是多个爆炸特效叠加的.

试试看实现那种效果.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值