TIL

[언리얼 GAS 이해하기] #2 AttributeSet은 왜 따로 존재할까?

think95592 2026. 6. 23. 20:44

AttributeSet이란?

AttributeSet은 GAS에서 캐릭터의 능력치(Attribute)를 저장하는 클래스이다.

예를 들어 RPG 캐릭터라면

  • HP
  • MP
  • Stamina
  • MoveSpeed
  • AttackPower

같은 값들이 AttributeSet 안에 저장된다.

Player
 └─ ASC
      └─ AttributeSet
           ├─ HP
           ├─ Stamina
           ├─ MoveSpeed
           └─ AttackPower
 

그런데 왜 ASC 안에 바로 넣지 않을까?

처음 보면 이런 생각이 든다.

 
ASC
{
    float HP;
    float Stamina;
    float MoveSpeed;
}
 

이렇게 하면 되는데 왜 굳이 별도 클래스를 만들었을까?

답은

능력치 관리만 전문적으로 담당하기 위해서다.


비유해보자

ASC는 회사 대표다.

대표가

  • 인사관리
  • 회계관리
  • 영업관리
  • 개발관리

를 전부 직접 하면 너무 복잡해진다.

그래서 부서를 나눈다.

대표(ASC)

├─ 인사팀
├─ 회계팀
├─ 영업팀
└─ 개발팀
 

AttributeSet은

대표 아래 있는 능력치 관리 부서라고 생각하면 된다.

ASC

└─ AttributeSet
     ├─ HP
     ├─ Stamina
     └─ MoveSpeed
 

AttributeSet이 담당하는 일

1. 능력치 저장

가장 기본적인 역할이다.

 
UPROPERTY()
FGameplayAttributeData Health;

UPROPERTY()
FGameplayAttributeData Stamina;
 

현재 수치를 저장한다.


2. 능력치 변경 감지

GameplayEffect가 적용되면

AttributeSet은

"어떤 능력치가 변경되었는가?"

를 알 수 있다.

대표적인 함수

 
PostGameplayEffectExecute()
 

예시

플레이어가 데미지를 받음

Damage Effect
↓
Health 감소
↓
PostGameplayEffectExecute 호출
 

이곳에서

 
if (Health <= 0)
{
    Dead 처리
}
 

같은 로직을 수행할 수 있다.


3. 값 보정

능력치가 이상한 값이 되는 것을 방지한다.

예시

현재 HP = 50

회복량 = 1000
 

그대로 적용하면

HP = 1050
 

가 된다.

하지만 최대 체력이 100이라면

 
Health = FMath::Clamp(
    Health,
    0.f,
    MaxHealth
);
 

로 제한할 수 있다.


Attribute는 float가 아니다

GAS에서는 보통

 
float Health;
 

를 사용하지 않는다.

대신

 
FGameplayAttributeData Health;
 

를 사용한다.


왜?

GAS가

  • 변경 추적
  • 네트워크 동기화
  • GameplayEffect 적용

을 처리해야 하기 때문이다.

단순 float로는 GAS가 관리할 수 없다.


실제 구조

플레이어가 데미지를 받는 상황

Enemy Attack
↓
GameplayEffect
↓
ASC
↓
AttributeSet
↓
Health 감소
↓
PostGameplayEffectExecute()
↓
사망 여부 확인
 

중요한 점은

ASC가 직접 HP를 관리하는 것이 아니라

AttributeSet을 통해 관리한다는 것이다.


여러 AttributeSet도 가능하다

규모가 커지면

하나로 몰아넣지 않고 분리할 수도 있다.

예시

CombatAttributeSet
 ├─ HP
 ├─ AttackPower

MovementAttributeSet
 ├─ MoveSpeed
 ├─ JumpPower

ResourceAttributeSet
 ├─ Stamina
 ├─ Mana
 

ASC는 여러 AttributeSet을 가질 수 있다.


정리

AttributeSet

  • Attribute를 저장하는 클래스
  • ASC가 보유한다
  • GameplayEffect로 변경되는 능력치를 관리한다

주요 역할

  • 능력치 저장
  • 능력치 변경 감지
  • 값 보정(Clamp)
  • 사망 처리 등 후처리

구조

ASC
↓
AttributeSet
↓
Health
Stamina
MoveSpeed
 

핵심 한 문장

AttributeSet은 GAS에서 능력치를 전문적으로 관리하는 전용 클래스이며, ASC는 이를 통해 캐릭터의 상태를 관리한다.