오구의코딩모험

[GAS] Gamplay Tags를 활용한 이벤트 구현 본문

Game/GAS

[GAS] Gamplay Tags를 활용한 이벤트 구현

오구.cpp 2025. 5. 16. 20:35
반응형

 

 

https://59travel.tistory.com/125

 

[GAS] 프로젝트 설정 및 캐릭터 구성하기

프로젝트 설정 GAS는 언리얼 엔진에서 플러그인으로 제공하고 있다.따라서 사용하고자 할 때, 플러그인 추가와 프로젝트 설정이 필요합니다. 1) 에디터에서 GameplayAbilitySystem 플러그인 활성화 2) [Y

59travel.tistory.com

 

 

저번 포스팅에서는 GAS를 위한 프로젝트 기본 설정과 캐릭터를 구성하여 점프 Ability를 구현해보았습니다.

 

이번 포스팅에서는

점프 이외의 피격 Ability를 구현해보며 피격 판정을 Gameplay Tags를 활용해보았습니다.

 

 


 

Gameplay Tags

 

 

Gameplay Tags란?

게임플레이 태그는 단어에서 유추할 수 있듯이 게임을 플레이하는 데 있어 유용한 분류 시스템입니다.

 

만일 내 캐릭터가 기절했다면?

내 캐릭터에게 'State.Debuff.Stun' 과 같이 태그를 붙여 상태를 분류하고 설명하는데 도움을 줄 수 있겠습니다.

 

따라서 태그(= FGameplayTag) 는 객체의 '상태'나 '속성'을 분류하는 문자열이며,
형식은 Category.Subcategory.Name처럼 계층 구조(State.Debuff.Stun)를 따릅니다.

 

 

왜 사용하는가? (vs bool/enum)

  • bool/enum보다 유연하고 확장 가능 : 다양한 상태를 조합하고 계층적으로 관리 가능합니다.
  • 복잡한 조건을 간단하게 표현 : 예) IsStunned == true 대신 HasTag(State.Debuff.Stun)
  • GAS와 연동 시, 능력/효과/조건/이벤트에 손쉽게 사용 가능합니다.

 

필자는 기존의 AnimInstance 내 변수인 (IsKnockback, bool) 값으로 피격 트리거를 다루던 것을

GameplayTag를 참조하여 GameplayEvent 트리거로 사용해 보았습니다.

 


 

 

태그 설정 및 참조

 

 

GameplayTagsDefaultGameplayTags.ini에서 미리 정의해줘야 합니다.

하지만 UE5 에디터부터는 프로젝트 세팅에 인터페이스를 제공하여 개발자가 DefaultGameplayTags.ini를 수동으로 편집하지 않고도 GameplayTags를 관리할 수 있도록 합니다.

 

 

태그 에디터 사용법 (UE5부터 제공)

  • Project Settings > Gameplay Tags에서 GUI로 태그 생성/이름 변경/삭제 가능합니다.
  • Reference Viewer로 태그 참조 에셋 시각화 가능합니다. (단, C++ 클래스는 표시되지 않음)
  • 이름 변경 시 리디렉션이 생성되므로, 가급적 새 태그 생성 → 참조 수정 → 기존 태그 삭제 방식 권장됩니다.

 

태그를 설정하고 참조 할 땐 다음과 같이 코드로 작성할 수 있습니다.

 

// 태그 참조 얻기
FGameplayTag StunTag = FGameplayTag::RequestGameplayTag(FName("State.Debuff.Stun"));

// 태그 보유 여부 확인
if (AbilitySystemComponent->HasMatchingGameplayTag(StunTag)) {
    // 기절 상태일 때 로직
}

 


 

 

피격 트리거 등록 및 이벤트 작동

 

 

1. Knockback 트리거 등록 (GA 내부)

// GA_Knockback.cpp
// UGA_Knockback::UGA_Knockback()

