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));
}
#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 ์ง์ง ๋ชป์จ๋จน๊ฒ ๋ค
(๊ทผ๋ฐ ์ฝ๋ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ ๋๊ฐ์ง๋ก ํด๋ดค๋๋ฐ ๋ญ๊ฐ ๋ ๋ณด๊ธฐ์ข์?)
2๋ฒ์งธ๊ฐ ๋ ์๋ณด์ด๋ค
๊ทผ๋ฐ ์งค๋ ค
๋์ค์ฝ๋์ ๋ฌผ์ด๋ณด๋๊น HotReload ๋ฒ๊ทธ์๋ค๊ณ Live Coding ์ฐ๋ผ๋๋ฐ ๊ทผ๋ฐ ์ด๊ฑฐ๋ ๋ฒ๊ทธ ๋ง์ผ๋๊น ๊ทธ๋ฅ ๊ป๋คํค๋๊ฒ ์ข๊ธดํ๋ฐ
์๊ณ ์๊ธด ํ๋๋ฐ ๋ญ๊ฐ ๋ ๊ฑฐ์ง๊ฐ๋ค HotReload
DO NOT DISABLE LIVE CODING. disabling live coding enables hot reload. hot reload corrupts assets. turn live coding back on. For UE5 only: go into editor settings and search for Reinstancing. turn this off (uncheck it). Reinstancing also corrupts assets. UE4 doesn't have Reinstancing.
Any time you edit a .h file, close the editor and build+run from your IDE Any time you edit a constructor function, close the editor and build+run from your IDE When editing other existing functions in .cpp files, you can try live coding (ctrl+alt+F11) Always open your project from your IDE (build and run, or build and run with debugging)
reinstancing๋ ๊บผ๋ ์๋ํฐ ๋ฉ๋ด์์
ide์์์ปดํ์ผํ์๋ ๊ฐํน ์์ง์์ ใ ใน๋ ๋์์ ์์ง์ ์ปดํ์ผ๋ฒํผ ๋๋ฌ์ฃผ๋ฉด ์ข ๋์ - dc App
์ ๊ฒฝ์ฐ๋ ๊ฐ๋์ด ์๋๋ผ ๊ทธ๋ฅ ๋ฌด์กฐ๊ฑด์ด์ฌ์