当前位置: 首页 > news >正文

47. UE5 RPG 实现角色死亡效果

在上一篇文章中,我们实现了敌人受到攻击后会播放受击动画,并且还给角色设置了受击标签。并在角色受击时,在角色身上挂上受击标签,在c++里,如果挂载了此标签,速度将降为0 。
受击有了,接下来我们将实现角色的死亡逻辑,角色血量为0或者小于0时,我们将触发它的死亡功能。

实现死亡

在战斗接口类里增加一个虚函数,=0 是我们无法创建函数的实现,必须在子类里面去覆写它。

virtual void Die() = 0;

在角色基类里面覆写

virtual void Die() override;

接着我们增加一个在每个客户端上执行的函数,被Die函数调用。
NetMulticast设置后,这个函数被调用时,将在服务器执行,然后复制到每个客户端。和它对应的还有(Server:只在服务器运行,Client:只在调用此函数的客户端运行)这种情况的函数实现需要在后面加上_Implementation
Reliable: 这是一个传输属性,表示该函数的数据应该以可靠的方式发送。

	UFUNCTION(NetMulticast, Reliable)virtual void MulticastHandleDeath();

这样Die函数只会在服务器调用,我们将只需要服务器调用的函数写到此函数内
比如武器分离,然后调用每个端都会运行的函数MulticastHandleDeath()

void ACharacterBase::Die()
{//将武器从角色身上分离Weapon->DetachFromComponent(FDetachmentTransformRules(EDetachmentRule::KeepWorld, true));MulticastHandleDeath();
}

在MulticastHandleDeath()函数里,我们开启武器和角色的模拟效果,并关闭碰撞体的碰撞,防止它影响武器和角色

