46. UE5 RPG 增加角色受击反馈

news2024/11/16 17:50:48

在前面的文章中,我们实现了对敌人的属性的初始化,现在敌人也拥有的自己的属性值,技能击中敌人后,也能够实现血量的减少。
现在还需要的就是在技能击中敌人后,需要敌人进行一些击中反馈,比如敌人被技能击中后,可以播放击中的动画,并且显示伤害值。
我们在这一篇文章中,实现敌人被英雄的技能击中时,会播放受击动画,并且在敌人身上添加一个受击标签,角色在受击时,根据标签判断设置移动速度

设置角色受击标签

首先,我们实现在敌人身上添加标签,我们需要通过GE去添加。
创建一个新的GE
在这里插入图片描述
命名为GE_HitReact
在这里插入图片描述
在里面设置持续时间设置无限时间,我们在技能里面应用它,然后在技能结束是,将其清除
在这里插入图片描述
现在,我们还没有受击对应的标签,在c++里添加一个

FGameplayTag Effects_HitReact; //受击 标签
GameplayTags.Effects_HitReact = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Effects.HitReact"),
		FString("受到攻击时,赋予的标签")
	);

然后在GE里面使用TargetTagsGameplayEffectComponent组件,它可以将标签应用到目标角色身上
在这里插入图片描述

角色监听标签并设置移动速度

我们接下来实现对受击标签的监听,在源码中,受击标签会返回监听的标签和添加标签的个数
在这里插入图片描述
在这里插入图片描述
我们创建一个委托回调函数

void HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount);

并创建变量来表示角色是否处于受击状态

UPROPERTY(BlueprintReadOnly, Category="Combat")
bool bHitReacting = false; //当前是否处于被攻击状态

UPROPERTY(BlueprintReadOnly, Category="Combat")
float BaseWalkSpeed = 250.f; //当前角色的最大移动速度

在AEnemyBase::BeginPlay()中,我们设置对监听函数的回调

AbilitySystemComponent->RegisterGameplayTagEvent(FMyGameplayTags::Get().Effects_HitReact, EGameplayTagEventType::NewOrRemoved)
 .AddUObject(this, &ThisClass::HitReactTagChanged);

如果数量大于0,则将其的移动速度设置为0

void AEnemyBase::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
	bHitReacting = NewCount > 0;
	GetCharacterMovement()->MaxWalkSpeed = bHitReacting ? 0.f : BaseWalkSpeed;
}

创建一个受击技能,并应用GE

接下来,我们创建一个新的技能,用来实现受击,是的,受击也是角色的技能。在角色受到攻击时,将触发角色受击技能来实现受击效果。
在这里插入图片描述
在技能触发时,我们将受击标签添加到角色身上,这样,之前监听角色标签的回调函数将触发,并设置移动速度,我们并将句柄保持,在技能结束时,方便移除GE
在这里插入图片描述

实现设置角色的受击蒙太奇动画

接下来,我们将实现角色受击时播放蒙太奇动画,为了保证通用性,我们将其设置为一个函数,并设置到战斗接口中,这样只需要在战斗接口中获取对应角色的蒙太奇即可。(每个角色的受击动画不一定一样)
首先在战斗接口中实现一个函数,这函数可以在蓝图中被覆写,也可以在蓝图中调用。

UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
UAnimMontage* GetHitReactMontage(); //获取受击蒙太奇动画

然后,我们在角色的基类里,对这个函数进行覆写。

virtual UAnimMontage* GetHitReactMontage_Implementation() override;

并增加一个参数用于设置蒙太奇

UPROPERTY(EditAnywhere, Category="Combat")
TObjectPtr<UAnimMontage> HitReactMontage;

在函数实现这里,直接返回蒙太奇

UAnimMontage* ACharacterBase::GetHitReactMontage_Implementation()
{
	return HitReactMontage;
}

接着在技能里面,将ASC控制的角色转换为战斗接口,从战斗接口调用函数获取到角色设置的蒙太奇进行播放
在这里插入图片描述
接下来就是基于动画创建蒙太奇
在这里插入图片描述
并将蒙太奇设置到角色身上,用于函数返回。
在这里插入图片描述

激活受击技能

接下来,就是我们实现对技能的激活,和上一篇一样,我们创建了一个敌人的DataAsset,我们希望可以将敌人所拥有的初始技能都设置在数据里,并在初始化时使用。
在CharacterClassInfo.h里增加一个参数,用于设置创建敌人时所拥有的初始技能

	UPROPERTY(EditDefaultsOnly, Category="Common Class Defaults")
	TArray<TSubclassOf<UGameplayAbility>> CommonAbilities;

之前英雄角色初始化技能我们创建了一个应用技能的函数
在这里插入图片描述
它是创建技能实例,并给与ASC,我们将给敌人创建一个通用的函数,并放到函数库中
在这里插入图片描述
在函数技能库里新增一个函数用于初始化角色技能

