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

33. UE5 RPG使用增强输入激活GameplayAbility(三)

在前面的文章,我们实现了使用GameplayTag和InputAction的对应绑定的数据,并且添加到了增强输入映射的上下文中,实现了通过按键打印对应的GameplayTag,这只是我们基础需要制作的。目的主要是为了实现在GameplayAblity上面设置对应的Tag,在按下对应按键时,可以激活技能。
前面的步骤实现了,接下来,我们将在GA的基类上面增加一个GameplayTag配置属性,然后在给角色应用GA时,将GameplayTag设置给GA的实例,在触发InputAction的时候,通过遍历,找到被应用的GA里面有相同的Tag的GA,然后通过代码去触发。

实现

首先,我们需要再技能的基类上增加一个GameplayTag的配置属性,这样,我们就可以在技能蓝图上设置它所使用的GameplayTag了。

public:UPROPERTY(EditDefaultsOnly, Category="Input")FGameplayTag StartupInputTag;

在ASC中实现新的激活事件

接下来,我们要实现在运行时,应用GA时,需要在GamplayAbilitySpec身上将设置的GameplayTag存储下来。
DynamicAbilityTags是一个FGameplayTagContainer类型,它也是可以复制到服务器的,并且在创建GameplayAbilitySpec自动生成。
AbilitySpec.Ability是可以从Spec身上去获取实例的技能基类,并且它也是一个常量对象,我们在其身上设置的参数需要再常量身上去获取。

AbilitySpec.DynamicAbilityTags.AddTag(Cast<UGameplayAbilityBase>(AbilitySpec.Ability)->StartupInputTag);

我们修改ASC中添加技能的函数,它接收的参数是一个技能类的列表,然后遍历,我们在遍历里面通过类去创建Spec实例,如果Spec实例能够转换成我们创建的技能基类对象,那么,我们将基类对象身上设置的Tag设置到DynamicAbilityTags里面。
最后,我们将不会直接激活技能,而是只应用技能,然后通过按键触发技能。

void UAbilitySystemComponentBase::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{for(const TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities){FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);if(const UGameplayAbilityBase* AbilityBase = Cast<UGameplayAbilityBase>(AbilitySpec.Ability)){AbilitySpec.DynamicAbilityTags.AddTag(AbilityBase->StartupInputTag);GiveAbility(AbilitySpec); //只应用不激活// GiveAbilityAndActivateOnce(AbilitySpec); //应用技能并激活一次}}
}

下面,我们将在ASC上面增加两个函数,一个是触发技能的悬停时触发的函数,另一个是触发技能时按键离开时的。这两个函数都需要一个参数Tag去查找需要激活技能。

	void AbilityInputTagHold(const FGameplayTag& InputTag);void AbilityInputTagReleased(const FGameplayTag& InputTag);

在函数实现中,我们首先判断传入的InputTag是否可用

if(!InputTag.IsValid()) return;

然后遍历所有已经应用的技能,GetActivatableAbilities()将返回一个可激活技能的列表

for(auto AbilitySpec : GetActivatableAbilities())

然后我们将对Tag进行比对,判断Spec上设置的Tag和传入的Tag是否相同,如果相同,将对技能处理。

if(AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))

在技能悬停事件里面,我们首先调用告知GameplayAbility,此技能被触发按下事件,

AbilitySpecInputPressed(AbilitySpec);

防止技能重复被激活,判断当前技能是否处于激活状态

if(!AbilitySpec.IsActive())

尝试激活技能,这里尝试激活,是因为技能激活有很多限制,你调用了激活,只有在符合条件的情况下,才真正被激活。

TryActivateAbility(AbilitySpec.Handle);

而在Released函数内,我们调用了下面函数,告知技能按键事件被抬起。

AbilitySpecInputReleased(AbilitySpec);

这两个事件会触发技能上面的回调,来实现更多的逻辑,我们可以在技能里面覆盖它来实现

	virtual void InputPressed(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) override;virtual void InputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) override;

下面是在ASC实现的一个激活事件和取消事件的完整代码。

void UAbilitySystemComponentBase::AbilityInputTagHold(const FGameplayTag& InputTag)
{if(!InputTag.IsValid()) return;for(auto AbilitySpec : GetActivatableAbilities()){if(AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag)){AbilitySpecInputPressed(AbilitySpec);if(!AbilitySpec.IsActive()){TryActivateAbility(AbilitySpec.Handle);}}}
}void UAbilitySystemComponentBase::AbilityInputTagReleased(const FGameplayTag& InputTag)
{if(!InputTag.IsValid()) return;for(auto AbilitySpec : GetActivatableAbilities()){if(AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag)){AbilitySpecInputReleased(AbilitySpec);}}
}

在PlayerController中修改并调用ASC的激活事件