FAbilityTriggerData TriggerData;
TriggerData.TriggerTag = FGameplayTag::RequestGameplayTag(FName("Event.Knockback"));
TriggerData.TriggerSource = EGameplayAbilityTriggerSource::GameplayEvent;
AbilityTriggers.Add(TriggerData);

 

"Event.Knockback" 태그를 가진 GameplayEvent가 발생하면 자동으로 발동되도록 설정합니다.

 

 

2. 실제 이벤트 발생

// GasPaperCharacter.cpp
// AGasPaperCharacter::HandleAnyDamage()

FGameplayEventData EventData;
EventData.EventTag = FGameplayTag::RequestGameplayTag(FName("Event.Knockback"));
EventData.Instigator = DamageCauser;
EventData.Target = this;

ASC->HandleGameplayEvent(EventData.EventTag, &EventData);

 

캐릭터가 데미지를 받았을 때, 서버에서 Event.Knockback 태그가 있는 GameplayEvent를 ASC로 전달합니다.

 

 

3. GA_Knockback 작동

// GA_Knockback.cpp
// UGA_Knockback::ActivateAbility()

AnimInstance->SetIsKnockback(true);

StartLocation = Avatar->GetActorLocation();
Direction = (StartLocation - Causer->GetActorLocation()).GetSafeNormal();
TargetLocation = StartLocation + Direction * KnockbackStrength;

GetWorld()->GetTimerManager().SetTimer(...);

 

애니메이션 블루프린트를 통한 애니메이션 시퀀스 사용이 불가피하여 AnimInstance 변수를 대체하진 못했지만,

AnyDamaged 함수로 처리해주었던 '충격 방향 계산 → 캐릭터 이동 시작 → 애니메이션 변수 수정'을 GameplayEvent로 처리하게 변경하였습니다.

 

 


 

 

요약

 

GameplayTag는 객체의 '상태'를 표현하고 조작하는 범용 태그 시스템입니다.
복잡한 상태 로직을 단순화하며, GAS와 함께 쓸 때는 특히 강력합니다.
GameplayTagContainer와 ASC를 통해 효과적으로 관리하고, GameplayTag Editor를 사용해 쉽게 태그를 생성 및 유지할 수 있습니다.

 

* 용어 설명 
FGameplayTag 단일 태그 (예: State.Debuff.Stun)
FGameplayTagContainer 여러 개의 태그를 담는 컨테이너. TArray<FGameplayTag> 대신 권장
GameplayTagManager 모든 태그를 관리하는 중앙 시스템 (계층 구조 포함)
DefaultGameplayTags.ini 프로젝트에 등록된 태그를 저장하는 파일 (에디터에서 자동 관리 가능)
LooseGameplayTags ASC가 수동으로 관리하는 비영속 태그 (리플리케이션되지 않음)
Fast Replication 태그를 네트워크에 효율적으로 복제하는 기능 (서버/클라 태그 목록 일치 필요)
 

 

피격 코드

https://github.com/Kyungbaee/Forever-Planet/commit/956e2d9f4513fcce5d05771d6bb469debf78a180#diff-410dd09a9b1470011c34cc1338f0f6aa7c851a6e6e9dde3e4ab05993dddece2b

 

Implementing Knockback functionality using gameplaytags · Kyungbaee/Forever-Planet@956e2d9

+ +Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="W

github.com

 

캐릭터 내 피격 처리 코드

https://github.com/Kyungbaee/Forever-Planet/commit/956e2d9f4513fcce5d05771d6bb469debf78a180#diff-d0ace3373633f020a8ea24f4f32772acf1297dd75a2eae9238cf782a6080acf4

 

Implementing Knockback functionality using gameplaytags · Kyungbaee/Forever-Planet@956e2d9

+ +Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel

github.com

 

반응형

'Game > GAS' 카테고리의 다른 글

[GAS] 프로젝트 설정 및 캐릭터 구성하기  (0) 2025.05.11
Comments