Eu4ng / TIL

Today I Learned
1 stars 0 forks source link

[UE5] 게임 플레이 태그 추가 + Native GameplayTag #25

Open Eu4ng opened 1 year ago

Eu4ng commented 1 year ago

환경설정 파일로 태그 추가

[ProjectName] > Plugins > [PluginName] > Config > Tags > [PluginName].ini

[/Script/GameplayTags.GameplayTagsList]
GameplayTagList=(Tag="Ability.ActivateFail.MagazineFull",DevComment="")

FGameSubtitlesModule.cpp

void FGameSubtitlesModule::StartupModule()
{
    UGameplayTagsManager::Get().AddTagIniSearchPath(FPaths::ProjectPluginsDir() / TEXT("GameSubtitles/Config/Tags"));
}

GameFeature

GameFeaturePluginStateMachine.cpp

UGameplayTagsManager::Get().AddTagIniSearchPath(PluginFolder / TEXT("Config") / TEXT("Tags"));

GameFeature 플러그인은 따로 StartupModule에 추가할 필요가 없는 것 같다.

Eu4ng commented 1 year ago

참고 링크

Eu4ng commented 1 year ago

Native GameplayTag 추가 방법

FGASGameplayTags::InitializeNativeTags();

주 게임 모듈의 경우

애셋 매니저의 StartInitialLoading을 override 하여 추가.

단, LoadingPhase는 PostSplashScreen, PreEarlyLoadingScreen 중 하나로 설정해야 한다. EarliestPossible, PostConfigInit 중 하나로 설정하면 Crash가 발생하고, PreEarlyLoadingScreen 이후에는 CDO 생성자 호출이 더 빨라 기본 클래스 CDO에는 Native GameplayTag가 적용되지 않는다.

PreDefault 에서도 CDO에 Native GameplayTag 적용되는 것 확인 차이점이 무엇인가

참고 링크

템플릿 코드

GASGameplayTags.h

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

#pragma once

#include "CoreMinimal.h"
#include "GameplayTagContainer.h"

class UGameplayTagsManager;

// Singleton containing native gameplay tags.
struct UNREALGAS_API FGASGameplayTags
{
public:
    static const FGASGameplayTags& Get() { return GameplayTags; }

    static void InitializeNativeTags();

    FGameplayTag State_Dead;
    FGameplayTag State_Debuff_Stun;
    FGameplayTag State_RemoveOnDeath;

protected:
    //Registers all of the tags with the GameplayTags Manager
    void AddAllTags(UGameplayTagsManager& Manager);

    //Helper function used by AddAllTags to register a single tag with the GameplayTags Manager
    void AddTag(FGameplayTag& OutTag, const ANSICHAR* TagName, const ANSICHAR* TagComment);

private:

    static FGASGameplayTags GameplayTags;
};

GASGameplayTags.cpp

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

#include "GASGameplayTags.h"
#include "GameplayTagsManager.h"
#include "Engine/EngineTypes.h"

// Convert VariableName to TagName
// ex) FGameplayTag Item_Equipment > "Item.Equipment"
#define ADD_TAG(VariableName, TagComment) AddTag(VariableName, TCHAR_TO_ANSI(*FString(# VariableName).Replace(TEXT("_"), TEXT("."))), TagComment)

FGASGameplayTags FGASGameplayTags::GameplayTags;

void FGASGameplayTags::InitializeNativeTags()
{
    UGameplayTagsManager& GameplayTagsManager = UGameplayTagsManager::Get();

    GameplayTags.AddAllTags(GameplayTagsManager);

    GameplayTagsManager.DoneAddingNativeTags();
}

void FGASGameplayTags::AddAllTags(UGameplayTagsManager& Manager)
{
    ADD_TAG(State_Dead, "Dead State");
    ADD_TAG(State_Debuff_Stun, "Stun Debuff State");
    ADD_TAG(State_RemoveOnDeath, "RemoveOnDeath State");
}

// Todo OutTag의 변수명을 분석하여 TagName을 자동으로 추가하는 기능 필요
void FGASGameplayTags::AddTag(FGameplayTag& OutTag, const ANSICHAR* TagName, const ANSICHAR* TagComment)
{
    OutTag = UGameplayTagsManager::Get().AddNativeGameplayTag(FName(TagName), FString(TEXT("(Native) ")) + FString(TagComment));
}
Eu4ng commented 1 year ago

매크로로 Native GameplayTag 추가하는 방법

UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag_Name)

UE_DEFINE_GAMEPLAY_TAG(Tag_Name, "Tag.Name");

UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_Name, "Tag.Name");

UDGameplayTags.h

#include "NativeGameplayTags.h"

UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Movement_Mode_Walk)
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Movement_Mode_Jog)
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Movement_Mode_Run)
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Movement_Mode_Fly)
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Movement_Mode_Swim)

UDGameplayTags.cpp

#include "UDGameplayTags.h"

UE_DEFINE_GAMEPLAY_TAG(TAG_Movement_Mode_Walk, "Movement.Mode.Walk");
UE_DEFINE_GAMEPLAY_TAG(TAG_Movement_Mode_Jog, "Movement.Mode.Jog");
UE_DEFINE_GAMEPLAY_TAG(TAG_Movement_Mode_Run, "Movement.Mode.Run");
UE_DEFINE_GAMEPLAY_TAG(TAG_Movement_Mode_Fly, "Movement.Mode.Fly");
UE_DEFINE_GAMEPLAY_TAG(TAG_Movement_Mode_Swim, "Movement.Mode.Swim");

참고 링크