Unreal Engine

UE(GAS) - DECLARE_ATTRIBUTE_CAPTUREDEF(), DEFINE_ATTRIBUTE_CAPTUREDEF()

띠애모 2024. 8. 20. 16:00

 DECLARE_ATTRIBUTE_CAPTUREDEF()

 

DECLARE_ATTRIBUTE_CAPTUREDEF는 Unreal Engine의 **Gameplay Ability System (GAS)**에서 사용되는 매크로로, GameplayEffectExecutionCalculation 클래스에서 특정 Gameplay Attribute를 캡처하는 데 사용됩니다. 이 매크로는 효과를 계산할 때 필요한 속성(Attribute) 값을 효율적으로 가져올 수 있게 도와줍니다.

주요 개념

  1. Gameplay Attribute:
    • Gameplay Attribute는 캐릭터의 건강, 마나, 힘 등의 스탯을 나타냅니다. GAS 시스템에서 속성들은 FGameplayAttribute 클래스로 정의됩니다.
  2. Capture:
    • Capture는 특정 Gameplay Attribute의 현재 값을 계산 시점에 가져오는 과정입니다. 이를 통해, GameplayEffectExecutionCalculation에서 속성을 기반으로 한 복잡한 계산을 수행할 수 있습니다.
  3. Execution Calculation:
    • GameplayEffectExecutionCalculation은 복잡한 로직을 통해 Gameplay Effect를 처리하는 클래스입니다. 이 클래스에서 속성 값을 가져오기 위해 DECLARE_ATTRIBUTE_CAPTUREDEF 매크로를 사용합니다.

DECLARE_ATTRIBUTE_CAPTUREDEF 매크로

DECLARE_ATTRIBUTE_CAPTUREDEF 매크로는 특정 속성을 캡처하는 데 필요한 정의를 선언합니다. 이 매크로는 주로 클래스의 헤더 파일에서 선언됩니다.

매크로 사용 예시

1
DECLARE_ATTRIBUTE_CAPTUREDEF(Health);
cs

 

이 매크로는 Health라는 이름의 속성을 캡처하기 위해 필요한 정의를 생성합니다. 이 선언은 캡처된 값을 나중에 GameplayEffectExecutionCalculation에서 접근할 수 있도록 합니다.

 

 

매크로의 내부 작동 방식

매크로를 선언하면, CaptureDefinition이라는 이름으로 FGameplayEffectAttributeCaptureDefinition 구조체가 생성됩니다. 이 구조체는 속성의 정보를 캡처하기 위해 필요한 모든 데이터를 포함합니다.

 

1
2
#define DECLARE_ATTRIBUTE_CAPTUREDEF(Attribute) \
    FGameplayEffectAttributeCaptureDefinition Attribute##Def;
cs

 

 

사용 방법

  1. 속성 캡처 선언:
    • DECLARE_ATTRIBUTE_CAPTUREDEF 매크로는 UGameplayEffectExecutionCalculation 클래스의 헤더 파일에서 선언됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
UCLASS()
class UMyGameplayEffectExecutionCalculation : public UGameplayEffectExecutionCalculation
{
    GENERATED_BODY()
 
public:
    UMyGameplayEffectExecutionCalculation();
 
protected:
    // 속성 캡처 선언
    DECLARE_ATTRIBUTE_CAPTUREDEF(Health);
    DECLARE_ATTRIBUTE_CAPTUREDEF(Strength);
};
cs

 

 

 

캡처 설정:

  • UGameplayEffectExecutionCalculation 클래스의 생성자에서 캡처할 속성을 설정합니다.
1
2
3
4
5
6
UMyGameplayEffectExecutionCalculation::UMyGameplayEffectExecutionCalculation()
{
    // 속성 캡처 초기화
    RelevantAttributesToCapture.Add(HealthDef);
    RelevantAttributesToCapture.Add(StrengthDef);
}
cs

 

 

 

속성 값을 가져오기:

  • Execute_Implementation 함수에서 캡처된 속성 값을 사용하여 계산을 수행합니다
