UE 5 GAS 在项目中处理AttributeSet相关

这篇具有很好参考价值的文章主要介绍了UE 5 GAS 在项目中处理AttributeSet相关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这一篇文章是个人的实战经验记录,如果对基础性的内容不了解的,可以看我前面一篇文章对基础的概念以及内容的讲解。

设置AttributeSet

使用GAS之前,首先需要设置参数集AS,这个是用于同步的一些参数,至于如何设置GAS,我之前的文章里面有讲,这里不赘述。
每个Attribute其实包含两个值 Base Value和Current Value。Base Value是在GE里面Instant设置属性时被修改的值,而Current Value是在GE的Infinite(永久修改)和Has Duration(具有时效性修改)时修改的,目的就是为了时效失效以后,能够将值的结果修改回去。当然获取值时都是获取的Current Value,如果没有时效性的影响,Base Value和Current Value值也是相等的。
AS里面主要还是为了创建一些值,并且由ASC调用GE去修改里面的值,但是这个类只能在C++里面去定义。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
上面是我在AS里面定义的两个生命相关的值,以及覆盖的两个函数回调。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
PreAttributeChange 主要是为了触发一个值的最大值被修改后,它的值也会按比例进行修改
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
AdjustAttributeForMaxChange 就是为了实现这个效果的函数,这个也是从ActionRPG的项目里面抄过来的。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
PostGameplayEffectExecute 就是Base Value改变后触发的,我们可以在这个函数里面比如限制血量不会超过最大血量的值,也不会小于0的情况。

初始化Attribute

创建好了AS,接着要在角色身上使用并且初始化AS里面一些值,这里有三种方法:

  1. 第一种方法也不算方法,其实就是在AS类里面给它设置默认值
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    这是设置以后也算是初始化了相关属性的一些值。
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    我们还需要在OwnerActor里面进行初始化,需要在实例化ASC后面创建即可。这样我们就可以在ASC中去获取AS的值了。

  2. 第二种方法当然就是官方推荐的使用GE去初始化
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    创建一个GE,然后Duration Policy设置为Instant(直接修改Base Value),然后设置好需要修改的Attribute,Modifier Op设置为Override(覆盖),然后在下面的设置固定数值,就可以实现重新设置,只需要设置每个就可以实现覆盖。
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    这里有个小细节,就是初始化时,推荐先修改最大值,然后再修改默认值,因为在C++里面,我们有个按比例进行修改默认值的,如果你先修改Health然后再修改MaxHealth,它会按比例放大的,然后再直接获取值会出现问题,所以我先设置的最大值,然后再设置就没这样的问题了。
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    设置完成以后,使用ApplyGameplayEffectToSelf节点,去设置即可。

  3. 使用DataTable设置默认值
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    这个需要开启在蓝图内读写ASC
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    然后ASC细节里面会有一项AttributeTest,里面可以创建多个数组,代表可以初始化多个AS。Attributes选择AS的类,DefaultStartingTable则是选择创建的DataTable。
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    创建DataTable的时候,需要选择AttributeMetaData
    UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
    行命名,要和在GE里面设置的命名保持一致,设置值时,就BaseValue有用,其它值估计是为了以后版本更新时使用,现在还没啥用。

获取AttributeSet的数据

UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
可以从ASC去获取属性的Base Value
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
可以从ASC中获取Current Value

我们还可以通过扩展c++接口来实现获取
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
比如在它的OwnerActor类里面增加获取属性的方法,其实就是返回AttributeSet的相关属性

还有一种就是使用AbilityTask实现监听接口,需要创建C++类来实现,这里我也是直接从官方文档案例里面扒的,把代码列出来。

AT_AttributeChanged.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "AbilitySystemComponent.h"
#include "AT_AttributeChanged.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnAttributeChanged, FGameplayAttribute, Attribute, float, NewValue, float, OldValue);

/**
 * Blueprint node to automatically register a listener for all attribute changes in an AbilitySystemComponent.
 * Useful to use in UI.
 */
UCLASS(BlueprintType, meta = (ExposedAsyncProxy = AsyncTask))
class SURVIVALALONE_API UAT_AttributeChanged : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintAssignable)
		FOnAttributeChanged OnAttributeChanged;

	// Listens for an attribute changing.
	UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
		static UAT_AttributeChanged* ListenForAttributeChange(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAttribute Attribute);

	// Listens for an attribute changing.
	// Version that takes in an array of Attributes. Check the Attribute output for which Attribute changed.
	UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
		static UAT_AttributeChanged* ListenForAttributesChange(UAbilitySystemComponent* AbilitySystemComponent, TArray<FGameplayAttribute> Attributes);

	// You must call this function manually when you want the AsyncTask to end.
	// For UMG Widgets, you would call it in the Widget's Destruct event.
	UFUNCTION(BlueprintCallable)
		void EndTask();

