- 개요
다음과 같은 작업을 진행한다
- 속성 별 공격과 속성 별 저항을 의미하는 Attribute + GameplayTag를 추가
- 데미지를 주는 용도의 GameplayAbility 클래스를 만들고 기존의 클래스의 부모 클래스로 설정
- 멀티 플레이어 상황을 대비하여 코드 구조를 일부 수정
1) 속성 별 공격 + 속성 별 저항을 의미하는 Attribute + GameplayTag 추가
1 - 1) AuraGameplayTags 클래스



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



InitializeNativeGameplayTags 함수에 위의 3개의 로직을 추가하여 속성 별 공격 + 속성 별 저항을 설정한다
1 - 2) AuraAttributeSet 클래스

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

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

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

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

추가한 속성 별 저항의 Attriubute에 대한 OnRep_ 함수의 로직은 위와 같다
각 Attribute에 대해서 GAMEPLAYATTRIBUTE_REPNOTIFY 매크로를 설정하여 호출한다
1 - 3) ExecCalc_Damage 클래스

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

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

AuraDamageStatics 구조체의 생성자에 위의 로직을 추가한다
- 속성 별 저항의 Attribute를 캡쳐하도록 설정
- TagsToCaptureDefs 멤버변수에 Tag를 Key로, 캡쳐된 Attribute를 Value로 저장

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를 설정한다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| 몬스터 AI - 2) AIController 클래스와 Service 클래스 (0) | 2025.09.19 |
|---|---|
| 몬스터 AI - 1) AI의 구성과 동작방식 (0) | 2025.09.19 |
| 데미지 처리 심화 - 4) 처리된 데미지에 따라 다른 UI 출력 (0) | 2025.09.13 |
| 데미지 처리 심화 - 3) 사용자 정의 AbilitySystemGlobals 클래스 & 사용자 정의 GEContext 클래스의 사용 (0) | 2025.09.12 |
| 데미지 처리 심화 - 2) NetSerialize 함수 오버라이드 & 사용자 정의 GEContext에 대한 복사 연산 허용 (0) | 2025.09.12 |