1
2
3
4
5
6
7
8
9
10
void UMyGameplayEffectExecutionCalculation::Execute_Implementation(
    const FGameplayEffectCustomExecutionParameters& ExecutionParams,
    OUT FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
    // 속성 값 가져오기
    float HealthValue = 0.0f;
    ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(HealthDef, FAggregatorEvaluateParameters(), HealthValue);
    
    // 계산 로직
}
cs

 

 

 

 

DEFINE_ATTRIBUTE_CAPTUREDEF()

DEFINE_ATTRIBUTE_CAPTUREDEF는 DECLARE_ATTRIBUTE_CAPTUREDEF와 함께 사용되는 매크로로, **Gameplay Ability System (GAS)**에서 Gameplay Attribute를 캡처할 때 필요한 정의를 초기화하는 역할을 합니다. 이 매크로는 주어진 속성에 대한 캡처 정의를 생성하고, 이를 통해 이후에 해당 속성을 쉽게 사용할 수 있게 합니다.

1
2
3
4
5
#define DEFINE_ATTRIBUTE_CAPTUREDEF(S, P, T, B) \
{ \
    P##Property = FindFieldChecked<FProperty>(S::StaticClass(), GET_MEMBER_NAME_CHECKED(S, P)); \
    P##Def = FGameplayEffectAttributeCaptureDefinition(P##Property, EGameplayEffectAttributeCaptureSource::T, B); \
}
cs

 

매크로의 구성 요소

  1. 매크로 인자:
    • S: 속성을 가진 클래스입니다.
    • P: 캡처할 속성(Property)입니다.
    • T: 속성 값을 캡처할 때의 소스입니다. 이는 EGameplayEffectAttributeCaptureSource 열거형의 값으로, Source 또는 Target이 될 수 있습니다.
    • B: bool 값으로, 이 값이 true이면 이 속성은 캡처된 후에도 지속적으로 업데이트됩니다.
  2. P##Property:
    • 매크로 내부에서 P##Property는 속성의 FProperty 포인터를 저장합니다. ##는 C++의 토큰 결합 연산자로, P와 Property를 결합하여 새로운 식별자를 생성합니다.
  3. FindFieldChecked<FProperty>(S::StaticClass(), GET_MEMBER_NAME_CHECKED(S, P)):
    • FindFieldChecked<FProperty>는 클래스 S에서 속성 P의 FProperty 객체를 찾습니다. 이 함수는 주어진 속성이 존재하지 않을 경우 오류를 발생시킵니다.
    • GET_MEMBER_NAME_CHECKED(S, P)는 클래스 S의 멤버 P의 이름을 컴파일 타임에 안전하게 가져옵니다.
  4. P##Def:
    • P##Def는 FGameplayEffectAttributeCaptureDefinition 객체를 생성합니다. 이 객체는 속성의 캡처 방법을 정의하며, 이 매크로를 통해 정의된 속성을 후속 계산에서 사용할 수 있게 합니다.
  5. FGameplayEffectAttributeCaptureDefinition 생성자:
    • 이 생성자는 속성(FProperty), 캡처 소스(EGameplayEffectAttributeCaptureSource), 그리고 지속적 업데이트 여부(bool B)를 인자로 받아 캡처 정의를 초기화합니다.

 

요약

DECLARE_ATTRIBUTE_CAPTUREDEF 매크로는 Gameplay Ability System에서 Gameplay Attribute를 캡처하기 위한 선언을 간편하게 만드는 도구입니다. 이 매크로를 통해 속성을 쉽게 정의하고, GameplayEffectExecutionCalculation에서 속성 값을 가져와 복잡한 계산을 수행할 수 있습니다. 이 과정은 GAS에서 속성 기반 로직을 구현하는 데 필수적인 역할을 합니다.

 

DEFINE_ATTRIBUTE_CAPTUREDEF 매크로는 Gameplay Effect Execution Calculation에서 사용할 속성의 캡처 정의를 초기화하는 데 사용됩니다. 이 매크로는 주어진 속성의 정보를 안전하게 가져오고, 이를 기반으로 FGameplayEffectAttributeCaptureDefinition 객체를 생성합니다. 이 매크로는 캡처할 속성을 효율적으로 설정하고, 이후 계산에서 해당 속성을 사용할 수 있도록 합니다.