GAS(GameplayAbilitySystem) - 1편

2025. 5. 21. 15:13원티드_언리얼RPG 2기/언리얼

참고자료 : https://youtu.be/Jd8KjxNe4EU?si=QKWRq6pW8SmL0iaz

https://github.com/tranek/GASDocumentation?tab=readme-ov-file#table-of-contents

 

GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer s

My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer sample project. - tranek/GASDocumentation

github.com

 

 

GAS 란?


GAS는 복잡한 기술, 행동, 버프 등을 효율적으로 관리할 수 있게 해주는 프레임워크이다. 캐릭터 클래스에서 직접 모든 전투 액션을 처리하면 코드가 복잡해지고 유지보수가 어렵다. GAS를 사용하면 이러한 로직을 모듈화하여 관리하기 쉽게 만들 수 있다.

 

GAS의 핵심 구성요소


Ability System Component(ASC)

  • GAS의 가장 중심이 되는 컴포넌트
  • 액터(캐릭터 등)에 부착되어 Ability, Attribute, Effect등을 관리하고 GAS 시스템과의 모든 상호작용을 처리

 

Ability,  Attribute,  Effect,  Tag,  Cue

  • Ability
    • 플레이어의 행동 및 동작
    • 코스트, 쿨다운, 실행조건을 가질 수 있음
    • Tag로 활성화/차단 가능  (공격중 대쉬 스킬 사용 -> 공격을 중지하고 대쉬)
    • 향상된 입력 시스템을 추가해서 액션 바인딩 가능
  • Attribute
    • Attribute 혹은 AttributeSet 
    • 구조체에 의해 정의되는 값 (Hp, Str, 공격속도 ...) 
    • 액터의 수치적 속성 (예: 체력, 마나, 공격력, 방어력)을 정의하고 관리
  • Effect
    • 단일 게임플레이 효과를 정의하는 데이터 전용 클래스
    • 피해나 치유같은 즉각적인 변화를 일으키거나 버프/디버프를 적용
    • Tag(상태) / Attribute(값) 을 변경
// Effect의 종류
Instant: 즉시 적용되고 사라지는 효과 (데미지, 힐링)
Duration: 일정 시간 동안 지속되는 효과 (버프, 디버프)
Infinite: 명시적으로 제거될 때까지 지속되는 효과 (상태 변경)
Periodic: 일정 주기로 반복 적용되는 효과 (도트 데미지, HOT)
  • Tag
    • 게임플레이 태그 (언리얼 범용태그) 
      • 상태, 유형, 속성 등을 식별하고 분류
      • FName 기반
      • Tag Container 존재 
      • FTag Container의 내부함수인 Tag 비교함수로 상태확인 (Tag 쿼리 사용)
        • HasTag (부분적 포함) 
          • "Insect.Ant"  <-  HasTag("Insect") : True
          • "Insect.Mammal"  <- HasTag("Insect.Ant) : False
        • HasTag Exact (단일 Tag 명시적 포함 유무)
          • 하위 태그 까지 명시해줘야 함 
          • "Insect.Ant" <-  HasTagExact("Insect") : False
          • "Insect.Ant" <-  HasTagExact("Insect.Ant"): True
        • Has All ( 지정된 모든 태그를 (계층 구조를 포함하여) 가지고 있는지 확인)
          • 소유한 태그 목록에 해당 태그 또는 하위 태그 모두 만족 해야함
          • "Creature.Mammal.Dog", "Attribute.IsPoison" <-  HasAll( "Creature.Mammal", "Attribute" ) : True
          • "Creature.Insect.Ant" <- HasAll( "Creature.Insect", "Attribute.CanFly" ) : False
        • Has All Exact (지정된 모든 태그를 (정확히 일치하는 형태로) 가지고 있는지 확인)
          • "Creature.Insect.Ant", "Attribute.IsPoison" <-  HasAllExact( "Creature.Insect.Ant", "Attribute.IsPoison" ) : True
          • "Creature.Insect.Ant", "Attribute.IsPoison" <-  HasAllExact("Creature.Insect", "Attribute.IsPoison"  :False  - 첫번째 태그 조건 불충족
    •  어빌리티 태그 (GAS 전용)
      • 어빌리티가 활성화될때 나타나는 태그
        • 공격 도중 대쉬: 공격 취소 후 대쉬 
        • 스턴 상태: 스턴상태면 공격 불가
        • 속성 공격: "언데드" 태그에만 효과가 있는 "힐"
  • GamePlay Cue
    • Gameplay Cue는 이펙트, 사운드, 카메라 셰이크 등 시각적/청각적 효과를 처리
    • Effect나 Ability에서 트리거될 수 있으며, 네트워크 최적화가 되어 있음
    • 순수하게 시각/청각적 표현을 위한 것으로 게임플레이 로직에는 영향을 주지 않음

 

 

OnHit 같은 간단한 피격로직을 GAS로 구현하는이유

 

 

  • 확장성과 일관성:
    • 단순 데미지 처리를 넘어 상태 이상, 저항, 면역 등 복잡한 효과를 일관된 방식으로 관리
    • 새로운 효과나 능력을 추가할 때 기존 코드 수정 없이 확장 가능
  • 데이터 주도 설계:
    • 효과, 능력, 속성 등을 데이터로 정의하여 프로그래머가 아닌 기획자도 수정 가능
    • 블루프린트로 많은 부분 구현 가능하여 프로토타이핑과 이터레이션 속도 향상
  • 네트워크 최적화:
    • GAS는 네트워크 복제를 효율적으로 처리하도록 설계됨
    • 예측, 롤백 등의 네트워크 동기화 메커니즘 내장
  • 상태 관리 용이:
    • Tag 시스템을 통해 캐릭터의 다양한 상태를 쉽게 관리
    • "스턴 중에는 공격 불가", "넉백 중에는 이동 불가" 등의 복잡한 상태 규칙을 태그로 간단히 처리
  • 복잡한 상호작용 처리:
    • 데미지 감소, 반사, 면역 등 다양한 방어 매커니즘 구현
    • 효과 스택킹, 중첩, 대체 등의 복잡한 룰 관리
  • 모듈화 및 재사용성:
    • 한 번 구현한 능력이나 효과를 다양한 캐릭터에 쉽게 적용 가능
    • 테스트와 디버깅이 용이한 분리된 컴포넌트 구조
//간단한 피격로직
void AMyCharacter::TakeDamage(float Damage)
{
    Health -= Damage;
    if(Health <= 0)
        Die();
}

 

 

 

게임이 복잡해진다면 고려해야할 사항들

 

  • 방어력에 따른 데미지 감소
  • 속성(불, 물, 전기 등)에 따른 데미지 변화
  • 방어력 관통, 치명타 등의 특수 효과
  • 특정 상태일 때 데미지 면역/감소/증가
  • 피격 시 발동되는 패시브 스킬
  • 피격 애니메이션과 이펙트 동기화
  • 네트워크 상에서의 동기화

 

이런 복잡한 요소들을 모두 고려하면 단순한 OnHit/GetHit 함수는 금방 복잡해지고 유지보수가 어려짐.

GAS는 이러한 복잡성을 체계적으로 관리할 수 있는 구조를 제공함

작은 규모의 게임이나 프로토타입에서는 OnHit/GetHit으로 충분할 수 있지만, 규모가 큰 게임이나 복잡한 전투 시스템을 가진 게임에서는 GAS의 사용이 장기적으로 더 효율적이다.