接下来,我们将在PlayerController(PC主要储存角色操作的的相关内容的)里,触发操作后,调用ASC身上新创建的函数来触发技能激活。现在,我们还无法在PC身上获取ASC,所以,首先添加一个获取ASC的函数。
我们先创建一个变量存储ASC,然后再增加一个获取ASC的函数。

	UPROPERTY()TObjectPtr<UAbilitySystemComponentBase> AbilitySystemComponentBase;UAbilitySystemComponentBase* GetASC();

然后在函数实现这里,判断ASC是否被设置,如果没有被设置,将通过GAS的函数库去获取,这个静态函数将通过接口去获取

UAbilitySystemComponentBase* APlayerControllerBase::GetASC()
{if(AbilitySystemComponentBase == nullptr){AbilitySystemComponentBase = Cast<UAbilitySystemComponentBase>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetPawn()));}return AbilitySystemComponentBase;
}

接着,我们修改之前在PC里面触发的事件的函数,之前实现到了打印Tag,现在我们将其修改掉, 不再打印

void APlayerControllerBase::AbilityInputTagPressed(FGameplayTag InputTag)
{GEngine->AddOnScreenDebugMessage(1, 3.f, FColor::Red, *InputTag.ToString());
}void APlayerControllerBase::AbilityInputTagReleased(FGameplayTag InputTag)
{GEngine->AddOnScreenDebugMessage(2, 3.f, FColor::Blue, *InputTag.ToString());
}void APlayerControllerBase::AbilityInputTagHold(FGameplayTag InputTag)
{GEngine->AddOnScreenDebugMessage(3, 3.f, FColor::Yellow, *InputTag.ToString());
}

在函数里,我们需要通过ASC去调用前面实现的激活技能函数,但是我们还无法确保ASC不为空指针,先做一下判断,然后返回。

void APlayerControllerBase::AbilityInputTagPressed(FGameplayTag InputTag)
{// GEngine->AddOnScreenDebugMessage(1, 3.f, FColor::Red, *InputTag.ToString());
}void APlayerControllerBase::AbilityInputTagReleased(FGameplayTag InputTag)
{if(GetASC() == nullptr) return;GetASC()->AbilityInputTagReleased(InputTag);
}void APlayerControllerBase::AbilityInputTagHold(FGameplayTag InputTag)
{if(GetASC() == nullptr) return;GetASC()->AbilityInputTagHold(InputTag);
}

测试

接下来,我们编译代码,解决bug,然后打开UE,找到之前我们做技能测试的蓝图,上面已经可以设置Tag了。
我们设置一个使用鼠标左键触发当前技能
在这里插入图片描述
我们之前测试时,在技能激活时触发ActivateAbility字符串打印,然后在一秒后触发技能关闭,并在屏幕打印技能结束
在这里插入图片描述

编辑运行,正常运行技能将不会被激活,而是在鼠标左键点击时触发
在这里插入图片描述

相关文章:

33. UE5 RPG使用增强输入激活GameplayAbility(三)

在前面的文章&#xff0c;我们实现了使用GameplayTag和InputAction的对应绑定的数据&#xff0c;并且添加到了增强输入映射的上下文中&#xff0c;实现了通过按键打印对应的GameplayTag&#xff0c;这只是我们基础需要制作的。目的主要是为了实现在GameplayAblity上面设置对应的…...

speech to text 库FastASR交叉编译arm target的配置

FastASR是一个比较方便的SPEECH TO TEXT的AI库。开源。下面介绍下其在交叉编译到ARM target时候的交叉编译的cmake配置&#xff1a; cmake_minimum_required(VERSION 3.10)project(FastASR)SET(CMAKE_C_COMPILER "/home/xxx/buildroot/output/platform_name/host/bin/aar…...

WPS快速将插入Excle数据插入Word

前置条件&#xff1a; 一张有标题、数据的excle表格word中的表格与excle表格标题对应或包含电脑已经安装WPS软件 第一步、根据word模板设计excle模板&#xff0c;标头对应 第二步、word上面选【引用】--【邮件】&#xff0c;选打开数据源&#xff0c;找到excle文件&#xff0c;…...

Springboot 集成Rabbitmq之延时队列

1.首先确保已经引入了Spring AMQP和RabbitMQ的相关依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2. 创建一个普通队列并设置TTL&#x…...

【云开发笔记NO.22】运用云原生产品打造技术中台

一、云原生产品与技术中台的结合点 云原生产品以其容器化、微服务化、自动化等特性&#xff0c;为技术中台的建设提供了强大的技术支持。容器化技术使得应用可以更容易地进行部署和管理&#xff0c;提高了应用的可移植性和弹性。微服务架构则让应用更加模块化&#xff0c;便于…...

C++进阶(五) 哈希

1. unordered系列关联式容器 1.1 unordered_map 1.2 unordered_map的接口说明 2. 底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.4 哈希冲突解决 2.4.1 闭散列 2.4.2 开散列 3. 模拟实现 3.1 unordered_set 3.2 unordered_map 4.哈希的应用 4.1 位图 4.1.…...

【算法基础】基于异或的排序、基于异或的经典面试题

