经典游戏 ue4 重制(3)小蜜蜂

这次向大家介绍如何实现小蜜蜂。

Level 布局如下,画面上部放置几个要消灭的怪物,下部放 Player Start,并且确保他们在同一平面里,另外添加一个俯视的摄像头。

GamoMode 如下,我们主要替换了 Pawn 和 Game State。

Image02.png

让我们首先来看看 Player_BP 吧。Player_BP 的 Event 和 Variables 如下。

Image03.png

Event 中包括通过响应鼠标移动控制 Player,鼠标点击时发射子弹,以及被敌弹击中时的伤害。我们用 Health 保存 Player 当前的生命值。

鼠标移动的事件处理如下,

可以看到就是将鼠标的位置映射到 Player 的位置。这里我们限定了只能在一根轴运动,如果希望用鼠标在二维空间中移动,做法也类似。

这是点击左键后发射子弹的处理,在当前 Player 上方 Spawn 一个 PlayerBullet_BP。PlayerBullet_BP 之后我们会详细介绍。

最后是 Player 被击中的处理,可以看到我们对当前 Health 值进行了计算,如果 Health 为零则播放一个爆炸效果,同时隐藏 Player,最后将 Player 的碰撞置为无效。

以上就是 Player 的操作。接下去让我们看看刚才提到的 PlayerBullet_BP。

在介绍 PlayerBullet_BP 之前,我们先建立一个 Bullet_BP 类。其中添加如下事件。

操作是一旦子弹击中物体,就对物体产生伤害,同时自我销毁。这里并没有判断子弹是击中了另一颗子弹,还是击中了玩家,或是一楼怪物打出的子弹击中了二楼的怪物,因为子弹打中了总会爆炸是吧。

另外,我们加入一个名为 MoveBullet 的函数,内容如下。

函数的输入是一个表示移动方向的矢量,以及移动的时间。我们根据这些输入,设置 Bullet 的位置。另外,当 Bullet 移动到规定的范围之外时,就自我销毁。

以 Bullet_BP 为基类,我们再生成两个 PlayerBullet_BP 和 EnemyBullet_BP,在其中设置不同的移动方向。将 Player 的子弹与怪物的子弹做成两个子蓝图的好处在于,我们可以为两者定制不同的 Component,以达到更好的游戏效果。

PlayerBullet_BP 的移动。

Image09.png

EnemyBullet_BP 的移动。

Image10.png

介绍完 Player,PlayerBullet,EnemyBullet,那显然要介绍 Enemy 了。

首先是在 Tick 中移动怪物。我们知道在小蜜蜂里,怪物的移动都是步调一致的。就是要么一起向左移动,直到最左面的怪物到达了左边界,要么一起向右移动。在这里我们用 DirectionY 表示怪物当前的移动方向,并且保存在 GameState 中。每个 Enemy 根据这个 DirectionY 进行移动,并且调用 ShotBullet 发射子弹。

Image02.png

上面是 Enemy 的碰撞处理。我们先判断一下是否是与 PlayerBullet 的碰撞,如果是的话,就爆炸并且自我销毁,
这里也确保了一楼怪物发出的子弹不会打掉二楼的怪物。和我们之前的几个游戏一样,这里也没有积分机制,有兴趣的同学可以自己做吧。

Image03.png

最后是发射子弹用的 ShotBullet。为了控制发射子弹的间隔时间,我们引入了一个 ShotTimer 变量,并且随机赋了
1-2 秒,每次 EventTick 中,我们会先计算一下距离下次发射还有多少时间,如果已经需要发射了,就 Spawn 一个 EnemyBullet。

看完各个 Actor BP 之后,让我们来看看 Level BP。

和以往一样,我们首先设置摄像机。

另外,我们需要两个函数,取得当前怪物移动的左边界和右边界。

这里我们调用了 GetAllActorOfClass 方法,得到所有怪物,然后在各个怪物的位置中,找到最右面的,并且将它的坐标保存在 MaxY 中。

同样我们用下面的方法得到最左边怪物的坐标。

最后,就是在 Tick 中,通过调用 GetMinY 和 GetMaxY,取得怪物的左右边界,如果他们超出了范围,则修改 DirectionY,使得怪物朝反方向移动。

至此小蜜蜂的游戏机制差不多了,下次介绍扫雷。


好棒~:cool: 经典游戏·

哈哈…好酷的感觉

能不能放个效果图出来啊,最终游戏是什么样子的

效果类似于第一张。。

厉害,学习了。。。。

棒棒的,学习了,感谢楼主

楼楼那个player_BP是继承什么类啊

pawn 哦 pawn 哦

很有用,学到了,感谢楼主