본문 바로가기

게임프로그래밍/실습2

[실습2] 33. C++로 게임플레이 태그 만들기 (싱글톤 디자인 적용)

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"));
}

 

이제 태그를 생성하는 방법을 알았으니 태그들을 전부 만들어주면 된다.