//初始化角色的技能
UFUNCTION(BlueprintCallable, Category="MyAbilitySystemLibrary|CharacterClassDefaults")
static void GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC);

函数实现就是获取到数据资产里面的技能列表,创建实例并给与角色

void UMyAbilitySystemBlueprintLibrary::GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC)
{
	//获取到当前关卡的GameMode实例
	const AMyGameModeBase* GameMode = Cast<AMyGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
	if(GameMode == nullptr) return;

	const AActor* AvatarActor = ASC->GetAvatarActor();

	//从实例获取到关卡角色的配置
	UCharacterClassInfo* CharacterClassInfo = GameMode->CharacterClassInfo;

	//遍历角色拥有的技能数组
	for(const TSubclassOf<UGameplayAbility> AbilityClass : CharacterClassInfo->CommonAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1); //创建技能实例
		ASC->GiveAbility(AbilitySpec); //只应用不激活
	}
}

在敌人基类里,开始事件时,我们调用函数库的初始化技能函数,将技能应用到角色身上

void AEnemyBase::BeginPlay()
{
	Super::BeginPlay();

	//设置角色的初始移动速度
	GetCharacterMovement()->MaxWalkSpeed = BaseWalkSpeed;

	//初始化角色的ASC
	InitAbilityActorInfo();

	//初始化角色的技能
	UMyAbilitySystemBlueprintLibrary::GiveStartupAbilities(this, AbilitySystemComponent);
	...

方便测试,在PostGameplayEffectExecute函数里,之前设置血量下面有判断,我们在角色没有被击杀时,让其触发受击技能。激活我们是使用的根据标签激活,它需要传入一个FGameplayTagContainer 类型的参数。

	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)
			{
				FGameplayTagContainer TagContainer;
				TagContainer.AddTag(FMyGameplayTags::Get().Effects_HitReact);
				Props.TargetASC->TryActivateAbilitiesByTag(TagContainer); //根据tag标签激活技能
			}
		}
	}

接下来,编译代码,打开UE,将我们之前创建的受击技能设置到数据资产中
在这里插入图片描述
我们将使用标签激活技能,所以,在技能里,还需要将受击标签设置给技能
在这里插入图片描述
我们不需要在每次激活时创建一个新的实例,只需要一个角色生成一个实例重复利用即可。
在这里插入图片描述
由于它一个角色对应一个单例,每次触发都是相同的实例,所以,我们需要在其播放完成后,将其结束,才可以触发,所以,在敌人的受击动画播放完成后,我们需要将敌人身上的受击标签清楚(如果GE添加的,只需要将对应的GE清除,标签也会随着清除)并结束技能。
在这里插入图片描述
接下来,就是测试效果,我们攻击敌人,看看其是否能够播放动画。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XN297 2.4GHz 单片高速无线收发芯片

概述 XN297是一款工作在2.400~2.483GHz世界通用ISM频段的单片无线收发芯片。该芯片集成 射频收发器、频率发生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK的通信模式。发射输出功率、工作频道以及通信数据率均可配置。 主要特性 1、低功…

Linux-笔记 i2c-tools

1、i2c-tools介绍 1、在日常linux开发中&#xff0c;有时候需要确认i2c硬件是否正常连接&#xff0c;设备是否正常工作&#xff0c;设备的地址是多少等等&#xff0c;这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools&#xff0c;i2c-tools原理是通过操作/dev 路径 …

Python专题:三、数字和运算(2)

目录 一、数学运算 二、赋值运算 一、数学运算 1、运算符号 加法 减法- 乘法* 除法/ 计算机中浮点数表示有精度限制&#xff0c;Python有限&#xff0c;所以近似取数 2、除法取整// Python2中 整数/整数 值为整数 Python3中 整数/整数 整数or浮点数 //计算除法对结果取…

segment anythin 新标注工具 paddleocr训练自己的数据

快递单ocr检测 1.总结2.需求3.方案4.面单定位4.1反转图片扩充数据集4.2新的标注方式4.3json2yolo4.4yolov5推理 5.paddleocr5.1 数据标注5.2 文本检测训练5.3 文本识别训练检测结果 1.总结 按照惯例&#xff0c;先吐槽一下。反正也没人看我比比歪歪。做事全部藏着掖着&#xf…

Redis-新数据类型-Bitmaps

新数据类型-Bitmaps 简介 在计算机中&#xff0c;用二进制&#xff08;位&#xff09;作为存储信息的基本单位&#xff0c;1个字节等于8位。 例如 “abc” 字符串是由 3 个字节组成&#xff0c;计算机存储时使用其二进制表示&#xff0c;"abc"分别对应的ASCII码是 …

苹果Mac用户下载VS Code(Universal、Intel Chip、Apple Silicon)哪个版本?

