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

데미지 처리 심화 - 최종) 속성 공격 / 저항의 추가와 공격 스킬의 세분화

monstro 2025. 9. 14. 18:28
728x90
반응형

- 개요

다음과 같은 작업을 진행한다

  • 속성 별 공격속성 별 저항을 의미하는 Attribute + GameplayTag를 추가
  • 데미지를 주는 용도GameplayAbility 클래스를 만들고 기존의 클래스부모 클래스로 설정
  • 멀티 플레이어 상황을 대비하여 코드 구조를 일부 수정

 

1) 속성 별 공격 + 속성 별 저항을 의미하는 Attribute + GameplayTag 추가

1 - 1) AuraGameplayTags 클래스

속성 별 저항을 의미하는 Tag

 

속성 별 공격을 의미하는 Tag

 

속성 별 공격을 Key로, 속성 별 저항을 Value로 저장하는 TMap

 

위와 같이 멤버변수를 추가한다

 

속성 별 저항을 의미하는 GameplayTag를 실제로 추가

 

속성 별 공격을 의미하는 GameplayTag를 추가

 

속성 별 공격의 Tag와 속성 별 저항의 Tag를 연결

 

InitializeNativeGameplayTags 함수에 위의 3개의 로직을 추가하여 속성 별 공격 + 속성 별 저항을 설정한다

 

1 - 2) AuraAttributeSet 클래스

 

속성 별 저항의 Attribute에 대한 ATTRIBUTE_ACCESSORS 매크로를 추가한다

 

 

추가한 Attribute를 레플리케이션하기 위한 OnRep_ 함수들을 추가한다

 

 

생성자에 위의 로직을 추가하여 속성 별 저항GameplayTagAttribute를 연결한다

 

 

GetLifetimeReplicatedProps 함수에서 속성 별 저항Attribute에 대한 레플리케이션을 설정한다

 

 

추가한 속성 별 저항의 Attriubute에 대한 OnRep_ 함수의 로직은 위와 같다

각 Attribute에 대해GAMEPLAYATTRIBUTE_REPNOTIFY 매크로를 설정하여 호출한다

 

1 - 3) ExecCalc_Damage 클래스

 

AuraDamageStatics 구조체연산에 사용할 Attribute를 캡쳐하도록 명시한다

 

 

TagsToCaptureDefs 멤버변수를 추가하여 해당 TMap에서 Tag캡쳐한 Attribute를 연결한다

 

 

AuraDamageStatics 구조체의 생성자에 위의 로직을 추가한다

  • 속성 별 저항의 Attribute를 캡쳐하도록 설정
  • TagsToCaptureDefs 멤버변수에 TagKey로, 캡쳐된 AttributeValue로 저장

 

 

UExecCalc_Damage 클래스의 생성자에서 연산에 사용할 캡쳐속성 별 저항의 Attribute를 추가한다

 

 

Execute 함수의 Damage의 초기값을 설정하는 로직을 위와 같이 수정한다

속성 별 공격의 Tag연결된 값을 가져와속성 별 저항의 Tag연결된 값만큼 감소시킨다

 

2) 데미지를 주는 용도의 GameplayAbility 클래스 

2 - 1) AuraGameplayAbility 클래스

 

AuraGameplayAbility 클래스프로젝트에서 사용하는 모든 GA들의 조상 클래스이다

이때 기존의 멤버변수로 사용하는 Damage 멤버변수를 삭제한다

 

2 - 2) AuraDamageGameplayAbility 클래스

 

피해를 주는 용도로 사용하는 AuraDamageGameplayAbility 클래스를 생성한다

부모 클래스는 AuraGameplayAbility이고, 멤버변수는 다음과 같다

  • 데미지를 주어 Attribute를 변경하는 용도의 GameplayEffect
  • 속성 별 공격의 Tag속성 별 공격의 피해량을 연결하는 TMap

 

2 - 3) AuraProjectileSpell 클래스

 

클래스의 부모를 AuraDamageGameplayAbility 클래스로 변경하고, 중복되는 멤버변수를 제거한다

 

 

SpawnProjectile 함수의 로직을 위와 같이 수정한다

속성 별 공격의 Tag속성 별 공격의 피해량을 연결한 TMap을 순회하면서

레벨에 따른 피해량을 가져오고, 투사체GameplayEffect를 설정한다

 

3) 멀티 플레이어 처리

3 - 1) AuraAttributeSet 클래스

 

ShowFloatingText 함수에서 0번째 PlayerController가 아닌, 로컬PlayerController를 가져오도록 수정한다

 

3 - 2) AuraProjectile 클래스

 

OnHit 함수를 새롭게 추가한다

 

 

OnHit 함수의 로직은 위와 같은데, 투사체가 피격되면 호출되어 피격과 관련한 FX를 처리한다

 

 

Destroyed 함수를 위와 같이 수정한다

클라이언트라면 OnHit 함수를 호출하여 피격과 관련한 FX를 처리한다

 

 

OnSphereOverlap 함수에 위의 로직을 추가한다

  • GE를 적용하는 대상오버랩된 대상과 동일하다면 처리하지 않아야 하므로 얼리 리턴
  • 피격과 관련한 FX 효과 처리

 

3 - 3) AuraEnemy 클래스

 

BeginPlay 함수에 위의 로직을 추가하여 서버에서 몬스터에 대한 기본 GA를 적용한다

 

3 - 4) AuraPlayerController 클래스

 

ShowDamageNumber 함수로컬 클라이언트인지 판단하는 조건을 추가한다

 

4) 언리얼 에디터

 

위와 같이 플레이어와 몬스터에 적용하는 GE에서 속성 별 저항의 Attribute와 관련된 설정을 추가한다

 

 

공격하기 위해 발동하는 GA에서 Damage Types 멤버변수를 설정한다

속성 별 공격의 GameplayTag와 해당 공격의 데미지를 설정하는 Curve를 설정한다

 

- 최종 실행 결과

 

728x90
반응형