这一篇主要是实现玩家攻击丧尸可以造成伤害和自身血量为零时,丧尸可以死亡。丧尸也可以对玩家造成伤害,有攻击范围的判定。
这一篇的功能实现有四个功能:

  1. 丧尸被攻击掉血
  2. 丧尸死亡处理
  3. 玩家被攻击掉血
  4. 玩家死亡处理

丧尸被攻击掉血

子弹的修改

首先在子弹父类里面进行命中事件判断命中的类型是否为丧尸,我们之前在做射击功能时,实现了武器命中静态物体时根据物体表面的材质播放不同的粒子效果。现在需要增加对命中丧尸后的处理。

在击中丧尸函数里面,首先创建两个粒子特效,一个是血液飞溅的特效,另一个就是血雾的特效,来模拟真实射击后产生的效果

后面就是一个伤害的判定,从命中结果中获取命中的骨骼名称,如果是头部使用内置节点应用伤害100,如果其它部位应用伤害34,假如我设置丧尸血量为100,命中头部相当于一枪爆头,没有命中头部,三枪也能打死。

最后在命中的位置播放一个命中音效

给与物体冲量函数主要实现的是命中物体如果可以模拟物理效果,可以给与它一个冲击的效果。

最后记得将子弹销毁

丧尸蓝图的修改

首先修改丧尸蓝图的碰撞体,丧尸蓝图基于charactor蓝图制作,里面包含了两个碰撞体,一个是胶囊体的碰撞体,另一个是在模型上面的碰撞体。
在胶囊体上面,忽略掉相机,物理身体和子弹。忽略这三样很好理解,忽略相机是为了防止丧尸阻挡相机弹簧臂,物理身体是因为丧尸后续要模拟物理效果,忽略子弹是子弹击中胶囊体碰撞体不会触发事件,只有击中躯体才会触发命中事件。

在丧尸的网格体上面,我们要启用查询和物理,将身体设置为物理躯体,忽略相机,最重要的是要阻挡子弹,这样就可以实现子弹击中丧尸躯体会有事件的相应。

接下来,我们需要使用一个系统封装好的事件,事件任意伤害,这个事件可以在你受到任意伤害时被调用

事件首先判断减去受到的伤害后血量是否小于0,

小于0了以后,就要触发死亡,死亡只会触发一次

如果没有死亡,将播放受击动画,并降低移动速度,

定时器调用的函数 从受击状态恢复 关闭受击状态,恢复移动速度,以及,如果离得比较远,丧尸没有发现玩家,还会调用AI控制器的新事件,让控制器调用AI行为树去攻击玩家。

在AI控制器中,它也会去调用视觉感知回调后面的内容,主要是在丧尸没有发现玩家,被玩家攻击时,能够及时的去实现追逐攻击玩家事件。

有了状态变量,我们只需要在动画蓝图里面根据变量切换动画即可。这里我图省事,直接在动画蓝图去获取丧尸蓝图的变量的值去修改

动画蓝图的修改

状态机里面的状态切换也是根据变量直接切换

由于攻击和受击时,我设置了都可以在移动中进行,所以,状态内部的动画,我们需要进行动画混合,这里使用的是基于骨骼混合,只混合上半身,下半身使用默认移动的动画

丧尸死亡后处理

如果丧尸的血量小于0,会触发死亡事件,执行死亡的相关处理。

死亡事件中,先将死亡的变量设置为true,好多事件都需要在状态未死亡才会触发,并修改了移动速度和攻击状态。

然后开启了丧尸的物理模拟效果,并且关闭胶囊碰撞体,丧尸死亡后不能在阻挡角色。

关闭的追逐音效,并在一定时间后销毁actor

丧尸攻击玩家实现

要实现丧尸攻击范围的检测,丧尸默认不会持有武器的,所以,我们需要获取丧尸的胳膊肘和手这两个骨骼的世界坐标系下的位置,然后通过这两个起始坐标,生成一条检测区域来检测攻击时,胳膊是否接触到玩家。碰撞体接触到玩家角色,将给玩家角色蓝图应用一个伤害。

动画通知

首先,我们创建三个动画通知,通过丧尸攻击角色播放攻击动画时,触发查询事件,使用通道检查对玩家进行碰撞检测。三个通知分别是攻击开始,攻击结束,以及设置攻击检测的骨骼。

在动画里面,添加通知

第一个动画通知是设置的骨骼名称

两个骨骼名称分别是胳膊肘到中指

第二个动画通知是通知丧尸蓝图开始检测,在结束之前,将使用定时器一直循环调用伤害判定

第三个动画通知是通知丧尸蓝图结束检测,清除定时器,清除攻击中的角色变量。

丧尸蓝图实现伤害判定

在丧尸蓝图中,增加伤害判定事件,然后在动画通知里面创建的命名获取到场景中的位置,然后根据开始和结束位置生成

然后设置了一个角色变量,判断是否和上次的相同,保证每次攻击只触发一次伤害,如果是角色的攻击的话,还要更复杂一些,要做成数组,每次做循环判定。

如果角色是首次受到伤害,那将使用内置节点应用伤害,然后播放一个粒子特效,播放一个血雾特效,让角色产生受伤特效。

玩家受到攻击的处理

为了可以实现玩家ui上的血条有过渡的效果,需要两个血量的变量,一个是玩家的血量,另一个则是当前需要显示的血量。

在玩家受到伤害后,首先修改血量

ui上面的显示将使用一个时间轴去更新当前血量的值,这个值则是显示在ui上面的值

接下来判断血量如果小于0,则触发死亡

在处理死亡时,需要将状态修改为死亡状态,所以我们需要在状态枚举里面增加一个死亡枚举

在死亡事件中,先修改玩家的状态,然后开启角色模型模拟物理

死亡以后无法移动,禁用移动,并将胶囊体碰撞关闭

接下来要创造死亡镜头,我们额外创建一个弹簧臂和相机,专门用作死亡用

弹簧臂关闭碰撞检测,将单独运行

死亡用相机将设置默认不激活

死亡时,激活死亡相机

我们还需要设置死亡时,武器从身上掉落,模拟物理的效果,所以需要在武器蓝图上面实现物理模拟

在死亡时,判断是否持有相关部位的武器,然后从角色身材分离,模拟物理

我们还需要一个时间轴,设置播放时间为五秒,过渡为从0到1,用于播放死后后的动画。
首先将死亡相机的弹簧臂从默认的三百向远处拉长,设置到2000过渡。

拖出死亡相机,然后右键设置后处理设置的配置项,这个主要用于修改死亡后的屏幕后处理特效。

然后将后期处理设置拖出线,然后点击创建,即可创建一个设置项的配置

在设置上面,我们可以根据需要,将相关配置的引脚向外

这里修改的是色彩矫正,还有色彩分离的效果,然后使用时间轴去修改强度

前两个是需要传入四维变量设置,xyz分别对应rgb三通道,w是整体强度的设置

玩家受击效果

受到攻击时,播放一个2d音效,这个音效本身就玩家自己能听到,不需要播放位置处音效

然后播放一个相机抖动的效果

最后再从自己创建的变量数组中,选出一个动画,播放受击动画

因为受击动画的优先级比较高,需要最后设置

其实也可以按需要做成可以切换状态,这里就看需求了。