虚幻引擎GAS入门学习笔记(一)
虚幻引擎GAS入门(一)
Gameplay Ability System(GAS)
是一个模块化且强大的框架,用于管理虚幻引擎中的游戏玩法逻辑。它的核心组成部分包括 Gameplay Ability(定义和执行能力)、Gameplay Effect(应用和管理效果)、Attribute Set(管理角色属性)、Gameplay Tags(标记和管理对象状态)、Gameplay Tasks(处理异步任务)以及 Gameplay Modifiers(修改属性值)。这些组件相互协作,使得开发者能够创建复杂且高度定制化的游戏玩法,如技能系统、状态效果系统等。- Gameplay Ability System(GAS)组成部分及其功能
- 学习位置UE5.3 GAS入门教程重置版 小明
创建工程
- 创建工程然后开启
GameplayAbilites
插件
- 在工程
.Build.cs
里添加这三个模块:"GameplayAbilities","GameplayTags","GameplayTasks"
- 编译后会报
307
错误,把这几个文件删除重新构建编译一下即可
- 创建基础角色类并新建基础角色的蓝图,然后创建两个继承这个蓝图的子类作为角色与敌人
简易角色基本控制
- 添加一个第三人称模版,然后删除掉就会有它给你做好的轴操作控制
- 留下需要的即可
- 然后将导入的资产中那个蓝图里面的操作复制到我们创建的角色蓝图中去更改这个轴操作
- 勾上
- 勾掉这个,角色就能正常转体
2种相机模式与夹角限制
- 首先将输入操作从角色蓝图移动到控制器蓝图中
- 限制视角
- 在玩家蓝图中写一个函数用来锁定相机操作
攻击动作的融合
- 创建混合空间设置好动作行为
- 创建动画蓝图设置初始属性
- 配置蒙太奇
- 攻击蒙太奇与移动进行融合,就可以边走边攻击了
- 这个攻击蒙太奇人物会转身,为了避免这种人物突然旋转的情况,要在蒙太奇中添加通知来是否需要融合
- 最后进行攻击动作的融合输出到最终状态
GAS结合GamePlay
- 添加
AbilitySystem
组件
- 添加技能的基类蓝图
- 获取技能
- 创建一个函数用来使用Melee
- 创建一个函数用来激活技能
- 然后在技能蓝图里面添加
Melee
这个标签
- 将技能标签添加到数组中
- 然后
Melee
事件调用激活技能这个函数
- 测试一下
- 运行结果
- 换为播放Montage
- 添加一个
GameplayEffect
技能CD,以免出现攻击反复无常的情况
- 提交CD
- 给剑添加碰撞盒
- 碰撞除了自己与同类不进行碰撞处理,其他进行碰撞处理
设置角色属性
- 新建一个
AttributeSet
类
- 虚幻引擎中提供了一种宏,帮助函数,可以很方便加载游戏的特殊的方法
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
- 定义好属性
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "BaseAttributeSet.generated.h"/*** */#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)UCLASS()
class GASDEMO_API UBaseAttributeSet : public UAttributeSet
{GENERATED_BODY()public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "BaseAttributeSet")FGameplayAttributeData HP;ATTRIBUTE_ACCESSORS(UBaseAttributeSet, HP);UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")FGameplayAttributeData MaxHP;ATTRIBUTE_ACCESSORS(UBaseAttributeSet, MaxHP);UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")FGameplayAttributeData MP;ATTRIBUTE_ACCESSORS(UBaseAttributeSet, MP);UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")FGameplayAttributeData MaxMP;ATTRIBUTE_ACCESSORS(UBaseAttributeSet, MaxMP);UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")FGameplayAttributeData Strength;ATTRIBUTE_ACCESSORS(UBaseAttributeSet, Strength);UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BaseAttributeSet")FGameplayAttributeData MaxStrength;ATTRIBUTE_ACCESSORS(UBaseAttributeSet, MaxStrength);
};
- 解决小bug,武器碰撞盒子只有在挥刀的时候才开启碰撞
- 将碰撞盒子的碰撞修改一下
伤害敌人并做夹值处理
- 新建一个数据表把角色属性加入到里面
- 将这个表设置到角色属性的
AbilitySystem
里面去
- 再新建一个
GameplayEffect
作为伤害受理,每次扣血5点值
- 在Melee攻击检测这里应用这个
GE
- 运行结果
- 处理伤害溢出问题
- 写上夹值逻辑
- 运行结果
行为树配置
- 关于两个镜头的处理,取消碰撞测试就不会让镜头被挡,启动
- 做不同等级的伤害表,新建一个
.csv
的表,第一行第一列是要空着的,然后写入伤害等级值
- 将表格拖入UE中,选择类型为曲线表格,插值类型为常量
- 将表格插入到伤害的
GE
中
- 新建行为树与黑板进行配置
- 创建
AIController
,然后执行行为树,将这个AIController
附加到Enemy
蓝图上
生命值改变时广播
- 将所有的碰撞类型改成这样
- 基础父类蓝图里面开始时将剑的碰撞盒子关掉
- 把之前的动画通知改变通道变成设置碰撞
- 在基础角色类中声明动态多播委托,因为多播委托可以在蓝图中调用
- 创建一个多播委托的处理函数
- 绑定多播委托
- 订阅一下这个广播
- 运行结果
死亡处理
- 制作一下死亡的
Montage
动画
- 添加一个死亡处理事件
停止AIController控制
- 在敌人蓝图里面添加一个停止控制的函数
- 在敌人蓝图里面重写一下父类中的检查血量的事件
- 玩家蓝图中也要重写这个事件
添加敌人的血条
- 创建一个UMG制作敌人血条
- 在敌人蓝图中添加这个UMG组件,并写上更新UI逻辑
- 运行结果
玩家住UI制作与构建技能结构体系
搭建玩家UI界面
- 创建玩家的属性UI
- 这个纹理有两个暴露出来设置的值,一个是设置百分比一个是设置颜色
- 添加一个事件来设置血球的百分比
- 添加一个事件来设置血球的颜色
- 创建角色的主UI,然后设置好这三个属性球的颜色
同步UI到玩家信息
- 在玩家控制器里面添加这个主UI窗口
- 获取到角色的控制器,然后进行血量的数值变化逻辑
给玩家一个自动回复血量Buffer
- 创建一个继承自基础技能的回复
Buffer
技能
- 添加效果
- 设置好技能效果的回复属性
- 激活技能
- 提交技能
构建技能信息结构体
- 创建一个
GameplayAbility
基类
- 创建技能信息的数据
获取技能信息与创建技能图标
获取技能详细信息函数
- 获取技能信息
// Fill out your copyright notice in the Description page of Project Settings.#include "BaseGameplayAbility.h"FGameplayAbilityInfo::FGameplayAbilityInfo():CD(0),CostValue(0),CostType(ECostType::MP),IconMaterial(nullptr),AbilityClass(nullptr)
{}FGameplayAbilityInfo::FGameplayAbilityInfo(float CD, ECostType CostType, float CostValue, UMaterialInstance* IconMaterial, TSubclassOf<UBaseGameplayAbility> AbilityClass):CD(CD),CostType(CostType),CostValue(CostValue),IconMaterial(IconMaterial),AbilityClass(AbilityClass)
{}FGameplayAbilityInfo UBaseGameplayAbility::GetAbilityInfo(int Level)
{//获取与技能冷却相关的游戏效果UGameplayEffect* CDEffect = GetCooldownGameplayEffect();//获取与技能使用成本相关的游戏效果UGameplayEffect* CostEffect = GetCostGameplayEffect();float CD = 0;float CostValue = 0;ECostType CostType = ECostType::MP;if (CDEffect && CostEffect){CDEffect->DurationMagnitude.GetStaticMagnitudeIfPossible(Level, CD);if (CostEffect->Modifiers.Num() > 0){//获取花费的是哪一个类型FGameplayModifierInfo CostEffectModifierInfo = CostEffect->Modifiers[0];CostEffectModifierInfo.ModifierMagnitude.GetStaticMagnitudeIfPossible(Level, CostValue);FString CostTypeName = CostEffectModifierInfo.Attribute.AttributeName;if (CostTypeName == "HP"){CostType = ECostType::HP;}if (CostTypeName == "MP"){CostType = ECostType::MP;}if (CostTypeName == "Strength"){CostType = ECostType::Strength;}//返回技能信息return FGameplayAbilityInfo(CD, CostType, CostValue, IconMaterial, GetClass());}}return FGameplayAbilityInfo();
}
学习技能时就获取技能信息
- 在基础类里面创建一个学习获取技能信息的函数
- 学习此技能
利用结构体信息创建单个技能UI
- 创建技能的UI
- 设置技能Key与技能初始化
- 设计技能开始CD逻辑
- 更新技能图标的值,当前CD除以总CD因为材质里面的数值问题要取反,然后CD小于0的情况下就回复技能图标,并设置当前技能无CD
相关文章:

