Open Eu4ng opened 1 year ago
FGASGameplayTags::InitializeNativeTags();
애셋 매니저의 StartInitialLoading을 override 하여 추가.
IModuleInterface의 StartupModule을 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));
}
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag_Name)
UE_DEFINE_GAMEPLAY_TAG(Tag_Name, "Tag.Name");
UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_Name, "Tag.Name");
#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)
#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");
환경설정 파일로 태그 추가
[ProjectName] > Plugins > [PluginName] > Config > Tags > [PluginName].ini
FGameSubtitlesModule.cpp
GameFeature
GameFeaturePluginStateMachine.cpp