虚幻引擎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
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mit6824-01-MapReduce详解

文章目录 MapReduce简述编程模型执行流程执行流程排序保证Combiner函数Master数据结构 容错性Worker故障Master故障 性能提升定制分区函数局部性执行缓慢的worker(slow workers) 常见问题总结回顾参考链接 MapReduce简述 MapReduce是一个在多台机器上并行计算大规模数据的软件架…

Electron 主进程与渲染进程、预加载preload.js

在 Electron 中&#xff0c;主要控制两类进程&#xff1a; 主进程 、 渲染进程 。 Electron 应⽤的结构如下图&#xff1a; 如果需要更深入的了解electron进程&#xff0c;可以访问官网 流程模型 文档。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用…

webpack插件 --- webpack-bundle-analyzer【查看包体积】

const UglifyJsPlugin require(uglifyjs-webpack-plugin) // 清除注释 const CompressionWebpackPlugin require(compression-webpack-plugin); // 开启压缩// 是否为生产环境 const isProduction process.env.NODE_ENV production; const { BundleAnalyzerPlugin } requi…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种&#xff0c;性能如下所示&#xff1a; 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

rabbitMQ 简单使用

安装 rabbitMQ 下载地址&#xff1a;rabbitmq-3.12.0 安装 windows rabbitMQ 需要的命令 进入 rabbitMQ 的 sbin 目录后 cmd &#xff08;需要管理员权限&#xff09; rabbitmq-plugins.bat enable rabbitmq_management随后重启 rabbitMQ #关闭服务 net stop rabbitmq #开…

openpnp - juki吸嘴尺寸

文章目录 openpnp - juki吸嘴尺寸概述笔记吸嘴可以对应的最小元件尺寸END openpnp - juki吸嘴尺寸 概述 在网上买的juki吸嘴的商品页面&#xff0c;并没有具体的吸嘴尺寸。 现在贴片时&#xff0c;要根据吸嘴外径大小来决定具体元件要用哪种吸嘴&#xff0c;先自己量一下。 …

2024 uniapp入门教程 01:含有vue3基础 我的第一个uniapp页面

uni-app官网uni-app,uniCloud,serverless,快速体验,看视频&#xff0c;10分钟了解uni-app,为什么要选择uni-app&#xff1f;,功能框架图,一套代码&#xff0c;运行到多个平台https://uniapp.dcloud.net.cn/ 准备工作&#xff1a;HBuilder X 软件 HBuilder X 官网下载&#xf…

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据&#xff0c;训练同一个网络。比如&#xff0c;先用A数据训练一下网络&#xff0c;然后再用B数据训练一下网络&#xff0c;那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的&#xff0c;比如先用A训练…

LeetCode讲解篇之300. 最长递增子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以通过动态规划求解&#xff0c;使用一个数组f&#xff0c;数组f的i号元素表示[0, i]范围内最长递增子序列的长度 状态转移方程&#xff1a;f[i] max(f[j] 1)&#xff0c;其中 0 < j < i 题…

docker快速安装ELK

一、创建elk目录 创建/elk/elasticsearch/data/目录 mkdir -p /usr/local/share/elk/elasticsearch/data/ 创建/elk/logstash/pipeline/目录 mkdir -p /usr/local/share/elk/logstash/pipeline/ 创建/elk/kibana/conf/目录 mkdir -p /usr/local/share/elk/kibana/conf/ 二、创建…

大模型应用新领域:探寻终端侧 AI 竞争核心|智于终端

2024年过去2/3&#xff0c;大模型领域的一个共识开始愈加清晰&#xff1a; AI技术的真正价值在于其普惠性。没有应用&#xff0c;基础模型将无法发挥其价值。 于是乎&#xff0c;回顾这大半年&#xff0c;从互联网大厂到手机厂商&#xff0c;各路人马都在探索AI时代Killer AP…

【超级详细解释】力扣每日一题 134.加油站 48. 旋转图像

134.加油站 力扣 这是一个很好的问题。这个思路其实基于一种贪心策略。我们从整个路径的油量变化来理解它&#xff0c;结合一个直观的“最低点法则”&#xff0c;来确保找到正确的起点。 问题的核心&#xff1a;油量差值的累积 对于每个加油站&#xff0c;我们有两个数组&…

1、如何查看电脑已经连接上的wifi的密码?

在电脑桌面右下角的如下位置&#xff1a;双击打开查看当前连接上的wifi的名字&#xff1a;ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后&#xff0c;按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后&#xff0c;按一下回车&…

51单片机的水质检测系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器ph传感器浑浊度传感器蓝牙继电器LED、按键和蜂鸣器等模块构成。适用于水质监测系统&#xff0c;含检测和调整水温、浑浊度、ph等相似项目。 可实现功能: 1、LCD1602实时显示水温、水体ph和浑浊度 2、温…

Studying-多线程学习Part3 - condition_variable与其使用场景、C++11实现跨平台线程池

来源&#xff1a;多线程学习 目录 condition_variable与其使用场景 生产者与消费者模型 C11实现跨平台线程池 condition_variable与其使用场景 生产者与消费者模型 生产者-消费者模式是一种经典的多线程设计模式&#xff0c;用于解决多个线程之间的数据共享和协作问题。…

基于PHP的校园二手书交易管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园二手书交易管理系统 一 介绍 此二手书交易管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注…

k8s中pod的管理

一、资源管理 1.概述 说到k8s中的pod&#xff0c;即荚的意思&#xff0c;就不得不先提到k8s中的资源管理&#xff0c;k8s中可以用以下命令查看我们的资源&#xff1a; kubectl api-resources 比如我们现在需要使用k8s开启一个东西&#xff0c;那么k8s通过apiserver去对比etc…

《从零开始大模型开发与微调》真的把大模型说透了!零基础入门一定要看!

2022年底&#xff0c;ChatGPT震撼上线&#xff0c;大语言模型技术迅速“席卷”了整个社会&#xff0c;人工智能技术因此迎来了一次重要进展。与大语言模型相关的研发岗薪资更是水涨船高&#xff0c;基本都是5w月薪起。很多程序员也想跟上ChatGPT脚步&#xff0c;今天给大家带来…

51单片机系列-串口(UART)通信技术

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 并行通信和串行通信 并行方式 并行方式&#xff1a;数据的各位用多条数据线同时发送或者同时接收 并行通信特点&#xff1a;传送速度快&#xff0c;但因需要多根传输线&#xf…

免杀对抗—GOC#反VT沙盒资源分离混淆加密

前言 今天的主要内容是反VT沙盒&#xff0c;我们都知道生成的后门会被杀软上穿到沙盒中去运行&#xff0c;去逆向。如此一来我们的后门就很容易被查杀掉&#xff0c;但如果我们对后门进行一些操作&#xff0c;让它在被逆向的时候&#xff0c;反编译出一堆乱码&#xff0c;或者…