언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

몬스터 근접 공격 - 4) 애니메이션 몽타주와 AnimNotify 태그 연동 + 공격당한 플레이어에게 데미지 적용

monstro 2025. 9. 27. 18:43
728x90
반응형

- 개요

구을의 공격 애니메이션

 

추후 추가할 근접 공격 몬스터인 구울은 고블린과 다르게 양손을 사용하여 공격한다

현재 프로젝트에서는 무기의 소켓을 통해서만 피격을 판정하므로 구울과 같은 상황에 대응하기 어렵다

따라서 애니메이션 몽타주 + AnimNotify의 태그 + Socket의 태그를 연동하여 하드코딩된 단일 값만이 아닌

상황에 맞는 여러가지 값을 사용하여 피격 판정을 진행할 수 있도록 설정한다

 

현재까지는 애니메이션 몽타주AnimNotify의 태그를 연동하는 작업까지 진행하고

피격된 플레이어에게 데미지를 적용하는 작업을 진행한다

 

1) 애니메이션 몽타주 + AnimNotify 태그 연동

1 - 1) AuraGameplayTags 클래스

새롭게 추가한 AnimNotify의 태그

 

추가한 태그를 생성

 

AuraGameplayTags 클래스에 위와 같이 AnimNotify에서 사용할 태그를 추가한다

각각 무기를 통해 공격하는 상황 / 오른손을 통해 공격하는 상황 / 왼손을 통해 공격하는 상황을 의미한다

 

 1 - 2) CombatInterface 클래스

 

CombatInterface 인터페이스전투를 수행하는 모든 캐릭터들이 상속받으므로 연동 작업을 수행하기 적합하다

TaggedMontage 구조체를 추가하고, 위와 같이 정의한다

  • Montage 멤버변수 : 공격하면 재생할 몽타주
  • MontageTag 멤버변수 : Montage 멤버변수에서 설정할 AnimNotify의 태그

 

 

CombatInterface 클래스에 GetAttackMontages 함수를 추가한다

해당 함수는 자식 클래스에서 오버라이드하여 자기자신의 TaggedMontage들을 반환하는 용도로 사용한다

 

1 - 3) AuraCharacterBase 클래스

 

사용할 TaggedMontage를 저장하는 AttackMontages 멤버변수를 추가하고,

해당 멤버변수를 반환할 GetAttackMontages 함수를 오버라이드한다

 

 

오버라이드한 로직은 위와 같이 구성하여 AttackMontages 멤버변수를 반환한다

 

2) 공격당한 플레이어에게 데미지 적용

2 - 1) AuraDamageGameplayAbility 클래스

 

플레이어에게 데미지를 줄 GameplayEffect를 적용할 CauseDamage 함수를 추가한다

 

 

로직은 위와 같다

DamageEffectClass를 통해 GESpecHandle을 생성하고,

DamageTypes 멤버변수를 순회하면서 생성한 GESpecHandle의 GESpec의 값을 설정한다

이후 Target에게 설정한 GESpec을 적용한다

 

2 - 2) AuraAttributeSet 클래스

 

ShowFloatingText 함수에 위와 같이 로직을 추가하여

플레이어Target이 되어 InComingDamage가 변경되어도 팝업 UI를 띄우도록 설정한다

 

3) 언리얼 에디터

3 - 1) BP_GoblinSpear 블루프린트

 

위와 같이 고블린 창병의 AttackMontages 멤버변수를 설정한다

 

3 - 2) AM_Attack_GoblinSpear 애니메이션 몽타주

 

AnimNotify에 기존에 설정한 Tag 대신 AttackMontages에서 설정한 태그로 변경한다

 

3 - 3) GA_MeleeAttack 블루프린트

 

플레이어에게 적용할 DamageEffectClass를 설정하고, DamageTypes 멤버변수를 설정한다

 

 

UpdateFacingTarget 함수 호출 이후의 로직을 위와 같이 수정한다

  • GetAttackMontages 함수 호출하여 해당 몬스터의 AttackMontages 멤버변수 반환
  • 반환된 AttackMontages를 분해하여 애니메이션 몽타주Tag를 각각 용도에 맞게 사용

 

 

GetLivePlayersWithinRadius 함수 호출 이후의 로직도 위와 같이 변경한다

Debug Sphere를 그리는 동작 대신 CauseDamage 함수를 호출하여 Target에게 DamageEffect를 적용한다

 

- 최종 실행 결과

 

728x90
반응형