DECLARE_ATTRIBUTE_CAPTUREDEF?
Unreal Engine에서 사용되는 매크로로, 속성 값을 캡처하고 사용할 때 유용하다.
주로 ' GameplayEffectExecutionCalculation' 클래스에서 사용되어, 특정 애트리뷰트(속성) 값을 캡처하고 이후 계산에서
이를 사용할 수 있도록 한다.
이 매크로는 Unreal Engine의 능력 시스템(Ability System)과 관련이 있다.
캡처
이는 특성 속성(attribute)의 현재 값을 획득하여 이후의 계산이나 논리에 사용하기 위해 저장하는 과정을 의미한다.
이는 특히 게임플레이 효과나 애미메이션 시스템에서 중요한데, 예를 들어 플레이어의 현재 체력, 마나 또는
다른 스탯 값을 기반으로 특정 효과를 적용할 때 필요하다.
DECLARE_ATTRIBUTE_CAPTUREDEF와 관련된 캡처 작업을 통해 어떤 속성값을 캡처 해야하는 지 정의하고,
그 값을 사용하여 게임 플레이 로직을 구현할 수 있다.
사용 방법
다음 예제는 Unreal Engine의 능력 시스템을 통해 특정 속성을 캡처하고
이를 기반으로 계산을 수행하는 기본적인 구조를 보여준다.
I. 헤더 파일에 정의 하기:
먼저, 속성을 캡처하기 위해 필요한 변수들을 클래스 헤더 파일에 선언한다.
// MyAttributeSetExecution.h
#include "CoreMinimal.h"
#include "GameplayEffectExecutionCalculation.h"
#include "MyAttributeSet.h"
#include "MyAttributeSetExecution.generated.h"
UCLASS()
class MYGAME_API UMyAttributeSetExecution : public UGameplayEffectExecutionCalculation
{
GENERATED_BODY()
public:
UMyAttributeSetExecution();
// Attribute capture definitions
DECLARE_ATTRIBUTE_CAPTUREDEF(MyAttribute1);
DECLARE_ATTRIBUTE_CAPTUREDEF(MyAttribute2);
virtual void Execute_Implementation(
const FGameplayEffectCustomExecutionParameters& ExecutionParams,
OUT FGameplayEffectCustomExecutionOutput& OutExecutionOutput
) const override;
};
II. 소스 파일에서 초기화하기:
DECLARE_ATTRIBUTE_CAPTUREDEF 매크로를 통해 캡처하려는 속성을 초기화한다.
이를 통해 엔진은 어느 속성을 캡처해야 하는지 알 수 있다.
// MyAttributeSetExecution.cpp
#include "MyAttributeSetExecution.h"
UMyAttributeSetExecution::UMyAttributeSetExecution()
{
// Define which attributes we want to capture
DEFINE_ATTRIBUTE_CAPTUREDEF(UMyAttributeSet, MyAttribute1, Source, true);
DEFINE_ATTRIBUTE_CAPTUREDEF(UMyAttributeSet, MyAttribute2, Target, false);
}
void UMyAttributeSetExecution::Execute_Implementation(
const FGameplayEffectCustomExecutionParameters& ExecutionParams,
OUT FGameplayEffectCustomExecutionOutput& OutExecutionOutput
) const
{
// Capture the attribute values
FAggregatorEvaluateParameters EvaluationParameters;
float MyAttribute1Value = 0.f;
float MyAttribute2Value = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(GetMyAttribute1CaptureDef(), EvaluationParameters, MyAttribute1Value);
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(GetMyAttribute2CaptureDef(), EvaluationParameters, MyAttribute2Value);
// Perform your custom calculation using captured values
float CalculatedValue = MyAttribute1Value + MyAttribute2Value;
// Set the resulting value to be applied to the target
OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(GetMyAttribute1CaptureDef().AttributeToCapture, EGameplayModOp::Additive, CalculatedValue));
}
III. 속성 캡처 정의 함수 사용:
캡처된 속성 값을 계산에 사용하려면 AttemptCalculateCapturedAttributeMagnitude 함수를 사용하여 속성 값을 가져온다.
이 함수는 FAggregatorEvaluateParameters를 통해 속성 값을 평가한다.
예제
플레이어가 적에게 공격을 가할 때, 공격력 속성과 적의 방어력 속성을 캡처하여 최종 피해량을 계산한다고 가정한다.
I. 속성 캡처 정의:
공격력과 방어력을 캡처하도록 정의한다.
II. 캡처된 속성 값 가져오기:
실제 계산 로직에서 캡처된 공격력과 방어력을 가져와 사용한다.
III. 최종 계산 수행:
캡처된 값을 기반으로 최종 피해량을 계산한다.
구현 예시:
I. 헤더 파일에 정의
// MyDamageExecution.h
#pragma once
#include "CoreMinimal.h"
#include "GameplayEffectExecutionCalculation.h"
#include "MyAttributeSet.h"
#include "MyDamageExecution.generated.h"
UCLASS()
class MYGAME_API UMyDamageExecution : public UGameplayEffectExecutionCalculation
{
GENERATED_BODY()
public:
UMyDamageExecution();
// Attribute capture definitions
DECLARE_ATTRIBUTE_CAPTUREDEF(AttackPower);
DECLARE_ATTRIBUTE_CAPTUREDEF(DefensePower);
virtual void Execute_Implementation(
const FGameplayEffectCustomExecutionParameters& ExecutionParams,
OUT FGameplayEffectCustomExecutionOutput& OutExecutionOutput
) const override;
};
II. 소스 파일에서 초기화
// MyDamageExecution.cpp
#include "MyDamageExecution.h"
#include "GameplayEffect.h"
#include "GameplayEffectTypes.h"
#include "AbilitySystemComponent.h"
UMyDamageExecution::UMyDamageExecution()
{
// Define which attributes we want to capture
DEFINE_ATTRIBUTE_CAPTUREDEF(UMyAttributeSet, AttackPower, Source, true);
DEFINE_ATTRIBUTE_CAPTUREDEF(UMyAttributeSet, DefensePower, Target, false);
}
void UMyDamageExecution::Execute_Implementation(
const FGameplayEffectCustomExecutionParameters& ExecutionParams,
OUT FGameplayEffectCustomExecutionOutput& OutExecutionOutput
) const
{
// Capture the attribute values
FAggregatorEvaluateParameters EvaluationParameters;
float AttackPowerValue = 0.f;
float DefensePowerValue = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(GetAttackPowerCaptureDef(), EvaluationParameters, AttackPowerValue);
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(GetDefensePowerCaptureDef(), EvaluationParameters, DefensePowerValue);
// Perform your custom calculation using captured values
float DamageValue = AttackPowerValue - DefensePowerValue;
if (DamageValue < 0.f)
{
DamageValue = 0.f; // Damage can't be negative
}
// Set the resulting value to be applied to the target
OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(GetAttackPowerCaptureDef().AttributeToCapture, EGameplayModOp::Additive, DamageValue));
}
정리
캡처 정의 :
DECLARE_ATTRIBUTE_CAPTUREDEF와 DEFINE_ATTRIBUTE_CAPTUREDEF를 사용하여 캡처할 속성을 정의한다.
값 캡처:
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude를 통해 캡처된 속성 값을 가져온다.
계산 및 적용:
캡처된 값을 기반으로 필요한 계산을 수행하고 결과를 적용한다.
이를 통해 게임 플레이 로직에 활용할 수 있다.
'Unreal Engine' 카테고리의 다른 글
[UE5] ActivateAbility (0) | 2024.05.18 |
---|---|
[UE5] TObjectPtr (0) | 2024.05.17 |
[UE5] AActor (0) | 2024.05.14 |
[UE5] 속성 기반 수정자 (0) | 2024.04.16 |
[UE5] GAS(GameplayAbilitySystem) I (0) | 2024.03.25 |