void ACharacterBase::MulticastHandleDeath_Implementation()
{//开启武器物理效果Weapon->SetSimulatePhysics(true); //开启模拟物理效果Weapon->SetEnableGravity(true); //开启重力效果Weapon->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); //开启物理碰撞通道//开启角色物理效果GetMesh()->SetSimulatePhysics(true); //开启模拟物理效果GetMesh()->SetEnableGravity(true); //开启重力效果GetMesh()->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); //开启物理碰撞通道GetMesh()->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); //开启角色与静态物体产生碰撞//关闭角色碰撞体碰撞通道,避免其对武器和角色模拟物理效果产生影响GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}

在敌人里面,我们需要额外实现一些内容,就是小怪死亡后,我们要在一定时间后将其清除掉。

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Combat")float LifeSpan = 5.f; //设置死亡后的存在时间

在敌人基类里面也覆盖Die函数,并在死亡时设置它的清除时间

void AEnemyBase::Die()
{SetLifeSpan(LifeSpan);Super::Die();
}

接下来在AttributeSet的PostGameplayEffectExecute函数里,增加Die函数调用的逻辑处理,我们在死亡时调用即可

	if(Data.EvaluatedData.Attribute == GetIncomingDamageAttribute()){const float LocalIncomingDamage = GetIncomingDamage();SetIncomingDamage(0.f);if(LocalIncomingDamage > 0.f){const float NewHealth = GetHealth() - LocalIncomingDamage;SetHealth(FMath::Clamp(NewHealth, 0.f, GetMaxHealth()));const bool bFatal = NewHealth <= 0.f; //血量小于等于0时,角色将会死亡if(bFatal){//调用死亡函数ICombatInterface* CombatInterface = Cast<ICombatInterface>(Props.TargetAvatarActor);if(CombatInterface){CombatInterface->Die();}}else{//激活受击技能FGameplayTagContainer TagContainer;TagContainer.AddTag(FMyGameplayTags::Get().Effects_HitReact);Props.TargetASC->TryActivateAbilitiesByTag(TagContainer); //根据tag标签激活技能}}}

接着可以编译运行,我们攻击敌人,查看它死亡时是否能够模拟布娃娃效果,并且在设置的清除时间后,被正确清除
在这里插入图片描述

溶解材质

死亡效果已经实现了,但是小怪死亡定时直接清除掉,显得太突兀,大部分游戏中的做法就是使用溶解效果来实现它的缓慢消失的效果。
所以我们需要一个溶解材质,在UE里面,我们可以通过连连看来实现蓝图类型的节点实现此功能。
首先,我们创建一个材质
在这里插入图片描述
我们需要一个透明裁剪的材质,将混合模式修改为已遮罩(Masked)
在这里插入图片描述
溶解需要一个值来控制它平滑的过渡,但是每个材质的溶解的范围不同,所以,我这里设置了两个值开始结束,然后用lerp实现从开始到结束的溶解过程。
在这里插入图片描述
然后从一张扰动图上面获取颜色进行对比度增强,获取到透明度值,我们可以通过修改溶解值来实现渐变过程。
在这里插入图片描述
CheapContrast是简单的调整对比度的节点函数,第一个传入颜色,第二个传入对比强度来获取增加对比度后的结果。
在这里插入图片描述
然后我们还需要一个就是溶解边缘发光的效果,这个将透明度作为UV的U去采样另外一张扰动图,然后增强对比度,获取到边缘设置到自发光上面实现效果。
在这里插入图片描述
材质我们设置了,如何查看放到模型上面的效果呢,我们可以在MI(材质实例)这里选择预览网格体进行查看
在这里插入图片描述
然后调整start和end的值,保证Dissolve能够在0的位置时没有溶解效果,而Dissolve值变为1时,角色被全部溶解掉
在这里插入图片描述

实现溶解效果

溶解材质我们有了,接下来就是如何实现从普通材质切换到溶解材质,并实现通过程序修改Dissolve溶解的数值。
我们打开敌人的骨骼网格体,发现它身上就一个材质,我们需要通过代码去实现切换模型的材质并实现对材质的属性修改。
在这里插入图片描述
打开角色基类,我们在里面增加两个参数,用于设置角色和武器的溶解材质

	UPROPERTY(EditAnywhere, BlueprintReadOnly)TObjectPtr<UMaterialInstance> DissolveMaterialInstance;UPROPERTY(EditAnywhere, BlueprintReadOnly)TObjectPtr<UMaterialInstance> WeaponDissolveMaterialInstance;

然后增加一个溶解函数,在角色死亡时调用

void Dissolve(); //溶解效果

溶解是需要一个时间过程,我准备在蓝图里面实现时间轴,这样比较方便,所以增加一个蓝图实现的函数,这个函数在代码里调用,在蓝图实现。参数我们设置了一个数组,因为不确定有几个材质需要修改,有可能只有一个角色的,有可能角色和武器两个,所以,我们直接传递数组去修改。

	UFUNCTION(BlueprintImplementableEvent)void StartDissolveTimeline(const TArray<UMaterialInstanceDynamic*>& DynamicMaterialInstance);

然后在溶解的实现这里,我们首先判断是否设置了对应的材质,如果设置了,则创建一个实例设置给角色,然后将材质添加到数组中,最后调用时间轴函数

void ACharacterBase::Dissolve()
{TArray<UMaterialInstanceDynamic*> MatArray;//设置角色溶解if(IsValid(DissolveMaterialInstance)){UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this);GetMesh()->SetMaterial(0, DynamicMatInst);MatArray.Add(DynamicMatInst);}//设置武器溶解if(IsValid(WeaponDissolveMaterialInstance)){UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(WeaponDissolveMaterialInstance, this);Weapon->SetMaterial(0, DynamicMatInst);MatArray.Add(DynamicMatInst);}//调用时间轴渐变溶解StartDissolveTimeline(MatArray);
}

最后就是在死亡函数中,调用溶解

void ACharacterBase::MulticastHandleDeath_Implementation()
{//开启武器物理效果Weapon->SetSimulatePhysics(true); //开启模拟物理效果Weapon->SetEnableGravity(true); //开启重力效果Weapon->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); //开启物理碰撞通道//开启角色物理效果GetMesh()->SetSimulatePhysics(true); //开启模拟物理效果GetMesh()->SetEnableGravity(true); //开启重力效果GetMesh()->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); //开启物理碰撞通道GetMesh()->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); //开启角色与静态物体产生碰撞//关闭角色碰撞体碰撞通道,避免其对武器和角色模拟物理效果产生影响GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);//设置角色溶解Dissolve();
}

代码部分我们已经完成了,接下来编译打开UE,在敌人基类里面覆写StartDissolveTimeline
在这里插入图片描述
创建一个时间轴
在这里插入图片描述
修改好名称,我们每次调用让其冲开始位置更新
在这里插入图片描述
双击时间轴打开,然后添加一个轨道,重新命一个名称
在这里插入图片描述
鼠标右键可以添加关键帧
在这里插入图片描述
添加完关键帧可以点击此处自动缩放
在这里插入图片描述
记得选中所有的点让其自动圆滑处理
在这里插入图片描述
处理完成,我们得到了一条圆滑的曲线时间轴
在这里插入图片描述
这样我们就完成了时间轴的制作。退出以后我们让时间轴去更新材质,这里有个小技巧就是可以增加线的固定点,让线不那么复杂
在这里插入图片描述
因为程序不知道材质里面的参数,所以,我们需要使用设置浮点型的参数
在这里插入图片描述
在材质上面,也显示了当前参数的类型,我们只需要将Dissolve修改从0到1就可以实现这个,在时间轴里面的值也是这么设置的。
在这里插入图片描述
我们只需要遍历数组设置对应的材质即可。
在这里插入图片描述
完成以后,我们需要在对应的敌人类里面去设置对应的角色和武器的材质
在这里插入图片描述
接下来就是运行测试效果了,如果效果正确,证明我们实现了对应的效果
在这里插入图片描述

相关文章:

47. UE5 RPG 实现角色死亡效果

在上一篇文章中&#xff0c;我们实现了敌人受到攻击后会播放受击动画&#xff0c;并且还给角色设置了受击标签。并在角色受击时&#xff0c;在角色身上挂上受击标签&#xff0c;在c里&#xff0c;如果挂载了此标签&#xff0c;速度将降为0 。 受击有了&#xff0c;接下来我们将…...

C语言/数据结构——每日一题(环形链表)

一.前言 今天在力扣上刷到一道链表题——环形链表https://leetcode.cn/problems/linked-list-cycle 想着和大家们分享一下。让我们直接开始今天的分享吧。、 二.正文 1.1题目描述 1.2题目分析 这道题是想让我们做出分析&#xff0c;该链表是不是带环链表&#xff0c;如果是…...

vue:网页icon无法显示

logo文件放在public文件夹下&#xff0c;在html里设置icon。 本地源码运行后发现网页icon无法显示我们设置的logo&#xff0c;而是显示了浏览器默认icon。 这个问题不需要解决&#xff0c;部署后网页icon显示就正常了。...

电脑设置在哪里打开?Window与Mac双系统操作指南

随着科技的不断发展&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;对于许多初学者来说&#xff0c;如何找到并熟悉电脑的设置界面可能是一个挑战。特别是对于那些同时使用Windows和Mac双系统的用户来说&#xff0c;更是需要一篇详尽的指南来…...

【linux】海量小文件的存储方案

在介绍海量文件存储之前&#xff0c;需要先介绍一下常见的系统里面文件是如何存储的 文件inode 在linux下&#xff0c;每个文件或者目录&#xff0c;都会分配一个inode(index node)&#xff0c;它不存储具体的文件内容&#xff0c;而是记录该文件的基础信息。每个inode大小一…...

【SpringBoot整合系列】SpringBoot整合RabbitMQ-基本使用

目录 SpringtBoot整合RabbitMQ1.依赖2.配置RabbitMQ的7种模式1.简单模式&#xff08;Hello World&#xff09;应用场景代码示例 2.工作队列模式&#xff08;Work queues&#xff09;应用场景代码示例手动 ack代码示例 3.订阅模式&#xff08;Publish/Subscribe&#xff09;应用…...

MySQL————创建存储过程函数

存储过程使用大纲 有参数传递 delimiter $$ 声明一个名称为get_student_introduce create procedure add_student_infor( in p_userName VARCHAR(20),in p_phone VARCHAR(11),in p_sex char(2),in p_introduce VARCHAR(255)) 开始操作 BEGIN 撰写真正在操作DMLDQL都行 INSE…...

数据赋能(86)——数据要素:管理核心框架

数据管理的核心框架是一个综合性的体系&#xff0c;旨在确保数据的有效利用、安全性以及合规性。这个框架主要包含了以下几个关键组成部分&#xff1a; 数据治理策略与目标&#xff1a;明确数据管理的整体战略和目标&#xff0c;包括数据价值的释放、数据资产地位的确定、多元…...

测试的基本概念

什么是软件测试 软件测试它就是一个过程测试就是对软件的全方位进行全面的校验.通过测试技术验证软件是不是符合用户的信息. 测试和开发的区别 在工作上的区别: 开发人员通过编程技能来开发和实现这个软件. 测试人员通过测试技能来验证软件是否符合用户需求. 在技术上的要求…...

Python多线程加速-休眠部分线程

总所周知Python由于GIL的问题&#xff0c;使用多线程时同一时刻只有一个线程在工作。故Python会在所有线程之间不断的切换&#xff0c;每切换到一个线程会执行一段字节码指令然后切换到另一个线程。如果开启了很多线程&#xff0c;且只有小部分线程在工作&#xff0c;如果不休眠…...

B+树(B+ Tree)

B树&#xff08;B Tree&#xff09;是一种对B树&#xff08;B-Tree&#xff09;的改进版本&#xff0c;它在数据库系统和文件系统中作为索引结构得到了广泛的应用&#xff0c;特别是在磁盘存储的场景下。B树保留了B树的基本特征&#xff0c;如自平衡、多路分支等&#xff0c;但…...

【Linux】了解信号产生的五种方式

文章目录 正文前的知识准备kill 命令查看信号man手册查看信号信号的处理方法 认识信号产生的5种方式1. 工具2. 键盘3. 系统调用kill 向任意进程发送任意信号raise 给调用方发送任意信号abort 给调用方发送SIGABRT信号 4. 软件条件5. 异常 正文前的知识准备 kill 命令查看信号 …...

【nuxt3国际化i18n】vue3+nuxt3+vite+TS国际化的正确做法

1、创建nuxt3请看Nuxt3官网 2、下面是添加i18n的叫教程&#xff0c;适用于企业前端项目。 添加依赖 依赖 yarn add vue-i18n yarn add nuxtjs/i18nnext -D配置文件nuxt.config.ts //nuxt.config.ts export default defineNuxtConfig({modules: [nuxtjs/i18n,],i18n: {stra…...

数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)

数据库管理185期 2024-05-08 数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储&#xff08;20240508&#xff09;1 上期示例说明2 两个参数2.1 NEST/UNNEST2.2 CHECK/NOCHECK 3 一数多用3.1 以用户维度输出订单信息3.2 以产品维度3.3 以产品种类维度 4 美化输出总结 数…...

7 zip 介绍

7-Zip是一款广受好评的开源文件存档与压缩工具&#xff0c;支持高比率的压缩&#xff0c;适用于Windows、Linux和macOS等多种操作系统平台。以下是关于7-Zip的详细介绍&#xff1a; - **高压缩比**&#xff1a;7-Zip最显著的特点是其提供的高压缩率&#xff0c;尤其是使用其独…...

前端页面 贴边拖拽 盒子

vue 悬浮球(带自动吸附功能)_vue悬浮球-CSDN博客...

【408真题】2009-10

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…...

WebSocket概述

TCP和HTTP规范有连接超时一说&#xff0c;所以长轮询并不能一直持续&#xff0c;服务端和客户端的连接需要定期的连接和关闭再连接。 WebSocket在请求头中有一个Connection:Upgrade字段&#xff0c;表示客户端想对协议进行升级&#xff0c;还有一个Upgrade:websocket字段&…...

人机协同是虚拟与真实的协同

“人机协同”是指人类与机器之间的合作与协同工作。在这种协同中&#xff0c;机器可以作为助手、辅助或扩展人类的能力&#xff0c;帮助人们完成任务&#xff0c;提高工作效率和质量。 虚拟与真实的协同是指在人机协同的过程中&#xff0c;虚拟想象世界和真实世界之间的协同。通…...

【编程向导】Docker-常用命令

常用命令 管理命令 管理命令说明builder管理构建config管理配置container管理容器context管理上下文engine管理引擎image管理镜像network管理网络node管理 Swarm 节点plugin管理插件secret管理 Docker secretsservice管理服务stack管理 Docker stacksswarm管理 Swarm 集群sys…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...