TIL

[언리얼 GAS 이해하기] #3 Attribute와 float 변수의 차이

think95592 2026. 6. 24. 20:45

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가 이해하고 관리할 수 있는 능력치 데이터이다.