Attribute는 그냥 float 아닌가?
GAS를 처음 공부하면 이런 생각이 든다.
float Health = 100.f;
float Stamina = 50.f;
체력과 스태미나를 저장하는데 문제가 없어 보인다.
그런데 GAS에서는 보통 이렇게 사용하지 않는다.
FGameplayAttributeData Health;
FGameplayAttributeData Stamina;
왜 굳이 더 복잡한 구조를 사용할까?
먼저 float의 특징
float는 단순히 숫자 하나를 저장하는 변수다.
float Health = 100.f;
Health -= 20.f;
실행 결과
Health = 80
끝이다.
float는
- 누가 값을 바꿨는지
- 왜 바뀌었는지
- 버프 때문인지
- 디버프 때문인지
전혀 알 수 없다.
그냥 숫자만 저장한다.
GAS는 숫자 이상의 정보가 필요하다
GAS에서는 단순히 체력 값만 저장하는 것이 아니다.
예를 들어
플레이어 체력 = 100
버프 적용
체력 +50
독 디버프 적용
체력 -20
이런 상황이 계속 발생한다.
GAS는
- 현재 값
- 원래 값
- 버프 적용 여부
- 디버프 적용 여부
- 네트워크 동기화
까지 관리해야 한다.
그래서 float만으로는 부족하다.
Attribute는 무엇인가?
Attribute는 GAS가 관리할 수 있는 능력치다.
실제로는
FGameplayAttributeData
타입으로 저장된다.
예시
UPROPERTY(BlueprintReadOnly)
FGameplayAttributeData Health;
UPROPERTY(BlueprintReadOnly)
FGameplayAttributeData Stamina;
Attribute의 핵심 : BaseValue와 CurrentValue
Attribute는 내부적으로 두 가지 값을 가진다.
BaseValue
원래 능력치
체력 = 100
CurrentValue
현재 적용된 능력치
체력 = 120
예시
기본 체력
BaseValue = 100
CurrentValue = 100
버프 적용
+20 HP
결과
BaseValue = 100
CurrentValue = 120
버프 제거
BaseValue = 100
CurrentValue = 100
원래 값은 유지된다.
float였다면?
Health += 20;
만 수행된다.
그러면
현재 체력이 원래 얼마였는지
알 수 없다.
버프를 제거하려면 별도로 계산해야 한다.
GameplayEffect가 동작할 수 있는 이유
GameplayEffect는 Attribute를 대상으로 동작한다.
예시
Speed Buff
↓
MoveSpeed +200
↓
Attribute 변경
↓
CurrentValue 증가
GAS는 어떤 Attribute가 변경되었는지 추적할 수 있다.
네트워크 동기화
멀티플레이 게임에서는
서버 체력 = 80
클라이언트 체력 = 80
상태를 유지해야 한다.
float는 직접 복제 설정을 해야 하지만
Attribute는 GAS 시스템이 네트워크 동기화를 지원한다.
그래서 RPG나 액션 게임에서 사용하기 편하다.
실제 프로젝트에서 보면
현재 우리가 사용하는 방식
float HP;
float Stamina;
float MoveSpeed;
GAS 방식
FGameplayAttributeData Health;
FGameplayAttributeData Stamina;
FGameplayAttributeData MoveSpeed;
차이는 단순히 자료형이 바뀐 것이 아니다.
관리 방식 자체가 달라진 것이다.
정리
float
- 숫자만 저장
- 변경 이력 모름
- 버프/디버프 관리 어려움
- 네트워크 처리 직접 구현
Attribute(FGameplayAttributeData)
- GAS 전용 능력치
- BaseValue와 CurrentValue 보유
- GameplayEffect 적용 가능
- 변경 추적 가능
- 네트워크 동기화 지원
구조
GameplayEffect
↓
Attribute
↓
CurrentValue 변경
↓
ASC가 관리
핵심 한 문장
float가 단순한 숫자 저장소라면, Attribute는 GAS가 이해하고 관리할 수 있는 능력치 데이터이다.
'TIL' 카테고리의 다른 글
| [언리얼 GAS 이해하기] #5 GameplayTag는 왜 필요할까? (0) | 2026.06.26 |
|---|---|
| [언리얼 GAS 이해하기] #4 GameplayEffect는 어떻게 능력치를 바꿀까? (0) | 2026.06.25 |
| [언리얼 GAS 이해하기] #2 AttributeSet은 왜 따로 존재할까? (0) | 2026.06.23 |
| [언리얼 GAS 이해하기] #1 ASC(Ability System Component)란? (0) | 2026.06.22 |
| [C++] - 가장 가까운 같은 글자 (2) | 2026.06.18 |