1. 게임플레이 태그 만들기
게임플레이 태그를 통해 다양한 어트리뷰트들을 관리할 것이다.
이 게임플레이 태그를 C++ 클래스로 만들어 c++에서도 사용할 수 있게 할 것이다.
빈 C++ 클래스로 만들것이다.
클래스라고 말하긴 했지만 구조체로 만들 것이다. 사실 기능상 차이는 별로 없기는 하다.
헤더 파일을 가져오자.
#include "GameplayTagContainer.h"
이제 이 구조체는 싱틀톤 구조로 만들것이다. 싱글톤이란 인스턴스가 오직 하나만 존재하는 디자인 패턴을 말한다.
struct FAuraGameplayTags
{
public:
static const FAuraGameplayTags& Get() { return GameplayTags; }
static void InitializeNativeGameplayTags();
protected:
private:
static FAuraGameplayTags GameplayTags;
};
스태틱 멤버 변수와 멤버 함수들을 만든다. 함수에서는 게임플레이 태그를 생성할 것이다.
C++ 파일 구조는 아래와 같다.
#include "AuraGameplayTags.h"
#include "GameplayTagsManager.h"
FAuraGameplayTags FAuraGameplayTags::GameplayTags;
void FAuraGameplayTags::InitializeNativeGameplayTags()
{
UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Attributes.Secondary.Armor"), FString("Reduce Damage taken"));
}
싱글톤 패턴은 인스턴스가 하나만 존재해야하기 때문에 변수의 초기화를 Cpp 파일에서 진행한다. 헤더파일에서 초기화를 하면 헤더파일을 인클루드 하는 곳 마다 인스턴스가 생성되버릴 것이다.
함수내에서는 게임플레이 태그매니저를 통해 게임플레이 태그들을 생성해주고 있다.
이제 이 함수를 실제로 실행시켜서 태그를 생성해야 한다. 그럼 어디서 이것을 호출해야할까? 또 다른 싱글톤 클래스인 에셋 매니저 클래스에서 이를 실행시킬 것이다. 다시 에디터로 들어가자.
2. 에셋 매니저 만들기
에셋 매니저 클래스를 생성하자.
#pragma once
#include "CoreMinimal.h"
#include "Engine/AssetManager.h"
#include "AuraAssetManager.generated.h"
/**
*
*/
UCLASS()
class PRACTICE2_API UAuraAssetManager : public UAssetManager
{
GENERATED_BODY()
public:
static UAuraAssetManager& Get();
};
이제 get 함수를 정의해보도록 하자.
UAuraAssetManager& UAuraAssetManager::Get()
{
check(GEngine);
UAuraAssetManager* AuraAssetManager = Cast<UAuraAssetManager>(GEngine->AssetManager);
return *AuraAssetManager;
}
GEngine에서 에셋메니저를 찾아 우리가 만든 커스텀 타입으로 캐스팅하여 반환하면 된다.
이제 매니에서에서 태그 생성함수를 호출하는 방법을 알아보자. 함수 하나를 오버라이드 하여 사용하면 된다.
protected:
virtual void StartInitialLoading() override;
이 함수는 에디터가 처음 로딩될때 호출되는 함수라고 한다.
여기서 이제 게임플레이 태그의 스태틱 함수를 호출하면 될 것이다. 헤더파일을 포함하는 것을 잊지말자.
void UAuraAssetManager::StartInitialLoading()
{
Super::StartInitialLoading();
FAuraGameplayTags::InitializeNativeGameplayTags();
}
이제 이렇게 하고 이 에셋매니저를 실제로 사용하는 법을 알아야 한다. 에셋 매니저를 프로젝트 세팅에서 설정해주어야 한다.
컴파일하고 에디터로 들어가자.
Project Settings > General Settings > Default Classes > Advanced > Asset Manager Class 항목으로 들어가면 된다.
에셋 메니저 클래스를 바꿔주고 에디터를 껏다 다시 키면 된다.
Armor 태그가 생긴 것을 볼 수 있다. 사진에는 안나오지만 오른쪽을 보면 Native 라고 표시되어 있어 C++에서 생성된 것임을 알 수 있다.
이제 C++에서 태그를 만들 수 있으니 태그를 만드는 작업을 완성해보자. 현재 에디터 상에는 태그를 추가하고 있지만 정작 c++에서 이 태그를 사용할 수는 없다. 변수로 만들지 않았기 때문이다. 이제 이 변수를 생성하자.
헤더파일에서 변수를 선언하자.
FGameplayTag Attribute_Secondary_Armor;
네이티브 태그를 생성함과 동시에 이를 할당해준다. 물론 이것은 싱글톤 패턴이기 때문에 인스턴스 내에 있는 변수에 할당해주어야 한다.
FAuraGameplayTags FAuraGameplayTags::GameplayTags;
void FAuraGameplayTags::InitializeNativeGameplayTags()
{
GameplayTags.Attribute_Secondary_Armor = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Attributes.Secondary.Armor"), FString("Reduce Damage taken"));
}
이제 태그를 생성하는 방법을 알았으니 태그들을 전부 만들어주면 된다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 35. 커스텀 블루프린트 라이브러리 만들기 (0) | 2024.12.02 |
---|---|
[실습2] 34. 어트리뷰트 정보를 담은 데이터 에셋 만들기 (0) | 2024.12.02 |
[실습2] 32. 커스텀 계산식으로 어트리뷰트 설정하기 (0) | 2024.12.01 |
[실습2] 31. Combat 인터페이스를 통해 플레이어 레벨 얻기 (0) | 2024.12.01 |
[실습2] 30. 게임플레이 이펙트로 어트리뷰트 초기화 하기 (0) | 2024.12.01 |