protected:
	UPROPERTY()
		UAbilitySystemComponent* ASC;

	FGameplayAttribute AttributeToListenFor;
	TArray<FGameplayAttribute> AttributesToListenFor;

	void AttributeChanged(const FOnAttributeChangeData& Data);
};

AT_AttributeChanged.cpp

// Fill out your copyright notice in the Description page of Project Settings.

#include "AT_AttributeChanged.h"

UAT_AttributeChanged *UAT_AttributeChanged::ListenForAttributeChange(UAbilitySystemComponent *AbilitySystemComponent, FGameplayAttribute Attribute)
{
	UAT_AttributeChanged *WaitForAttributeChangedTask = NewObject<UAT_AttributeChanged>();
	WaitForAttributeChangedTask->ASC = AbilitySystemComponent;
	WaitForAttributeChangedTask->AttributeToListenFor = Attribute;

	if (!IsValid(AbilitySystemComponent) || !Attribute.IsValid())
	{
		WaitForAttributeChangedTask->RemoveFromRoot();
		return nullptr;
	}

	AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attribute).AddUObject(WaitForAttributeChangedTask, &UAT_AttributeChanged::AttributeChanged);

	return WaitForAttributeChangedTask;
}

UAT_AttributeChanged *UAT_AttributeChanged::ListenForAttributesChange(UAbilitySystemComponent *AbilitySystemComponent, TArray<FGameplayAttribute> Attributes)
{
	UAT_AttributeChanged *WaitForAttributeChangedTask = NewObject<UAT_AttributeChanged>();
	WaitForAttributeChangedTask->ASC = AbilitySystemComponent;
	WaitForAttributeChangedTask->AttributesToListenFor = Attributes;

	if (!IsValid(AbilitySystemComponent) || Attributes.Num() < 1)
	{
		WaitForAttributeChangedTask->RemoveFromRoot();
		return nullptr;
	}

	for (FGameplayAttribute Attribute : Attributes)
	{
		AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attribute).AddUObject(WaitForAttributeChangedTask, &UAT_AttributeChanged::AttributeChanged);
	}

	return WaitForAttributeChangedTask;
}

void UAT_AttributeChanged::EndTask()
{
	if (IsValid(ASC))
	{
		ASC->GetGameplayAttributeValueChangeDelegate(AttributeToListenFor).RemoveAll(this);

		for (FGameplayAttribute Attribute : AttributesToListenFor)
		{
			ASC->GetGameplayAttributeValueChangeDelegate(Attribute).RemoveAll(this);
		}
	}

	SetReadyToDestroy();
	MarkAsGarbage();
}

void UAT_AttributeChanged::AttributeChanged(const FOnAttributeChangeData &Data)
{
	OnAttributeChanged.Broadcast(Data.Attribute, Data.NewValue, Data.OldValue);
}

类实现了以后,我们可以使用里面的两个方法:
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
Listen for Attribute Change 可以监听一个属性的变动,返回了当前监听实例,以及变动后的回调,还有之前的值,变化后的值,如果值发生改变,就会触发OnAttributeChanged执行,只需要后面执行,每次数值改变,都会触发执行。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
Listen for Attribute Change可以传入一个数组,获取多个属性的变动然后可以通过Attribute返回值判断是哪个属性
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
取消监听,那么记得调用End Task,一般在UI里面使用,可以在创建UI的时候绑定,然后把绑定的Task设置为变量,销毁的时候End Task即可。

设置AttributeSet的值

在GAS系统中,修改AttributeSet的值,需要使用GE去实现
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
前面在初始化的时候,也讲了相应的配置。如果上面的值是Instant,那么这个GE被调用的时候,血量的值会瞬间掉1点。

接下来,介绍几个会在项目中使用到的场景。

持续掉血,每秒掉多少血量

UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
使用Has Duration,下面设置持续时间,在Period设置每过多少秒触发一次,Execute Periodic Effect on Application 意思为添加时是否触发一次。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
最简单的就是调用一下就行了,一般这个需要在GA里面去触发的,这一篇不包括GA相关。

根据等级设置血量加成

先创建一个CSV,可以先创建Excel文件,转csv
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
设置好文件以后
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
创建一个曲线表格
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
选择上面导入键,可以将csv文件导入,Row是作为值的名称,使用时需要选择哪个Row,而数字则代表当前的技能等级。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
这里因为是加成,所以,运算修改为相乘,而ScalableFloatMagnitude的数值是从曲线表格里面获取到的值和此值相乘为最终的值。这个值再与现在的MaxHealth相乘得到了变化后的值。
后面设置了曲线表格,然后选择Row,然后就可以预览相应的值,这个预览的值是在将GE附加到ASC上面的时候设置。
UE 5 GAS 在项目中处理AttributeSet相关,unreal,网络,unreal engine 5,笔记,游戏引擎,游戏
在附加的时候,我们可以设置Level等级,就是曲线表格里面的那个数值。文章来源地址https://www.toymoban.com/news/detail-640942.html

