1. 핵심 개념
- GameFeature 플러그인
- AttributeSet
- GameplayEffect
2. 상세 내용
2.1. AttributeSet
AttrubuteSet은 다수의 FGameplayAttributeData를 묶어 관리하는 언리얼 오브젝트로 5.6버전 기준 cpp로만 생성이 가능하다.
하나의 스탯에 대해서 max값을 GameplayAbilityData로 추가 설정하는 것을 권장한다.
보유한 스탯의 BaseValue가 변하면 AttributeSet의 이벤트 함수가 호출된다.
FGameplayAttributeData
FGameplayAttributeData는 단일 float 값이 아니라 내부적으로 BaseValue(기본값)와 CurrentValue(현재값) 두 가지 상태를 유지하며, Gameplay Effect(GE)의 지속 시간(Duration Policy)에 따라 다르게 반응한다.
- Instant GE (즉발형): 데미지나 영구적인 스탯 상승처럼 즉시 적용되는 효과. BaseValue 자체를 영구적으로 변경한다.
- Duration / Infinite GE (지속/무한형): 10초간 공격력 증가 버프와 같은 효과. BaseValue는 원래 상태로 보존하고 CurrentValue만 일시적으로 변경한다. 버프가 종료되면 CurrentValue는 자동으로 BaseValue로 롤백된다.
매크로
AttributeSet을 만들 때는 UAttributeSet을 상속해서 만든다. 아래 테이블과 같이 매크로를 사용하여 게터, 세터, 초기화 함수를 설정할 수 있다.
| 매크로(파라미터) | 생성된 함수의 시그니처 | 행동/사용 |
|---|---|---|
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(UMyAttributeSet, Health) |
static FGameplayAttribute GetHealth() |
스태틱 함수이며, 엔진의 리플렉션 시스템으로부터 FGameplayAttribute 구조체를 반환합니다. |
GAMEPLAYATTRIBUTE_VALUE_GETTER(Health) |
float GetHealth() const |
게임플레이 어트리뷰트 'Health'의 현재 값을 반환합니다. |
GAMEPLAYATTRIBUTE_VALUE_SETTER(Health) |
void SetHealth(float NewVal) |
게임플레이 어트리뷰트 'Health'의 값을 NewVal 로 설정합니다. |
GAMEPLAYATTRIBUTE_VALUE_INITTER(Health) |
void InitHealth(float NewVal) |
게임플레이 어트리뷰트 'Health'의 값을 NewVal 로 초기화합니다. |
UCLASS()
class MYPROJECT_API UMyAttributeSet : public UAttributeSet
{
GENERATED_BODY()
protected:
/** 샘플 어트리뷰트 'Health'*/
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FGameplayAttributeData Health;
//~ ... 여기에 다른 게임플레이 어트리뷰트...
public:
//~ 어트리뷰트 'Health'의 헬퍼 함수
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(UMyAttributeSet, Health);
GAMEPLAYATTRIBUTE_VALUE_GETTER(Health);
GAMEPLAYATTRIBUTE_VALUE_SETTER(Health);
GAMEPLAYATTRIBUTE_VALUE_INITTER(Health);
//~ ... 여기에 다른 게임플레이 어트리뷰트의 헬퍼 함수...
};
이때 Attribute의 초기화는 'AttributeMetaData'라는 게임플레이 어빌리티 시스템 행 타입을 사용하는 데이터 테이블로 초기화할 수 있다.
Meta Attribute (메타 어트리뷰트)
메타 어트리뷰트는 체력(Health)이나 마나(Mana)처럼 지속적으로 유지되는 스탯이 아니라, 데미지나 치유량 등 중간 연산을 위해 일회성으로 사용되는 임시 스탯(상태)을 의미한다.
- 설계 목적: 공격(GE)이 타겟의 체력을 직접 깎아버리면 무적 상태나 방어력 계산 등을 중간에 개입시키기 어렵다. 따라서 GE는 타겟의 체력이 아닌 'Damage'라는 임시 스탯을 증가시키고, AttributeSet에서 이를 확인하여 최종 체력을 깎는 완충 지대 역할을 한다.
- 특징: 서버와 클라이언트 간에 동기화(Replication)할 필요가 없으며, 연산이 끝나면 즉시 0으로 초기화해야 한다.
UI와 연동
AttributeSet에는 PreAttributeChange와 PostAttributeChange가 존재한다. clmap와 같은 스탯의 사전 설정은 pre에서, BaseValue가 변경된 후의 값 처리는 Post에서 처리한다.(OldValue, NewValue 모두 알려줌)

ASC는 InitializeComponent 함수에서 액터에 설정된 모든 AttributeSet 객체를 자동으로 찾아서 등록한다. 이 작업이 끝나면 PostInitializeComponents 함수가 실행되는데, 이 때 확정된 AttributeSet 정보를 UI와 연동하는 것을 권장한다.(위 시퀀스 참고)
2.2. GameplayEffect
GameplayEffect는 블루프린트 에디터에서 설정하는 것을 권장한다.

하나의 게임플레이 이펙트는 독립적으로 동작하기 위해 다양한 정보를 받아 실행된다.
- GameplayEffectSpec: 다양한 정보를 담은 데이터이다.
- GameplayEffect Class: 이펙트를 발동한 GA와 이를 수행한 ASC 관련 액터 정보(ActorInfo)
- GameplayEffect Context: 발동할 게임플레이 이펙트 클래스 정보
- GameplayEffect Context: 게임플레이 이펙트가 발동했던 상황정보
- Level & Stack Count: 레벨 및 스택 카운트
GameplayEffectSpec을 기반으로 자신에게 발동 혹은 다른 액터에게 발동 가능(레벨업으로 자신의 능력치 상승, 공격으로 상대방의 Health Attribute 차감 등)
2.3. AttributeSet과 GameplayEffect 연동

Attribute Set에서는 Gameplay Effect 적용에 관련된 가상 함수(virtual function)를 제공한다.
각각 BaseValue 변경에 대해서만 반응
- PreGameplayEffectExecute: Attribute가 변경되기 전, 현재 진행 중인 Gameplay Effect를 진행할 것인확인하는 함수
- PostGameplayEffectExecute: Gameplay Effect가 확정되기 직전에 BaseValue를 수정할 수 있는 최종함수
3. 질문 및 해결 (Q&A)
- 내일 Gameplay Cue 파트 추가로 본 다음 전체적인 흐름도 다이어그램으로 정리하자
4. 관련 문서 (Links)
'내일배움캠프 > TIL' 카테고리의 다른 글
| TIL260611 - Unreal - GAS4 (0) | 2026.06.11 |
|---|---|
| TIL260610 - Unreal - GAS3 (0) | 2026.06.10 |
| TIL260608 - Unreal (0) | 2026.06.08 |
| TIL260605 - Unreal - GAS1 (1) | 2026.06.05 |
| TIL260604 - Unreal (0) | 2026.06.04 |