0. 개요

이전 포스트에서 태그 메니저와 태그 초기화 함수를 호출 할 에셋 매니저를 싱글톤 패턴을 사용하여 생성했다.

이제 기존의 모든 속성을 Native 태그로 구성한다.


- Native 게임플레이 태그

게임플레이 태그는 기본적으로 플러그인의 형태처럼 엔진 내에서 데이터 테이블 등으로 추가하는 방법이 있다.

Native 게임플레이 태그는 C++ 코드에서 내장되어 엔진과 통합되어 사용할 수 있기 때문에, 외부 데이터 테이블 등을 불러오는 등의 작업이 필요하지 않아 성능적으로 이득을 볼 수 있다.

단, Native 태그를 변경하기 위해서는 코드를 변경하고 컴파일을 해야하기 때문에 유연성이 떨어진다.


1. Native 게임플레이 태그 생성 - AuraGameplayTags

모든 속성을 Native로 구성할 것이므로 기존에 에디터 프로젝트 설정에서 생성했던 모든 특성을 제거한다.

struct FAuraGameplayTags
{
	/* 싱글톤 매니저
	* 에디터에서 사용 가능한 기본 태그
	*/

public:
	static const FAuraGameplayTags& Get() { return GameplayTags; }
	static void InitailizeNativeGameplayTags();

	FGameplayTag Attributes_Primary_Strength;
	FGameplayTag Attributes_Primary_Intelligence;
	FGameplayTag Attributes_Primary_Resilience;
	FGameplayTag Attributes_Primary_Vigor;

	FGameplayTag Attributes_Secondary_Armor;
	FGameplayTag Attributes_Secondary_ArmorPanetration;
	FGameplayTag Attributes_Secondary_BlockChance;
	FGameplayTag Attributes_Secondary_CriticalHitChance;
	FGameplayTag Attributes_Secondary_CriticalHitDamage;
	FGameplayTag Attributes_Secondary_CriticalHitResistance;
	FGameplayTag Attributes_Secondary_HealthRegeneration;
	FGameplayTag Attributes_Secondary_ManaRegeneration;
	FGameplayTag Attributes_Secondary_MaxHealth;
	FGameplayTag Attributes_Secondary_MaxMana;


protected:


private:
	static FAuraGameplayTags GameplayTags;
};

 

#include "AuraGameplayTags.h"
#include "GameplayTagsManager.h"

FAuraGameplayTags FAuraGameplayTags::GameplayTags;

void FAuraGameplayTags::InitailizeNativeGameplayTags()
{
	GameplayTags.Attributes_Primary_Strength = UGameplayTagsManager::Get().AddNativeGameplayTag(
	FName("Attributes.Primary.Strength"),
		FString("물리 데미지 증가")
	);

	GameplayTags.Attributes_Primary_Intelligence = UGameplayTagsManager::Get().AddNativeGameplayTag(
	FName("Attributes.Primary.Intelligence"),
		FString("마법 데미지 증가")
	);

	GameplayTags.Attributes_Primary_Resilience = UGameplayTagsManager::Get().AddNativeGameplayTag(
	FName("Attributes.Primary.Resilience"),
		FString("블록 확률, 치명 저항 증가")
	);

	GameplayTags.Attributes_Primary_Vigor = UGameplayTagsManager::Get().AddNativeGameplayTag(
	FName("Attributes.Primary.Vigor"),
		FString("체력, 마나 회복력 증가")
	);

	GameplayTags.Attributes_Secondary_Armor = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.Armor"),
		FString("방어력 증가")
	);

	GameplayTags.Attributes_Secondary_ArmorPanetration = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.Armor"),
		FString("방어 관통 증가")
	);

	GameplayTags.Attributes_Secondary_BlockChance = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.BlockChance"),
		FString("블록 확률 증가")
	);

	GameplayTags.Attributes_Secondary_CriticalHitChance = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.CriticalHitChance"),
		FString("크리티컬 확률 증가")
	);

	GameplayTags.Attributes_Secondary_CriticalHitDamage = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.CriticalHitDamage"),
		FString("크리티컬 데미지 증가")
	);

	GameplayTags.Attributes_Secondary_CriticalHitResistance = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.CriticalHitResistance"),
		FString("크리티컬 저항 확률 증가")
	);

	GameplayTags.Attributes_Secondary_HealthRegeneration = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.HealthRegeneration"),
		FString("체력 리젠 증가")
	);

	GameplayTags.Attributes_Secondary_ManaRegeneration = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.ManaRegeneration"),
		FString("마나 리젠 증가")
	);

	GameplayTags.Attributes_Secondary_MaxHealth = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.MaxHealth"),
		FString("최대 체력 증가")
	);

	GameplayTags.Attributes_Secondary_MaxMana = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Secondary.MaxMana"),
		FString("최대 마나 증가")
	);
}

 

 

2. 데이터 에셋 - UAttributeInfo 클래스

이제 생성한 Native 태그를 위젯에 표시하고, 게임에서 활용하기 위해 데이터 에셋 블루프린트를 제작한다.

 

(1) AuraAttributeInfo 구조체

속성의 정보를 저장하는 구조체이다.

Native 태그, 태그 이름, 태그 설명, 값으로 이루어져 있으며, 값은 디테일 창에서 노출되지 않는다.

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

USTRUCT(BlueprintType)
struct FAuraAttributeInfo
{
	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;
};

 

(2) AttributeInfo 클래스

위의 AttributeInfo들을 Array로 저장한다. 추후 외부에서 FindAttributeInfoForTag 함수를 사용하여 태그에 대한 정보를 꺼내오는 용도로 사용할 수 있다.

UCLASS()
class AURA_API UAttributeInfo : public UDataAsset
{
	GENERATED_BODY()

public:
	// 태그를 가져와 Array에서 찾기
	FAuraAttributeInfo FindAttributeInfoForTag(const FGameplayTag& AttributeTag, bool bLogNotFound = false) const;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FAuraAttributeInfo> AttributeInformation;
	
};

 

 

3. 데이터 에셋 블루프린트

새로 생성한 UAttributeInfo 클래스를 상속받는 데이터 에셋 블루프린트를 생성한다.

 

(1) 블루프린트 생성

컨텐츠 브라우저 우클릭 - 기타 - 데이터 에셋 클릭 후 AttributeInfo를 상속받도록 선택한다.

 

(2) 태그 정보 작성

새로 생성했던 Native 태그들에 대해 작성한다.

 

이제 블루프린트로 데이터 에셋을 사용할 수 있게 되었다.

다음 포스트에서는 위젯 매니저 클래스를 생성하여 태그를 읽고 정보를 가져오도록 한다.