苹果macOS用户既可以下载通用版&#xff08;Universal&#xff09;&#xff0c;软件将自动检测用户的处理器并进行适配。 也可以根据型号下载对应CPU的版本&#xff1a; 使用Intel CPU的Mac电脑可下载Intel Chip版本&#xff1b; 使用苹果自研M系列CPU的Mac电脑下载Apple Si…

“漫画之家”|基于Springboot+vue的“漫画之家”系统(源码+数据库+文档)

“漫画之家”系统 目录 基于Springbootvue的“漫画之家”系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&a…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说&#xff0c;一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

完美匹配企业需求的FTP替代软件,需要具备哪些功能和价值?

FTP作为世界范围内第一个文件传输协议&#xff0c;已被广泛使用30多年&#xff0c;也是企业使用较多的一种方式。但在数字化转型的浪潮中&#xff0c;企业对文件传输的需求日益增长&#xff0c;FTP存在的弊端也逐渐成为企业发展的桎梏&#xff0c;比如安全性、稳定性、传输效率…

软件测试基础理论复习

什么是软件&#xff1f; 软件是计算机系统中与硬件相互依存的另一部分&#xff0c; 软件包括程序文档 什么是软件测试&#xff1f; &#xff08;1&#xff09;软件测试是在现有软件&#xff08;程序文档&#xff09;中寻找缺陷的过程&#xff1b; &#xff08;2&#xff0…

西部数据硬盘格式化了怎么恢复数据

在数字化时代&#xff0c;数据的重要性不言而喻。无论是个人珍贵的照片、视频&#xff0c;还是企业关键的业务文件&#xff0c;一旦丢失&#xff0c;都可能带来无法估量的损失。而硬盘作为数据存储的主要设备之一&#xff0c;其安全性与可靠性自然受到了广大用户的关注。然而&a…

会展服务预约小程序的作用是什么

年会、赛事、乐舞、招聘展览等多个场景都需要会展服务&#xff0c;商家需要将自己的服务推广出去获客转化&#xff0c;客户也需要找到合适靠谱的品牌&#xff0c;双方互相需求下&#xff0c;合理化线上运营触达非常重要。 运用【雨科】平台制作会展服务预约小程序&#xff0c;…

区块链的可扩展性三难问题

这个词是由以太坊的联合创始人Vitalik Buterin创造的&#xff0c;并提出了理想的区块链需要具备的三个特征&#xff1a;去中心化、可扩展性和安全性。 Vitalik还提出&#xff0c;区块链几乎不可能很好地实现所有这三个特征&#xff0c;所以会出现权衡。 因此&#xff0c;今天…

chatgpt快速搭建开发程序

程序开发中让GPT编写功能函数&#xff0c;懂原理的工程师只需要将GPT提供的命令码块按照项目对应的结构拆解后放置到项目文件夹对应的位置即可&#xff0c;高速高效快速搭建。 举例&#xff1a;

函数式接口-方法引用

定义 静态方法-方法引用 示例

QT功能 实现静态内容国际化实验

文章目录 第一步&#xff1a;新建一个QT工程第二步&#xff1a;添加控件第三步&#xff1a;在pro文件中添加内容第四步&#xff1a;更新文件第五步&#xff1a;打开QT的Linguist第六步&#xff1a;添加翻译内容第七步&#xff1a;回到QT Creator中添加文件第八步&#xff1a;给…

韶关市承装修试电力施工许可证五级可以承接哪些项目【资质办理指南】

韶关市承装修试电力施工许可证五级可以承接哪些项目【资质办理指南】 韶关市承装修试电力施工许可证五级可以承接的项目主要包括10千伏及以下电压等级电力设施的安装、维修或者试验活动。这意味着&#xff0c;持有五级许可证的企业可以在韶关市范围内承接包括变电站、配电站、输…

多链路聚合设备是什么

多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备&#xff0c;它能够将多个网络链路聚合成一个逻辑链路&#xff0c;以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等&#xff0c;能够智能管理和优化利用不同网络链路&a…

【国产SSL】哪家SSL证书可以保证数据不出境,是在国内验签

随着网络安全的重视&#xff0c;网站安装SSL证书已经是标配了。但是为什么目前常见的SSL证书都是国外的&#xff1f;数据受国外掌控&#xff0c;安全吗&#xff1f;那么哪家国产品牌是可以保证数据不出境的呢&#xff1f; 为什么目前常见的SSL证书都是国外的&#xff1f; 原因…

AlphaFold3(AF3)简单介绍:预测各种生物分子结构和它们之间相互作用的深度学习模型

参考: 文章地址: https://www.nature.com/articles/s41586-024-07487-w https://blog.google/technology/ai/google-deepmind-isomorphic-alphafold-3-ai-model/ AlphaFold3体验官网: https://golgi.sandbox.google.com/ 《Accurate structure prediction of biomolecula…