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는 이를 통해 캐릭터의 상태를 관리한다.
'TIL' 카테고리의 다른 글
| [언리얼 GAS 이해하기] #4 GameplayEffect는 어떻게 능력치를 바꿀까? (0) | 2026.06.25 |
|---|---|
| [언리얼 GAS 이해하기] #3 Attribute와 float 변수의 차이 (0) | 2026.06.24 |
| [언리얼 GAS 이해하기] #1 ASC(Ability System Component)란? (0) | 2026.06.22 |
| [C++] - 가장 가까운 같은 글자 (2) | 2026.06.18 |
| 언리얼 EQS(Environment Query System)를 공부하며 이해한 것 (0) | 2026.06.15 |