虚幻引擎5 GAS开发俯视角RPG游戏 P06-25 属性信息数据资产

在上一篇,我们解析了UI属性面板的实现步骤:

  1. 首先我们需要通过c++去实现创建GameplayTag,这样可以在c++和UE里同时获取到Tag
  2. 创建一个DataAsset类,用于设置tag对应的属性和显示内容
  3. 创建AttributeMenuWidgetController实现对应逻辑

并且我们实现了第一步,就是在C++里可以创建GameplayTag,并且可以通过单例去获取到Tag的变量。后面属性修改委托也会通过Tag去匹配,这一篇,我们将实现创建一个DataAsset类,用于存储UI显示所需的数据。

1.创建DataAsset类

2.首先,我们先创建一个DataAsset使用的结构体,在结构体中增加三项不会在项目运行中修改的内容,实际的属性数值,我们则需要实时修改,所以,不需要通过蓝图面板设置。EditDefaultsOnly标示代表此属性可以通过面板修改内容。

Source/CC_Aura/Public/AbilitySystem/Data/AttributeInfo.h:

cpp 复制代码
// 版权归陈超所有

#pragma once

#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Engine/DataAsset.h"
#include "AttributeInfo.generated.h"

USTRUCT(BlueprintType)
struct FAttributeInfo
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FGameplayTag AttributeTag = FGameplayTag();

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FText AttributeName = FText();

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FText AttributeDescription = FText();

	UPROPERTY(BlueprintReadOnly)
	float AttributeValue = 0.f;
};


/**
 * 
 */
UCLASS()
class CC_AURA_API UAttributeInfo : public UDataAsset
{
	GENERATED_BODY()
	
};
  1. 创建数组AttributeInformation ,他的类型是前面创建的FAttributeInfo:
cpp 复制代码
protected:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FAttributeInfo> AttributeInformations;
	

3.创建方法:通过标签找到数组里的结构体:FAttributeInfo

cpp 复制代码
public:
	UFUNCTION()
	FAttributeInfo FindAttributeInfoFromTag(const FGameplayTag& Tag);
	
	
cpp 复制代码
// 版权归陈超所有


#include "AbilitySystem/Data/AttributeInfo.h"

FAttributeInfo UAttributeInfo::FindAttributeInfoFromTag(const FGameplayTag& Tag)
{
	for (const FAttributeInfo& Info: AttributeInformations)
	{
		if (Info.AttributeTag.MatchesTagExact(Tag))
		{
			return Info;
		}
	}
	
	UE_LOG(LogTemp, Error, TEXT("无法从数据资产[%s]中找到对应的标签[%s]"), *GetNameSafe(this), *Tag.ToString());
	return FAttributeInfo();
}

这段代码定义了一个游戏标签系统的匹配功能,主要用于检查标签之间的层级关系和精确匹配。

核心功能解析

MatchesTag方法 ‌ 用于检查标签的层级包含关系。当当前标签是待检查标签的子标签时返回true,例如"A.1"是"A"的子标签,所以"A.1".MatchesTag("A")返回true。但反过来"A".MatchesTag("A.1")则返回false,因为父标签不匹配子标签。如果待检查标签无效,始终返回false。

MatchesTagExact方法 ‌ 要求标签必须完全一致才返回true。它首先验证TagToCheck的有效性,然后严格比较两个标签的TagName是否相同。例如"A.1".MatchesTagExact("A")返回false,因为标签不完全相同。

扩展匹配功能

MatchesTagDepth方法 ‌ 评估两个标签的匹配程度,返回匹配的深度值,数值越高表示匹配越接近。

MatchesAny方法 ‌ 检查当前标签是否与容器中的任何标签匹配,同样支持层级关系检查。例如"A.1".MatchesAny({"A","B"})返回true,因为"A.1"是"A"的子标签。

MatchesAnyExact方法 ‌ 同样检查容器匹配,但只允许精确匹配。例如"A.1".MatchesAny({"A","B"})返回false,因为没有完全相同的标签。

实际应用区别

这些方法在游戏开发中用于不同的场景:层级匹配适用于技能继承系统,精确匹配适用于状态判定,深度匹配适用于优先级排序,容器匹配适用于多重条件检查。开发者需要根据具体需求选择合适的方法来实现标签系统的逻辑判断

相关推荐
ujainu2 小时前
Flutter + OpenHarmony 游戏开发进阶:用户输入响应——GestureDetector 实现点击发射
flutter·游戏·openharmony
ujainu2 小时前
Flutter + OpenHarmony 实现无限跑酷游戏开发实战—— 对象池化、性能优化与流畅控制
flutter·游戏·性能优化·openharmony·endless runner
小李也疯狂4 小时前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
呆呆敲代码的小Y4 小时前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
EQ-雪梨蛋花汤4 小时前
【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
unity·游戏引擎
rainbow68894 小时前
EffectiveC++入门:四大习惯提升代码质量
c++
秋邱4 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
我的offer在哪里4 小时前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
我在人间贩卖青春4 小时前
C++之析构函数
c++·析构函数
串流游戏联盟5 小时前
启程!手机也能邂逅暖暖万相奇观
游戏·远程工作