PS_GameplayTags.h


```

#pragma once
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
class UGameplayTagsManager;
struct PHYSICSUK_API FPS_GameplayTags
{
public:
static const FPS_GameplayTags& Get() { return GameplayTags; }
static void InitializeNativeTags();
//Input Tags
FGameplayTag InputTag_Move_Keyboard;
FGameplayTag InputTag_Move_GamePad;
FGameplayTag InputTag_Move_Mouse;
FGameplayTag InputTag_Jump;
FGameplayTag InputTag_Smesh;
FGameplayTag InputTag_Fire;
FGameplayTag InputTag_Interact;
FGameplayTag InputTag_Ability1;
FGameplayTag InputTag_Ability2;
FGameplayTag InputTag_OpenInventory;
FGameplayTag Damage;
//Effect Tags
FGameplayTag EffectTag_Damage;
//Status Tags
FGameplayTag StatusTag_Stunned;
FGameplayTag StatusTag_Death;
FGameplayTag StatusTag_Slow;
FGameplayTag StatusTag_PawnType_Player;
FGameplayTag StatusTag_PawnType_Enemy;
FGameplayTag StatusTag_HitReacting;
FGameplayTag StatusTag_Slash;
FGameplayTag StatusTag_SlashEnded;
//Vital Attributes
FGameplayTag Attributes_Vital_MaxHealth;
FGameplayTag Attributes_Vital_Health;
FGameplayTag Attributes_Vital_MaxMana;
FGameplayTag Attributes_Vital_Mana;
FGameplayTag Attributes_Vital_MaxStamina;
FGameplayTag Attributes_Vital_Stamina;
//Primary Attributes
FGameplayTag Attributes_Primary_Strength;
FGameplayTag Attributes_Primary_Dexterity;
FGameplayTag Attributes_Primary_Intelligence;
FGameplayTag Attributes_Primary_Resilience;
FGameplayTag Attributes_Primary_Vigor;
//Secondary Attributes
FGameplayTag Attributes_Secondary_Armor;
FGameplayTag Attributes_Secondary_ArmorPenetration;
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_StaminaRegeneration;
//AnimationStatus
FGameplayTag AnimationStatus_Idle;
FGameplayTag AnimationStatus_Walk;
FGameplayTag AnimationStatus_Run;
FGameplayTag AnimationStatus_Jump;
FGameplayTag AnimationStatus_Falling;
FGameplayTag AnimationStatus_Land;
FGameplayTag AnimationStatus_Attack;
FGameplayTag AnimationStatus_HitReact;
FGameplayTag AnimationStatus_Death;
protected:
void AddAllTags(UGameplayTagsManager& Manager);

void AddTag(FGameplayTag& OutTag, const ANSICHAR* TagName, const ANSICHAR* TagComment);
private:
static FPS_GameplayTags GameplayTags;
};

```


PS_GameplayTags.cpp

#include "GameplayTags/PS_GameplayTags.h"
#include "GameplayTagsManager.h"
#include "Kismet/KismetSystemLibrary.h"

FPS_GameplayTags FPS_GameplayTags::GameplayTags;



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

GameplayTags.AddAllTags(GameplayTagsManager);

GameplayTagsManager.DoneAddingNativeTags();
}

