UE5蓝图学习——攻击、hitbox与HP条
本文说明了在尝试使用蓝图进行UE5实现一个ACTdemo时学习的相关内容。
1.Attack初步实现

实现如上图所示,攻击时不能移动功能待继续完善,现在还未能实现这个功能。
UE5中第三人称模板自带摄像机和移动,所以从简单的播放攻击动画开始做起。这个蓝图很简单,不做过多阐述。

如上图所示,在变量中新建了一个Actor类的对象数组Hit Actors This Swing,当一次重叠(攻击到敌人)发生时,先进行一次判断:1.是否重叠对象是自身,若不是再继续,不然角色的剑碰到自己的手也算hit,显然不符合我们想要的效果。
之后Cast到BP_Enemy,也就是敌人,因为我们要把Apply Damage的对象设成敌人。这里再进行一次判断:Hit Actors This Swing是否包含Other Actor,即这次碰到的对象是否已经碰到过了,也就是我们介定“单次攻击”的方式。若否,这是本次碰撞第一次判定到敌人,应用伤害,否则直接结束,因为在此之前已经通过同类方式结算过伤害。
这里可能很抽象,举个例子,如果不进行这一次判定,你的一次攻击可能同时碰到一个敌人的头、身体和腿,这样会造成三次伤害,这不符合我们的预想。
最后不要忘了将Other Actor加入Hit Actors This Swing。
这样,我们每次攻击前就要记得清除该数组中的内容,这一步也可以放在hitbox的碰撞设置中完成。
2.hitbox
关于hitbox,使用UE5盒体碰撞组件,设置一下“碰撞预设”这个属性,让你的hitbox只能和你想要的类型产生Overleap即可,注意这里是双向的,敌人也要设置。
hitbox应该在攻击动画某一刻(挥刀)开始有碰撞体积,然后在攻击动画结束(收到)时不再有碰撞体积。这是因为常态下若有碰撞体积,可能跑步的时候你的刀碰到敌人就会造成伤害。
蓝图很简单,就是在攻击动画中设置两个Notify,然后在这两个时刻分别在角色的动画类(注意是动画类的)事件列表中实现对应逻辑。
这里有个待解决的问题,就是我手动设置的Notify无法在动画类中找到,这里没办法只好用预设的代替,后续再看看是哪里出了问题。
3.HP条
HP条的实现就相对复杂一些了,我们在敌人蓝图中设置HP和MAX_HP两个变量,然后再增加一个名为“HPWidghet”的控件组件。
显而易见,将HP调为最大HP。

呼应上面造成伤害的逻辑,首先将HP扣除造成伤害的值,此后首先判断HP是否小于0,若是,可以直接播放死亡动画,播报击杀消息。若否,则通知HPWidget应用更新函数,之后播放受击动画。

在敌人生成时,初始化HP条设置,并更新一次HP条,然后用图4的函数初始化HP的值。这些是敌人生成时就完成的工作,主要是让HP条的组件初始化,具体如何实现逻辑的,我们下面说。

主要也是调用WBP_EnermyHPBar这个对象的内置函数,下面会阐述这几个函数的实现。

刚刚的敌人蓝图中,我们将一些调用的部分封装起来便于理解,那么具体的实现就在于使用的HP条蓝图(这样方便复用),画布上就是简单的一个进度条和一个文本框,用于显示HP具体数字。

这是本demo目前为止最复杂的一个函数,我们先看下半部分,就是将HP/MaxHP的内容传递给文本框,然后将二者的商传递给进程条。里面增加了一个防对象无效的控制。
这个demo最初步的工作到此就告一段落了。
现在,demo中的角色已经可以移动、轻攻击、重攻击,并对敌人造成伤害,同步在HP条上显示了。