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 함수는 잘 사용하지 않음에 유의한다.