void FPS_GameplayTags::AddAllTags(UGameplayTagsManager& Manager)
{
AddTag(InputTag_Move_Keyboard, "InputTag.Move.Keyboard", "Move input.");
AddTag(InputTag_Move_Mouse, "InputTag.Move.Mouse", "Move (mouse) input.");
AddTag(InputTag_Move_GamePad, "InputTag.Move.GamePad", "Move (Gamepad) input.");
AddTag(InputTag_Jump, "InputTag.Jump", "Jump input");
AddTag(InputTag_Fire, "InputTag.Fire", "Fire input.");
AddTag(InputTag_Smesh, "InputTag.Smesh", "Smesh input.");
AddTag(InputTag_Interact, "InputTag.Interact", "Interact input.");
AddTag(InputTag_Ability1, "InputTag.Ability1", "Ability1 input.");
AddTag(InputTag_Ability2, "InputTag.Ability2", "Ability2 input.");
AddTag(InputTag_OpenInventory, "InputTag.OpenInventory", "OpenInventory input.");

AddTag(Attributes_Vital_MaxHealth, "Attributes.Vital.MaxHealth", "Maximum amount of Health obtainable");
AddTag(Attributes_Vital_Health, "Attributes.Vital.Health", "Current amount of Health");
AddTag(Attributes_Vital_MaxMana, "Attributes.Vital.MaxMana", "Maximum amount of Mana obtainable");
AddTag(Attributes_Vital_Mana, "Attributes.Vital.Mana", "Current amount of Mana");
AddTag(Attributes_Vital_MaxStamina, "Attributes.Vital.MaxStamina", "Maximum amount of Stamina obtainable");
AddTag(Attributes_Vital_Stamina, "Attributes.Vital.Stamina", "Current amount of Stamina");
AddTag(Attributes_Primary_Strength, "Attributes.Primary.Strength", "Increases physical damage");
AddTag(Attributes_Primary_Dexterity, "Attributes.Primary.Dexterity", "Increases ranged damage");
AddTag(Attributes_Primary_Intelligence, "Attributes.Primary.Intelligence", "Increases magical damage");
AddTag(Attributes_Primary_Resilience, "Attributes.Primary.Resilience", "Increases Armor and Armor Penetration");
AddTag(Attributes_Primary_Vigor, "Attributes.Primary.Vigor", "Increases Health");
AddTag(Attributes_Secondary_Armor, "Attributes.Secondary.Armor", "Reduces damage taken, improves Block Chance");
AddTag(Attributes_Secondary_ArmorPenetration, "Attributes.Secondary.ArmorPenetration", "Ignores Percentage of enemy Armor, increases Critical Hit Chance");
AddTag(Attributes_Secondary_BlockChance, "Attributes.Secondary.BlockChance", "Chance to cut incoming damage in half");
AddTag(Attributes_Secondary_CriticalHitChance, "Attributes.Secondary.CriticalHitChance", "Chance to double damage plus critical hit bonus");
AddTag(Attributes_Secondary_CriticalHitDamage, "Attributes.Secondary.CriticalHitDamage", "Bonus damage added when a critical hit is scored");
AddTag(Attributes_Secondary_CriticalHitResistance, "Attributes.Secondary.CriticalHitResistance", "Reduces Critical Hit Chance of attacking enemies");
AddTag(Attributes_Secondary_HealthRegeneration, "Attributes.Secondary.HealthRegeneration", "Amount of Health regenerated every 1 second");
AddTag(Attributes_Secondary_ManaRegeneration, "Attributes.Secondary.ManaRegeneration", "Amount of Mana regenerated every 1 second");
AddTag(Attributes_Secondary_StaminaRegeneration, "Attributes.Secondary.StaminaRegeneration", "Amount of Stamina regenerated every 1 second");
AddTag(Damage, "Damage", "Damage Amount dealt");
AddTag(EffectTag_Damage, "EffectTag.Damage", "Damage Effect");

AddTag(StatusTag_Death, "StatusTag.Death", "Death Status");
AddTag(StatusTag_Stunned, "StatusTag.Stunned", "Stunned Status");
AddTag(StatusTag_Slow, "StatusTag.Slow", "Slow Status");
AddTag(StatusTag_PawnType_Player, "StatusTag.PawnType.Player", "Player Pawn Type");
AddTag(StatusTag_PawnType_Enemy, "StatusTag.PawnType.Enemy", "Enemy Pawn Type");
AddTag(StatusTag_HitReacting, "StatusTag.HitReacting", "Hit Reacting Status");
AddTag(StatusTag_Slash, "StatusTag.Slash", "Slash Status");
AddTag(StatusTag_SlashEnded, "StatusTag.SlashEnded", "Slash Ended Status");

AddTag(AnimationStatus_Idle, "AnimationStatus.Idle", "Idle Animation Status");
AddTag(AnimationStatus_Run, "AnimationStatus.Run", "Run Animation Status");
AddTag(AnimationStatus_Walk, "AnimationStatus.Walk", "Walk Animation Status");
AddTag(AnimationStatus_Death, "AnimationStatus.Death", "Death Animation Status");
AddTag(AnimationStatus_Attack, "AnimationStatus.Attack", "Attack Animation Status");
AddTag(AnimationStatus_Jump, "AnimationStatus.Jump", "Jump Animation Status");
AddTag(AnimationStatus_Falling, "AnimationStatus.Falling", "Falling Animation Status");
AddTag(AnimationStatus_Land, "AnimationStatus.Land", "Land Animation Status");
AddTag(AnimationStatus_HitReact, "AnimationStatus.HitReact", "HitReact Animation Status");
}

void FPS_GameplayTags::AddTag(FGameplayTag& OutTag, const ANSICHAR* TagName, const ANSICHAR* TagComment)
{
OutTag = UGameplayTagsManager::Get().AddNativeGameplayTag(FName(TagName), FString(TEXT("(Native) ")) + FString(TagComment));
}

์ด๋Ÿฐ ์ฝ”๋“œ์ธ๋ฐ HotReload๋งŒ ํ•˜๋ฉด ๋ณ€์ˆ˜๊ฐ€ ์ „๋ถ€ ์ดˆ๊ธฐํ™”๋จ

BreakPoint ๋„ฃ์–ด๋ดค๋Š”๋ฐ HotReloadํ•˜๊ธฐ ์ „/ ํ›„ ์ € ํ•จ์ˆ˜๋“ค์„ ๋ถ€๋ฅด๋Š” ํ–‰์œ„ ์ž์ฒด๊ฐ€ ์—†์—ˆ์Œ


์™œ ์ดˆ๊ธฐํ™”๋ ๊นŒ..? HotReload ์ง„์งœ ๋ชป์จ๋จน๊ฒ ๋„ค

(๊ทผ๋ฐ ์ฝ”๋“œ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์„ ๋‘๊ฐ€์ง€๋กœ ํ•ด๋ดค๋Š”๋ฐ ๋ญ๊ฐ€ ๋” ๋ณด๊ธฐ์ข‹์Œ?)