프로그래밍/언리얼

Unreal GameplayTag c++

추향 2024. 11. 11. 22:41

Unreal GameplayTag

최근 Unreal프로젝트를 만들면서 GameplayAbility를 사용하면서 GameplayTag를 많이 사용해 보았다.

그러면서 에디터 내에서 태그를 추가하고 관리하는 방법이 아닌, 따로 파일을 만들어서 코드 상태로 태그를 선언하는 방법을 사용해보았다.

따로 에디터 내에서 태그를 추가하는 방식이 아닌, 파일을 만들어서 GameplayTag를 추가하고 관리하는 방식이 C++에서 태그를 사용할 때 꽤 편하다는 것을 느낄 수 있었다.

1. 컴파일 타임에 확인할 수 있어 잘못된 태그를 쉽게 찾아낼 수 있었다.

2. 자동완성 기능을 사용해 오타 없이 빠르게 작성해서 사용할 수 있었다.

이 외에도 장점이 더 있지만, 개인적으로는 이것들이 가장 크게 느껴졌다.

 

개인적으로 이렇게 느꼈다는 것이고, 이 글에서는 간단한 소개와 사용하는 방법에 대한 내용을 작성할 것이다.

1. 컴파일 타임에 확인이 가능해서 잘못된 태그를 찾아내기 편하다.

에디터에서 추가한다면 실행하기 전까지 오류가 있는지 알 수 없지만, 이건 잘못 작성하면 애초에 컴파일 및 빌드가 안돼서 실행할 수 없다.

그런데 어차피 자동완성 켜놓으면 잘못쓰기가 힘들다.

2. 자동완성 기능을 사용해 오타 없이 빠르게 작성해서 사용할 수 있다.

다음이 보통 에디터에서 추가한 태그를 가져오는 방식이다.

길고 FName형식이라 태그 이름에 오타가 생겨도 알려주지 않는다.

게임은 정상적으로? 실행은 되겠지만 해당 태그에 오타가 있다면 해당 태그를 사용하는 기능이 작동하지 않을 것이다.

FGameplayTag::RequestGameplayTag(FName("Player.State.FinishAttack"))

다음이 파일을 만들어서 관리하는 방식이다.

헤더파일만 추가하고 비슷하게 입력하면 다른 것들처럼 적당히 알아서 자동완성 시켜준다.

물론 틀리면 컴파일이 안된다.

BladeGameplayTags::Shared_Event_HitReact

사용하기.

build.cs에 GameplayTags모듈을 추가한다.

1. GameplayTags 파일 추가하기.

먼저 아무것도 상속받지 않는 C++클래스를 생성한다.

(아무거나 생성하고 헤더파일을 지워도 된다.)

다 지웠으면 NativeGameplayTags.h를 include 해주고 아래의 예시처럼 사용하면 된다.

//header
#pragma once
#include "NativeGameplayTags.h"

namespace BladeGameplayTags {
	/** Input **/
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Move);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Look);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Jump);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_EquipSword);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_UnEquipSword);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_LightAttack_Sword);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_HeavyAttack_Sword);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Roll);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_SwitchTarget);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_MustBeHeld);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_MustBeHeld_Block);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Toggleable);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Toggleable_TargetLock);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Toggleable_Rage);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_SpecialWeaponAbility_Light);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_SpecialWeaponAbility_Heavy);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_SpecialWeaponAbility_3);
	BLADE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_PickUp_Potions);
}
#include "BladeGameplayTags.h"
namespace BladeGameplayTags {
	/** Input **/
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Move, "InputTag.Move");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Look, "InputTag.Look");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Jump, "InputTag.Jump");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_EquipSword, "InputTag.EquipSword");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_UnEquipSword, "InputTag.UnEquipSword");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_LightAttack_Sword, "InputTag.LightAttack.Sword");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_HeavyAttack_Sword, "InputTag.HeavyAttack.Sword");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Roll, "InputTag.Roll");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_SwitchTarget, "InputTag.SwitchTarget");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_MustBeHeld, "InputTag.MustBeHeld");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_MustBeHeld_Block, "InputTag.MustBeHeld.Block");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Toggleable, "InputTag.Toggleable");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Toggleable_TargetLock, "InputTag.Toggleable.TargetLock");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Toggleable_Rage, "InputTag.Toggleable.Rage");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_SpecialWeaponAbility_Light, "InputTag.SpecialWeaponAbility.Light");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_SpecialWeaponAbility_Heavy, "InputTag.SpecialWeaponAbility.Heavy");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_SpecialWeaponAbility_3, "InputTag.SpecialWeaponAbility.3");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_PickUp_Potions, "InputTag.PickUp.Potions");
}

코멘트가 필요하다면 COMMENT가 붙은 것을 사용하면 된다.

NativeGameplayTags.h 에서 복붙하면 된다.

2. GameplayTags 사용하기.

사용하는 방법은 간단하다.

추가한 파일을 include 하고, GameplayTag를 선언한 네임스페이스를 통해 태그를 불러와 사용하면 됩니다.

(아래 사진 참고.)