- 개요
데미지를 주기 위해 IncomingDamage 어트리뷰트를 더하는 방식으로 적용하는 GameplayEffect에
GameplayEffectExecutionCalculation 클래스를 사용하여 Executions를 사용하도록 수정한다
Executions를 통해 특정 Attribute의 값을 직접 계산하고 변경하는 것이 가능하다
이때 특정 어트리뷰트의 값을 가져와 저장하는 것을 capture라고 표현하고
capture된 값, tag 그리고 다른 런타임 context를 포함하는 GEExecutionParameter를 snapshot이라 부른다
- GameplayEffectExecutionCalculation 클래스란?
1) 동작방식
동작방식은 다음과 같이 크게 3가지로 구분할 수 있다
- 캡쳐하여 수정할 어트리뷰트를 DECLARE_ATTRIBUTE_CAPTUREDEF 매크로를 통해 정의
- DEFINE_ATTRIBUTE_CAPTUREDEF 매크로를 통해 수정할 어트리뷰트를 캡쳐
- 하나 이상의 어트리뷰트를 캡쳐하여 수정 가능
- 수정하는 로직을 프로그래머가 정의할 수 있음
2) 캡쳐 방식
캡쳐는 다음과 같이 이뤄진다
- GE의 런타임 인스턴스인 GESpec이 생성될 때, 어트리뷰트의 값을 캡쳐할 수 있다
- GE가 적용되고 있는 상태라면, 어트리뷰트의 값을 캡쳐할 수 없다
- Target의 경우, GE가 적용되고 있는 상태에서만 어트리뷰트의 값을 캡쳐할 수 있다
3) 주의사항
주의사항은 다음과 같다
- Prediction이 이뤄지지 않는다
- Instant나 Periodic으로 설정된 GE에서만 사용가능하다
- 캡쳐는 PreAttrbiuteChange 함수를 호출하지 않으므로 클램핑을 다시 수행해야 한다
- Local Predicted / Server Initalied / Server Only로 설정한 GA라면 서버에서만 ExecCalc가 수행된다
1) ExecCalc_Damage 클래스의 헤더 파일

Execute 함수를 오버라이드하여 GameplayEffectExecutionCalculation 클래스의 동작방식을 정의할 수 있다
2) ExecCalc_Damage 클래스의 cpp 파일

언리얼 엔진에서 권장하는 방식대로 캡쳐할 어트리뷰트를 래퍼 클래스로 감싸서 사용한다
AuraDamageStatics 구조체에서 캡쳐할 어트리뷰트를 명시하고,
해당 구조체의 생성자에서 명시한 어트리뷰트로부터 값을 캡쳐한다
DamageStatics 함수를 사용하여 AuraDamageStatics의 static 인스턴스를 사용할 수 있다

ExecCalc_Damage 클래스의 생성자에서
RelevantAttributesToCapture 리스트에 캡쳐한 어트리뷰트를 추가한다
해당 리스트는 수정 사항과 관련된 어트리뷰트의 Definition을 저장한다

Execute 함수의 로직은 위와 같다
우선, GE의 TargetAvatar와 SourceAvatar를 가져온다
GE에 설정된 SourceTag와 TargetTag를 가져와서 AggregatorEvaluateParameters의 인스턴스에 설정한다
해당 구조체는 연산에 필요한 정보를 담는 용도로 사용한다
현재 ExecCalc_Damage 클래스를 사용하여 수정할 어트리뷰트는 Armor이다
따라서 GE를 적용할 때마다 Armor의 값이 점점 증가한다
3) 언리얼 에디터

GE_Damage 블루프린트에 위와 같이 설정한다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| 데미지 처리 심화 - 1) GameplayEffectContext의 사용과 사용자 정의 GEContext (0) | 2025.09.12 |
|---|---|
| 데미지 처리 - 최종) 능력치를 고려한 데미지 처리 (0) | 2025.08.30 |
| 데미지 처리 - 3) 입은 데미지의 시각화 + 죽음 처리 (0) | 2025.08.28 |
| 데미지 처리 - 2) 피격 어빌리티를 통한 피격 애니메이션 재생 (0) | 2025.08.23 |
| 데미지 처리 - 1) SetByCaller 방식을 사용한 Tag에 따른 데미지 값 설정 (0) | 2025.08.22 |