文章目录 1. 传统交换2. 异或与异或的规律3. 基于异或的排序4. 需要注意的地方5. 经典面试题15.1 题目5.2 思路5.3 实现 6. 经典面试题26.1 题目6.2 思路6.3 实现 1. 传统交换 传统交换方法如下&#xff1a; def swap(i, j):tmp ii jj tmp通过开辟一个额外的变量空间&…...

HTML2:列表和表格

列表 有序列表 ordered list ol 无序列表 unordered list ul 定义列表 definition list dl 1,有序列表 每条列表前自带一个序号 2,无序列表 每条列表前自带一个小圆点 3,定义列表 注意:dl中放的不是li列表而是dt列表和dd表项 dt代表术语标题 dd代表术语内容 一个…...

用于无人机小型化设计的高精度温补晶振

用于无人机小型化设计的高精度温补晶振:TG2016SMN和TG2520SMN。无人机的发展可以说是非常的迅速&#xff0c;在安防&#xff0c;农业&#xff0c;交通&#xff0c;电力&#xff0c;直播等领域经常能看到无人机大显身手。无人机的应用场最是非常的广泛&#xff0c;功能更强&…...

轨迹规划 | 图解最优控制LQR算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 最优控制理论2 线性二次型问题3 LQR的价值迭代推导4 基于差速模型的LQR控制5 仿真实现5.1 ROS C实现5.2 Python实现5.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全…...

工业视觉检测

目录 我对工业视觉检测的了解 一、关键组成部分 二、应用场景 三、技术挑战 我对工业视觉检测的了解 工业视觉检测是利用机器视觉技术对产品质量进行自动化检查的过程&#xff0c;它在制造业中扮演着至关重要的角色&#xff0c;用于确保产品质量、提高生产效率、减少人工成…...

wheeltec轮趣ROS教育机器人的网络连接

一、术语解析 宿主机&#xff1a;宿主机是指物理主机&#xff0c;比如用于开发测试的笔记本电脑和台式机电脑。 虚拟机&#xff1a;虚拟机是指安装在宿主机的VMware&#xff0c;推荐在宿主机上安装虚拟机&#xff0c;官方提供虚拟机的镜像以及配套的开发环境。 ROS主机&…...

【Linux ARM 裸机】开发环境搭建

1、Ubuntu 和 Windows 文件互传 使用过程中&#xff0c;要频繁进行 Ubuntu 和 Windows 的文件互传&#xff0c;需要使用 FTP 服务&#xff1b; 1.1、开启 Ubuntu 下的 FTP 服务 //安装 FTP 服务 sudo apt-get install vsftpd //修改配置文件 sudo vi /etc/vsftpd.conf//重启…...

怎么保证缓存与数据库的最终一致性?

目录 零.读数据的标准操作 一.Cache aside Patten--旁路模式 二.Read/Write Through Pattern--读写穿透 三.Write Back Pattern--写回 四.运用canal监听mysql的binlog实现缓存同步 零.读数据的标准操作 这里想说的是不管哪种模式读操作都是一样的&#xff0c;这是一种统一…...

免费SSL通配符证书/SSL泛域名证书获取教程

我们先基本了解什么是SSL证书以及其作用。SSL证书是一种数字证书&#xff0c;它通过为网站提供身份验证和数据加密服务&#xff0c;从而保护网站的用户信息安全。当我们在浏览器的地址栏看到“https”和绿色锁标志时&#xff0c;就表示该网站使用了SSL证书。 那么什么又是通配…...

mysql结构与sql执行流程

Mysql的大体结构 客户端&#xff1a;用于链接mysql的软件 连接池&#xff1a; sql接口&#xff1a; 查询解析器&#xff1a; MySQL连接层 连接层&#xff1a; 应用程序通过接口&#xff08;如odbc,jdbc&#xff09;来连接mysql&#xff0c;最先连接处理的是连接层。 连接层…...

vue快速入门(十二)v-key索引标志

注释很详细&#xff0c;直接上代码 新增内容 v-key的使用场景数组筛选器的使用 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…...

智能网联汽车自动驾驶数据记录系统DSSAD数据配置

目录 第一章 数据配置一般要求 第二章 数据配置文件中的文件描述 第三章 数据配置文件中的数据描述 第四章 数据配置文件中的数据字典 表A.1 数据字典格式定义 第一章 数据配置一般要求 数据配置文件数据内容应为可读的十进制数据。 数据配置文件应以文件的形式存储在自动驾驶…...

linux知识点

绝对路径用什么符号表示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命令 绝对路径&#xff1a; 如/etc/init.d当前目录和上层目录&#xff1a; ./ …/主目录&#xff1a; ~/切换目录&#xff1a; cd 怎么查看当前进程&#xff1f;…...

微信小程序实现滚动标签

使用scroll-view标签可实现组件滚动标签 1、list中 list.wxml代码如下: <!--pages/list/list.wxml--> <navigation-bartitle"小程序" back"{{false}}"color"black" background"#FFF"></navigation-bar><scroll-…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...