到了这里,关于UE 5 GAS 在项目中处理AttributeSet相关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE(Unreal Engine,虚幻引擎)和Unity的区别与联系

    一、基本概念 游戏制作软件中最著名的两个游戏引擎是UE和Unity,二者有各自的特点和适用场景。 UE是指Unreal Engine(虚幻引擎)的简称,它是由Epic Games(Epic游戏公司)开发的一款高度先进的游戏开发工具。UE是一种3D图形渲染引擎,为开发者提供了一系列强大的功能,使他们

    2024年04月13日
    浏览(47)
  • UE4(Unreal Engine4)虚幻引擎视口布局,并且自定义HDRI

    在UE4中搭建电影级场景。先看下效果 (1)在UE4(Unreal Engine4)中安装 Quixel Bridge Megascans bridget插件 具体操作:请看我这篇博文:Quixel Bridge Megascans bridget插件 (2)素材准备: Quixel Bridge (1)创建关卡 (2)设置过场动画 (3)加入HDRI背景 (4)重置曝光 (5)组装资源 石头 蘑菇

    2023年04月08日
    浏览(59)
  • UE4(Unreal Engine 4)运行setup.bat发生403报错的问题

    最近UE官方在迁移服务器,有些D:UE4EngineBuildCommit.gitdeps.xml文件需要更新。此时需要你去往UE对应的版本下载新的Commit.gitdeps.xml文件,并且覆盖原有的Commit.gitdeps.xml文件。UE的官方说明 覆盖前 覆盖后

    2024年02月11日
    浏览(45)
  • 《使用Unreal Engine Python插件进行UE4中的Python开发》学习笔记1

    ·本文为B站系列教学视频 《使用 UnrealEnginPython 插件进行UE4中的Python开发》 ——《 Day 01 初识 UnrealEnginePython 》的学习笔记,UP主为腾讯游戏策划、虚幻社区贡献者 世欺子。 本节课对基于虚幻引擎( Unreal Engine )的 Python 集成开发插件 UnrealEnginePython 进行简要介绍,接着在虚幻

    2024年04月11日
    浏览(67)
  • Unreal Engine工程项目目录及对应作用

    目录 .vs Binaries:编译文件 Config:配置文件 Content:资产文件 DerivedDataCache:UE针对平台特化的资源版本 Intermediate:中间文件 Saved:自动保存的内容 Source:源(代码)文件 .sln文件:VS的工程文件 .uproject:虚幻的启动文件 为啥要说这个呢? 有两点: 便于我们管理并查找相应资

    2023年04月19日
    浏览(62)
  • 【UE4闪退解决办法】D3D设备丢失,Unreal Engine is exiting due to D3D device being lost

    百度那些被小编到处传的,一般来说都没啥用的。我后来在贴吧老哥的楼里才翻出一个别样的解决方法。 打开英伟达的这个驱动软件,GeForce Experience  进去后,在“驱动程序”里面,点3个点打开列表,选择“studio驱动程序” 然后就是选择自定义安装(不要快速!),之后弹

    2024年02月13日
    浏览(156)
  • 6. UE5 RPG AttributeSet的设置

    AttributeSet 负责定义和持有属性并且管理属性的变化。开发者可以子类化UAttributeSet。在OwnerActor的构造方法中创建的AttributeSet将会自动注册到ASC。这一步必须在C++中完成。 Attributes 是由 FGameplayAttributeData定义的浮点值。 Attributes能够表达从角色的生命值到角色等级到药瓶的价格等

    2024年01月18日
    浏览(37)
  • 【整活】Unreal Engine 3体验

    今天下了UDK,想在用虚幻5的年头体验一下\\\"上古时代\\\"的虚幻3,链接 安装 跟虚幻4对比,虚幻4可是比它大不少:      一般来说,编辑器程序在这个文件夹中 比如我的这个: 这个UDK.exe就是虚幻3编辑器程序 游戏 双击打开,却发现它默认运行自带的游戏       ......别说这画质还可以..

    2023年04月08日
    浏览(41)
  • Unreal Engine添加UGameInstanceSubsystem子类

    点击C++类文件夹,在右边的区域点击鼠标右键,在弹出的菜单中选择“新建C++类” 在弹出的菜单中选中“显示所有类”,选择GameInstanceSubsystem作为父类, 点击“下一步”按钮 输入子类名称“UVRVIUOnlineGameSubsystem”,选择插件作为新类的目标模块,点击“公共”选择器 打开C++工

    2024年04月26日
    浏览(45)
  • Unreal Engine游戏引擎的优势

    在现在这个繁荣的游戏开发行业中,选择合适的游戏引擎是非常重要的。其中,Unreal Engine作为一款功能强大的游戏引擎,在业界广受赞誉。那Unreal Engine游戏引擎究竟有哪些优势,带大家简单的了解一下。 图形渲染技术 Unreal Engine确实提供了先进的图形渲染技术,包括实时光

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包