2-8. 속성 접근자(Attribute Accessors)
0. 개요
아직 게임플레이 이펙트(Gameplay Effects)에 대해 배우지 않았으므로 해당 기능 없이 속성에 직접 접근하는 방법이 필요하다.
Get 함수 또는 Set 함수를 만들지 않고 접근하는 방법을 사용한다.
1. 사용
(1) AuraAttributeSet.h
// 서버에서 변수 변경 -> 클라이언트에서 OnRep_Notify 발동
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Vital Attributes")
FGameplayAttributeData Health;
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(UAuraAttributeSet, Health);
GAMEPLAYATTRIBUTE_PROPERTY_GETTER 매크로를 이용하여 GetHealth 함수, SetHealth 함수, InitHealth 함수를 생성한다.
(2) 속성 접근자 매크로
AuraAttributeSet.h의 상단에 매크로를 추가한다.
#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "AuraAttributeSet.generated.h"
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
이제 이 매크로를 사용해 속성 값의 getter, setter, initter를 사용할 수 있다.
Initter는 Setter와 작동 방식이 약간 다르다. Initter는 속성의 값을 기본 값( Base Value)로 즉시 변화시킨다.
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Vital Attributes")
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Health);
이제 Health 속성에 해당 매크로를 추가하면, 생성자에서 다음과 같이 변수를 초기화하여 사용할 수 있다.
UAuraAttributeSet::UAuraAttributeSet()
{
InitHealth(100.f);
}
이는 매크로가 InitHealth 함수를 자동으로 생성했기 때문이다.
(3) 디버그
이제 VS Code에서 DebugGame 모드로 컴파일하여 디버그를 실행한다.
- 소유자 액터(Owner Actor)가 PlayerState라는 것과 아바타 액터(Avatar Actor)가 AuraCharacter임을 알 수 있다.
- 캐릭터가 보유한 게임플레이 태그(Gameplay Tags)를 확인할 수 있다.
- 좌측 하단에 체력, 최대 체력, 마나, 최대 마나의 값이 나타나는 것이 보인다. 생성자에서 초기화한 속성 값이 정상적으로 적용된 것을 볼 수 있다.
- 페이지 업 다운으로 대상을 변경할 수 있다.
일반적으로 게임플레이 이펙트(Gameplay Effects)를 사용하고, 위의 Get, Set, Init 함수는 잘 사용하지 않음에 유의한다.