멀티플레이어 동기화 문제, 스킬 상태 관리, 버프와 디버프의 중첩 처리까지.
스킬 시스템을 직접 구현하다 보면 코드는 빠르게 비대해지고, 어느 순간 수정이 두려운 덩어리가 된다.
실제 게임 프로젝트를 진행하고 있는 지금 마주하고 있는 문제라서 GAS를 공부해보기로 했다.
지금 당장 프로젝트의 관련 로직을 전부 GAS를 도입하여 바꿔야 할지도 모르겠다...
이 지점에서 언리얼 엔진이 제시하는 공식 해답이 게임플레이 어빌리티 시스템(Gameplay Ability System, GAS)이다.
GAS는 에픽게임즈가 포트나이트와 파라곤 같은 대규모 멀티플레이어 게임을 위해 직접 설계한 프레임워크다.
태생부터 실전용이다. 대신 처음 접하면 구조가 낯설고, 진입 장벽이 높게 느껴진다.
이 글의 목적은 GAS의 모든 API를 설명하는 데 있지 않다.
가장 먼저 이해해야 할 5가지 핵심 원리를 중심으로,
“이 시스템을 왜 이렇게 만들었는가”를 감각적으로 이해하도록 돕는다.

1. 능력은 ‘가방’에 담아 관리한다
Ability System Component (ASC)
어빌리티 시스템 컴포넌트(Ability System Component, ASC)는 GAS의 출발점이자 중심이다.
가장 직관적인 비유는 능력을 담는 가방이다.
캐릭터가 사용할 수 있는 모든 것,
액티브 스킬, 패시브 스킬, 현재 적용 중인 이펙트, 태그 상태까지
모두 이 ASC라는 가방 안에서 관리한다.
이 구조의 핵심은 분리다.
(가장 자주 놓치는 지점이 바로 이 분리 개념이다)
스킬 로직이 캐릭터 클래스에 직접 붙지 않는다.
능력은 모듈처럼 넣었다 뺐다 할 수 있는 존재가 된다.
이 구조가 주는 장점은 분명하다.
캐릭터 클래스는 가벼워지고, 스킬은 재사용 가능해진다.
핵심 포인트
멀티플레이 환경에서 ASC는 어디에 둔다?
이 선택 하나로 성격이 갈린다.
- Character에 추가한다
- 구현이 단순하다.
- 캐릭터가 죽으면 ASC도 함께 사라진다.
- AI나 일회성 NPC에 적합하다.
- PlayerState에 추가한다
- 캐릭터가 죽어도 스킬, 쿨다운, 레벨 정보가 유지된다.
- PvP, RPG, 성장 요소가 있는 게임에서는 사실상 필수다.
- PlayerState는 플레이어 세션 동안 유지되기 때문이다.

2. 스탯은 단순한 변수가 아니다
Gameplay Attribute & AttributeSet
체력, 마나, 공격력 같은 수치는 게임플레이 어트리뷰트(Gameplay Attribute)로 정의한다.
이 어트리뷰트들을 묶어 관리하는 클래스가 어트리뷰트 셋(AttributeSet)이다.
비유하자면 AttributeSet은 캐릭터의 스탯 시트다.
“그냥 float Health; 쓰면 안 되나요?”
가능하다. 하지만 의미는 완전히 다르다. 단순한 float는 숫자다.
반면 Gameplay Attribute는 시스템이 이해하는 값이다.
- 어떤 이펙트로 변경되는지
- 변경 시 어떤 이벤트가 발생하는지
- 네트워크에서 어떻게 동기화되는지
이 모든 규칙을 GAS가 알고 있다.

3. 모든 변화의 시작점
Gameplay Effect (GE)
게임플레이 이펙트(Gameplay Effect, GE)는
어트리뷰트를 변경하는 유일하고 표준화된 방법이다.
가장 쉬운 비유는 스탯을 바꾸는 주문서다.
GE는 단순한 데미지 계산 도구가 아니다.
스탯과 관련된 거의 모든 변화는 GE로 처리한다.
- 스킬 비용: 마나 30 소모
- 버프: 3초간 이동 속도 20% 증가
- 디버프: 매초 독 데미지 적용

파이어볼 스킬 시나리오로 본 흐름

스킬이 발동되면 단 하나의 GE가 다음을 처리한다.
- 시전자 마나 감소
- 피격자 체력 감소
- 피격자에게 State.Burning 태그 부여
이 모든 것이 하나의 이펙트 적용으로 끝난다.
이 구조가 유지 보수와 확장성에서 압도적으로 안정적이다.
가장 많이 실수하는 부분은 “급해서 GE 없이 직접 수치를 깎는 경우”다.
그 순간 GAS의 장점을 스스로 포기하게 된다.
4. 상태는 ‘스티커’로 관리한다
Gameplay Tag
게임플레이 태그(Gameplay Tag)는 캐릭터와 어빌리티의 상태를 표현하는 라벨 시스템이다.
비유하면 상태 스티커다.
State.Stunned
Effect.Debuff.Poison
Ability.Skill.Fireball
계층 구조를 가지기 때문에 관리가 쉽다.
enum과 bool을 남발하던 시절로 돌아갈 이유가 없다.
태그의 진짜 가치는 조건 처리에 있다.
State.Stunned 태그가 붙어 있으면
Ability.Attack 태그를 가진 스킬을 차단한다.
이 한 줄 규칙으로 복잡한 상태 머신을 대체한다.

5. 멀티플레이어는 기본 옵션이다
내장된 Replication
GAS는 처음부터 멀티플레이를 전제로 설계된다.
동기화(Replication)가 시스템 내부에 녹아 있다.
개발자가 매번 RPC를 고민하지 않아도 된다.
필수 설정은 명확하다.
- ASC 생성 시 SetIsReplicated(true) 호출
- Replication Mode 설정
대부분 Mixed 모드를 사용한다.
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);
소유자에게는 모든 정보 전달, 타 클라이언트에게는 최소 정보만 전달한다.
성능과 정확도의 균형이 가장 좋다.

Conclusion
- ASC는 가방이다
- AttributeSet은 스탯 시트다
- GE는 주문서다
- Tag는 스티커다
- 동기화는 기본 옵션이다
이들이 유기적으로 연결되어
GAS라는 하나의 시스템을 만든다.
GAS는 단순한 스킬 프레임워크가 아니다.
복잡한 게임플레이를 구조적으로 사고하게 만드는 도구다.

'Dev. > UE 언리얼 엔진' 카테고리의 다른 글
| [GAS] 스켈레탈 메쉬 크래시 해결: EXCEPTION_ACCESS_VIOLATION (0) | 2026.02.03 |
|---|---|
| [NodeToCode + 로컬 AI 가이드] 블루프린트를 N초 만에 C++로? (0) | 2026.01.27 |
| [GAS] Unreal Engine 1인칭/3인칭 카메라 전환 시스템 (1) | 2026.01.19 |
| [GAS] Unreal Engine 데미지 팝업 시스템 개선: 타격감을 위한 Dev Log (0) | 2026.01.16 |
| [GAS] 1월 초 구현한 시스템 정리 (0) | 2026.01.16 |