虚幻引擎GAS入门学习笔记(一)
虚幻引擎GAS入门(一) Gameplay Ability System(GAS) 是一个模块化且强大的框架,用于管理虚幻引擎中的游戏玩法逻辑。它的核心组成部分包括 Gameplay Ability(定义和执行能力)、Gameplay Effect(应用和管理…...

Excel:vba实现合并工作表(表头相同)
这个代码应该也适用于一些表头相同的工作表的汇总,只需要修改想要遍历的表,适用于处理大量表头相同的表的合并 这里的汇总合并表 total 是我事先创建的,我觉得比用vba代码创建要容易一下,如果不事先创建汇总表就用下面的代码&…...

Redis:分布式 - 主从复制
Redis:分布式 - 主从复制 概念配置主从模式info replicationslave-read-onlytcp-nodelay 命令slaveof 主从结构一主一从一主多从 主从复制流程数据同步命令全量同步部分同步实时同步 节点晋升 概念 Redis的最佳应用,还是要在分布式系统中。对于非分布式…...

el-date-picker设置只有某些日期可选
示例图: <el-date-pickerv-model"topFormObj.upTime"type"date"value-format"timestamp"format"dd/MM/yyyy":picker-options"pickerOptions" /> 固定限制每周的周末周三不可选 data() {return {pickerOp…...

java数据库操作-cnblog
创建lib目录,填入jar包 选择 libraries添加lib目录 package nb;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCtest {private static final String url "jdbc:mysql://localhost:3306/test?c…...

HCIP-HarmonyOS Application Developer 习题(九)
(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式? A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案:BCD 分析:系统提供了悬浮窗、分屏、平行视界三种多窗口交互,为用户在大屏幕设备上的多任务并行、便捷的临时任务…...

redis集成到spring boot中使用
(一)添加依赖 redis服务器在官网中公开了自己使用的协议--RESP,所以我们可以使用这个协议来访问redis服务器,但是如果我们要自己实现库,那肯定是非常麻烦的,所以我们可以使用网上的库,我们直接调…...
Spring Boot、Spring MVC和Spring有什么区别
人要长大,就要学会不断接受事件的变化 —— 24.10.14 spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补OOP的代码重复问题、更方便将不同类不同方法中的共同处理…...

Flip动画
前言 最近在做复图标库功能时,感觉这个功能在使用上有些“生硬”。如随机删除一个图标,后面的元素在视觉上是“瞬间移动”过来补位的。想着做个小优化,简单加个动画效果吧。 看起来确实“花里胡哨”了,实现也很简单, …...

Java通过RAG构建专属知识问答机器人_超详细
RAG:融合检索与生成的文本精准生成技术 检索增强生成(RAG)是一种技术,它通过结合检索模型和生成模型来提高文本生成的准确性。具体来说,RAG首先利用检索模型从私有或专有的数据源中搜索相关信息,然后将这些…...

2.1 使用点对点信道的数据链路层
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 通信信道类型2 数据链路3 帧4 透明传输5 差错检测 前言 在计算机网络通信中,数据链路层起着关键作用。它为直接相连的网络设备之间提供可靠的数据传输服务。…...
台式机来电自启动设置
在前司时,由于有些工作需要用到台式机,且一到节假日或者突然停电等情况,电脑每次都需要自己手动开机,后来研究了一下,发现可以在BIOS里面更改设置,从而变成关机的情况下,只要来电就能自动开机&a…...

【最新华为OD机试E卷-支持在线评测】考勤信息(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...

netdata保姆级面板介绍
netdata保姆级面板介绍 基本介绍部署流程下载安装指令选择设置KSM为什么要启用 KSM?如何启用 KSM?验证 KSM 是否启用注意事项 检查端口启动状态 netdata和grafana的区别NetdataGrafananetdata各指标介绍总览system overview栏仪表盘1. CPU2. Load3. Disk…...

苹果最新论文:LLM只是复杂的模式匹配 而不是真正的逻辑推理
大语言模型真的可以推理吗?LLM 都是“参数匹配大师”?苹果研究员质疑 LLM 推理能力,称其“不堪一击”!苹果的研究员 Mehrdad Farajtabar 等人最近发表了一篇论文,对大型语言模型 (LLM) 的推理能…...
Python知识点:基于Python工具,如何使用Scikit-Image进行图像处理与分析
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 基于Python的Scikit-Image图像处理与分析指南 在Python的科学计算生态系统中&am…...

MongoDB初学者入门教学:与MySQL的对比理解
🏝️ 博主介绍 大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~ 👨🎓 个人介绍:本人是一名后端Java开发工程师,坐标北京 ~ 🎉 感谢关注 📖 一起学习 &…...
Oracle AI Vector Search
Oracle AI Vector Search 是 Oracle Database 23ai 中引入的一项新技术,它允许用户在数据库中直接存储和高效查询向量数据。这项技术旨在简化应用程序的开发,并且支持不同维度和格式的向量。以下是 Oracle AI Vector Search 的一些关键特性和优势&#x…...

基于SpringBoot的健身会员管理系统实战分享
在这个充满活力的时代,我们自豪地呈现一款专为健身爱好者和专业人士设计的会员管理系统——一个集创新、效率与便捷于一体的解决方案。我们的系统基于强大的RuoYi-Vue框架构建,采用最新的Spring Boot和Vue3技术,确保了系统的高性能和用户友好…...
Elasticsearch高级搜索技术-结构化数据搜索
目录 结构化数据的存储 示例映射 使用range查询 查询示例 运算符 更多示例 日期查询 示例 结构化数据搜索是Elasticsearch另一个强大的功能,允许用户对具有明确类型的数据(如数字、日期和布尔值)进行精确的过滤和查询。这种类型的搜索通常涉及…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...