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

데미지 처리 - 4) ExecutionCalculation 클래스 적용

monstro 2025. 8. 28. 20:46
728x90
반응형

- 개요

데미지를 주기 위해 IncomingDamage 어트리뷰트더하는 방식으로 적용하는 GameplayEffect

GameplayEffectExecutionCalculation 클래스를 사용하여 Executions를 사용하도록 수정한다

Executions를 통해 특정 Attribute의 값을 직접 계산하고 변경하는 것이 가능하다

 

이때 특정 어트리뷰트의 값을 가져와 저장하는 것capture라고 표현하고

capture된 값, tag 그리고 다른 런타임 context를 포함하는 GEExecutionParametersnapshot이라 부른다

- GameplayEffectExecutionCalculation 클래스란?

1) 동작방식

동작방식은 다음과 같이 크게 3가지로 구분할 수 있다

  • 캡쳐하여 수정할 어트리뷰트DECLARE_ATTRIBUTE_CAPTUREDEF 매크로를 통해 정의
  • DEFINE_ATTRIBUTE_CAPTUREDEF 매크로를 통해 수정할 어트리뷰트를 캡쳐
  • 하나 이상의 어트리뷰트캡쳐하여 수정 가능
  • 수정하는 로직프로그래머가 정의할 수 있음

2) 캡쳐 방식

캡쳐는 다음과 같이 이뤄진다

  • GE의 런타임 인스턴스인 GESpec이 생성될 때, 어트리뷰트의 값을 캡쳐할 수 있다
  • GE가 적용되고 있는 상태라면, 어트리뷰트의 값을 캡쳐할 수 없다
  • Target의 경우, GE가 적용되고 있는 상태에서만 어트리뷰트의 값을 캡쳐할 수 있다

3) 주의사항

주의사항은 다음과 같다

  • Prediction이 이뤄지지 않는다
  • InstantPeriodic으로 설정된 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의 TargetAvatarSourceAvatar를 가져온다

GE에 설정된 SourceTagTargetTag를 가져와AggregatorEvaluateParameters의 인스턴스에 설정한다

해당 구조체는 연산에 필요한 정보담는 용도로 사용한다

 

현재 ExecCalc_Damage 클래스를 사용하여 수정할 어트리뷰트는 Armor이다

따라서 GE를 적용할 때마다 Armor의 값이 점점 증가한다

 

3) 언리얼 에디터

 

GE_Damage 블루프린트에 위와 같이 설정한다

 

- 최종 실행 결과

 

728x90
반응형