공부 잡동사니/Unreal Engine

[UE5] GAS - AttributeSet

gamzachips 2025. 4. 17.

AttributeSet

캐릭터나 객체의 속성을 관리하는 데 사용되는 클래스.

특징

체력, 마나, 방어력 등 캐릭터 상태나 공격력, 이동속도 등 게임 플레이의 주요 요소를 추적하는데 쓰인다.

능력치가 변경될 때마다 UI, AI등의 다른 시스템에 실시간으로 알림을 보낸다.

Gameplay Ability System과 연동되어 능력치의 변경을 처리하고 특정 능력이 발동할 때의 영향을 처리한다.

액터는 Gameplay Attribute를 Attribute Set에 저장하고 ASC에 등록하여, GAS의 다른 시스템과 상호작용될 수 있게 한다.

Gameplay Attribute에는 현재(current) 값베이스(base) 값이 저장된다.

현재 값은 현재 활성화된 Gameplay Effect를 사용하고 이에 영향받는 계산과 로직에 사용된다.

레벨업 시스템 등으로 베이스 값이 증가할 수도 있다.

 

 

PSC에 연결하기

UAttributeSet 클래스를 상속받아 정의한다.

UCLASS()
class PG_API UPlayerAttributeSet : public UAttributeSet
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FGameplayAttributeData Health;
};

Attribute Set을 선언한다. 이때 const 키워드를 사용하여 코드가 직접 수정하지 못하게 한다.

	UPROPERTY()
	const UPlayerAttributeSet* AttributeSet;

AttributeSet을 생성하는 방법에는 여러가지가 있다.

AttributeSet = CreateDefaultSubobject<UPlayerAttributeSet>(TEXT("AttrSet"));

이렇게 생성자에서 생성하면 InitAbilityActorInfo() 호출될 때 PSC에 연결된다.

혹은 직접 생성하지 않아도 InitAbilityActorInfo() 이후에 자동으로 Attribute Set 인스턴스가 생성되므로,

AttributeSet = AbilitySystemComponent->GetSet<UPlayerAttributeSet>();

BeginPlay 함수에서 이와 같이 포인터를 얻어와 사용할 수 있다.

 

 

매크로

Attribute Data 에 대한 Property Getter, Getter, Setter, Initter 매크로가 제공된다.

GAMEPLAYATTRIBUTE_PROPERTY_GETTER(UPlayerAttributeSet, Health);
GAMEPLAYATTRIBUTE_VALUE_GETTER(Health);
GAMEPLAYATTRIBUTE_VALUE_SETTER(Health);
GAMEPLAYATTRIBUTE_VALUE_INITTER(Health);

매크로를 추가하면 , 각각 아래와 같은 시그니처의 함수가 생성된다.

static FGameplayAttribute GetHealth();
float GetHealth() const;
void SetHealth(float NewVal);
void InitHeal(float NewVal);

이때 static FGameplayAttribute GetHealth(); 는 실제 Health 값이 아닌, Health라는 Attribute에 대한 정보를 담은 FGameplayAttribute 객체를 리턴함에 유의해야 한다.

이런 식으로 작성하면 Health의 주소,타입 등의 정보를 담고 있는 객체가 생성되며,

나중에 ASC에서 해당 Attribute을 찾거나 GameplayEffect로 수정할 때 사용할 수 있다.

FGameplayAttribute Attr = UMyAttributeSet::GetHealth();

댓글