Unreal 5 实现丧尸伤害和死亡

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

  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音效,这个音效本身就玩家自己能听到,不需要播放位置处音效
在这里插入图片描述
然后播放一个相机抖动的效果
在这里插入图片描述
最后再从自己创建的变量数组中,选出一个动画,播放受击动画
在这里插入图片描述
因为受击动画的优先级比较高,需要最后设置
在这里插入图片描述
其实也可以按需要做成可以切换状态,这里就看需求了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8098.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】异常

文章目录 1. C语言传统的处理错误的方式2. C异常概念用法异常的抛出和匹配原则规则1情况2抛出异常位置最近的验证对象类型匹配的验证 规则3规则4 异常的重新抛出异常规范 1. C语言传统的处理错误的方式 错误处理机制: 1.终止程序 如:assert 断言终止 &a…

TX Text Control .NET for WPF 31.SP3 Crack

.NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款免版税、完全可编程的丰富编辑控件,它在专为 Visual Studio 设计的可重用组件中为开发人员提供了广泛的文字处理功…

[每日一水] Latex Tikz foreach 循环嵌套

\documentclass{article} \usepackage{tikz} \begin{document} \begin{tikzpicture} \foreach[count\i] \x in {20,18,...,2}\foreach[count\j] \y in {20,18,...,2}\node at (\i,\j) {\x \y}; \end{tikzpicture} \end{document}\node at (\i,\j) {\x \y}; 就是写文本的意思

Day.1 LeetCode刷题练习(最长公共前缀 C/C++两种解法)

题目: 例子: 分析题目: 主要目的:求出各个字符串的公共前缀 思路(本人解法): 用所给实例来看,不难看出我们可以直接以竖着对应来查看是否是公共前缀 , 这样就有了一…

【Python爬虫与数据分析】文件读写

目录 一、概述 二、txt文件读写 三、csv文件读写 四、Json文件读写 一、概述 读写模式: r:读数据w:覆盖写入a:追加写入rb:以二进制形式读出wb:以二进制形式写入ab:以二进制形式追加r、w、…

TypeScript 总结

文章目录 TypeScript 总结概述运行ts文件方式一方式二 基础声明变量类型数组元组联合类型取值限制 枚举类型any & unknownvoid & undefined类型适配 面向对象函数普通函数箭头函数可选参数默认参数 对象创建对象对象的类型限制 类和接口泛型简单使用多个泛型默认泛型类…

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天,继续加油 今日案例来源:csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额,输出实际付款金额。购货折扣率如下: 购货金额≤500元…

obs录制功能源码分析

录制按钮 界面文件: 主界面:OBSBasic.ui 中开始录制按钮的objectName 是 recordButton 槽函数: void OBSBasic::on_recordButton_clicked() {//1 输出模式是否被激活if (outputHandler->RecordingActive()) {bool confirm config_get_bool(GetGlo…

LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

先说总结 现算法已经开源,代码链接: GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM. 背景 SLAM(同时定位与地图构建)是一种让机器人在构建环境地图的同时,定位…

Spring整合Junit单元测试

1.Spring整合Junit单元测试 1.1 原始Junit测试Spring的问题 在测试类中,每个测试方法都有以下两行代码: ApplicationContext ac new ClassPathXmlApplicationContext("application.xml");BookDao bookDao (BookDao)ac.getBean("bookDa…

Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂&#xff0c;也可能很简单&#xff0c;今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 startDemo() {this.processing true// 创建复杂数据结构const data [];for (let i 0; i < 5000; i) {const innerArray [];for (let j …

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…