0. GAS(Gameplay Ability System)

GAS란 복잡한 게임 플레이 능력(Abilities)속성(Attributes) 등을 모듈화 + 네트워크 동기화를 고려하여 관리하기 위한 시스템이다. MMORPG, MOBA 등에서 체력, 마나, 스킬, 상태이상, 버프/디버프, 쿨타임 같은 기능을 만드는 데 최적화되어 있다.

1. GAS 주요 개념

  1. Ability : 스킬, 행동. (ex. 점프, 공격, 회복 등)
  2. Attribute : 수치 값. (ex. 체력, 마나, 공격력, 속도 등)
  3. GameplayEffect : 속성을 변화시키는 효과. (ex. 데미지, 힐, 버프/디버프 등)

2. GAS 주요 클래스

  1. UAbilitySystemComponent : GAS의 핵심 컨트롤러 - Ability, Attribute, Effect 관리
    • Ability 부여/발동, Effect 적용, Attribute 저장, 복제 처리 등 모든 것을 관장
    • Character, PlayerState, Pawn 등 원하는 Actor에 붙여 사용
    • 능력을 추가하거나 제거할 때도 ASC를 통해 처리
  2. UGameplayAbility : 실제 스킬/능력 정의 - 쿨타임, 조건, 발동 등
    • 발동 조건, 애니메이션 실행, 이펙트 적용, 태그 부여 등 처리
    • 상태머신처럼 ActivateAbility, EndAbility 사용
  3. UGameplayEffect : 속성 변화/버프/디버프 정의 - 데미지, 힐 등
    • 적용 방식 : Instant / Duration / Infinite
    • 속성 변화, 태그 추가/제거, 스탯 제한, 쿨타임까지 관리 가능
  4. UAttributeSet : 체력, 마나, 공격력 등의 수치값 정의
    • ASC에 하나 이상 연결되며, 내부에 FGameplayAttributeData 사용
    • PreAttributeChange, PostGameplayEffectExecute 함수에서 값 변경 대응 가능
  5. FGameplayTag : 스킬/상태/구분용 태그 시스템
    • 태그로 조건 제한, 상태 체크, 블로킹 가능
    • ex. State.Stunned, Ability.Fireball, Debuff.Slow
  6. FGameplayEffectSpec : GameplayEffect를 적용하기 위한 실행 시 스펙 정보
    • 이펙트 복제/적용 시 필요한 정보들을 담음
  7. FGameplayAbilitySpec : GameplayAbility를 ASC에 등록하기 위한 실행 정보(스킬 정보 구조체)
    • Ability 클래스, 레벨, 인풋 ID, 활성화 가능 여부 등을 저장
  8. AGameplayAbilityTargetActor : 스킬 타겟팅 UI/데이터 처리용 액터(ex. 타겟 마우스 클릭 등)
    • 스킬 타겟팅에 사용되는 액터
    • 커서, 트레이스, 오버랩 등으로 타겟을 잡을 수 있게 해줌
    • TargetActorClass로 스킬 발동 전에 스폰 가능
[Character]
  └─ UAbilitySystemComponent
         ├─ UAttributeSet (속성 저장)
         ├─ UGameplayAbility (스킬)
         └─ UGameplayEffect (속성 변경)

3. 예시(체력, 데미지 구현 흐름)

3-1. MyAttributeSet 클래스 생성

#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName)	\
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName)		\
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName)		\
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName)		\
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

//위의 전처리문은 Getter, Setter, Initter를 자동으로 만들어주기 위함
//접근이 가능해야 하기 때문에 아래의 ATTRIBUTE_ACCESSORS를 public:에 작성

UCLASS()
class UMyAttributeSet : public UAttributeSet
{
    GENERATED_BODY()

public:
	ATTRIBUTE_ACCESSORS(UMyAttributeSet, Health)
	ATTRIBUTE_ACCESSORS(UMyAttributeSet, MaxHealth)

protected:
    UPROPERTY(BlueprintReadOnly, Category="Attributes")
    FGameplayAttributeData Health;
    
    UPROPERTY(BlueprintReadOnly, Category="Attributes")
    FGameplayAttributeData MaxHealth;
};

3-2. GameplayEffect로 데미지 정의

// DamageEffect.ge
DurationPolicy: Instant  
Modifiers:  
- Attribute: Health  
  ModifierOp: Additive  
  Magnitude: -50

Health 속성에 -50을 즉시 적용하는 효과

3-3. Ability에서 효과 적용

void UMyFireballAbility::ActivateAbility(...)
{
    FGameplayEffectSpecHandle Spec = MakeOutgoingGameplayEffectSpec(DamageEffectClass, Level);
    GetAbilitySystemComponent()->ApplyGameplayEffectSpecToTarget(Spec, TargetASC);
}

스킬 발동 -> 효과 생성 -> 상대방 ASC에 적용 -> 데미지 반영

3-4. Attribute 값 반영은 PreAttributeChange 또는 PostGameplayEffectExecute에서 처리

void UMyAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
    if (Data.EvaluatedData.Attribute == GetHealthAttribute())
    {
        Health.SetClampValue(0.f, MaxHealth.GetCurrentValue());
    }
}

흐름

ex. 공격 -> 데미지 적용 -> 죽음 처리

[플레이어] → FireballAbility 발동
     ↓
[Target ASC] ← Apply GameplayEffect (데미지 -50)
     ↓
[AttributeSet] → Health 감소
     ↓
[Health == 0] → "Dead" 태그 부여 → 애니메이션 / AI 처리

4. GAS의 장점

장점 설명
네트워크 자동 동기화 속성 변화, 스킬 사용, 쿨타임 등 자동 복제
태그 기반 논리 상태 구분, 스킬 조건 처리(Stunned, Burning, Dead 등)
모듈화 Ability, Effect, Attribute가 서로 독립적
확장성 버프/디버프, 스킬트리, 쿨다운, 코스트 관리까지 통합 가능
블루프린트/디자이너 친화적 GameplayEffect와 Ability는 데이터 기반 설정 가능

5. 기타

  • GAS는 Actor가 아닌 ASC를 통해 능력/속성을 관리
  • Actor마다 UAbilitySystemComponent를 붙이고, InitAbilityActorInfo로 연결해야 함
  • 블루프린트에서도 거의 모든 기능 사용 가능
  • Effect는 조합식, 회복, 배율 증가, 지속시간 등 다양하게 설정 가능
  • Ability는 Activate, Commit, End 등 단계를 나눠서 처리

Leave a comment