[UE] GAS(Gameplay Ability System)
0. GAS(Gameplay Ability System)
GAS
란 복잡한 게임 플레이 능력(Abilities)
과 속성(Attributes)
등을 모듈화 + 네트워크 동기화
를 고려하여 관리하기 위한 시스템이다. MMORPG, MOBA 등에서 체력, 마나, 스킬, 상태이상, 버프/디버프, 쿨타임 같은 기능을 만드는 데 최적화되어 있다.
1. GAS 주요 개념
Ability
: 스킬, 행동. (ex. 점프, 공격, 회복 등)Attribute
: 수치 값. (ex. 체력, 마나, 공격력, 속도 등)GameplayEffect
: 속성을 변화시키는 효과. (ex. 데미지, 힐, 버프/디버프 등)
2. GAS 주요 클래스
UAbilitySystemComponent
: GAS의 핵심 컨트롤러 - Ability, Attribute, Effect 관리- Ability 부여/발동, Effect 적용, Attribute 저장, 복제 처리 등 모든 것을 관장
Character
,PlayerState
,Pawn
등 원하는 Actor에 붙여 사용- 능력을 추가하거나 제거할 때도 ASC를 통해 처리
UGameplayAbility
: 실제 스킬/능력 정의 - 쿨타임, 조건, 발동 등- 발동 조건, 애니메이션 실행, 이펙트 적용, 태그 부여 등 처리
- 상태머신처럼
ActivateAbility
,EndAbility
사용
UGameplayEffect
: 속성 변화/버프/디버프 정의 - 데미지, 힐 등- 적용 방식 : Instant / Duration / Infinite
- 속성 변화, 태그 추가/제거, 스탯 제한, 쿨타임까지 관리 가능
UAttributeSet
: 체력, 마나, 공격력 등의 수치값 정의- ASC에 하나 이상 연결되며, 내부에
FGameplayAttributeData
사용 PreAttributeChange
,PostGameplayEffectExecute
함수에서 값 변경 대응 가능
- ASC에 하나 이상 연결되며, 내부에
FGameplayTag
: 스킬/상태/구분용 태그 시스템- 태그로 조건 제한, 상태 체크, 블로킹 가능
- ex.
State.Stunned
,Ability.Fireball
,Debuff.Slow
FGameplayEffectSpec
: GameplayEffect를 적용하기 위한 실행 시 스펙 정보- 이펙트 복제/적용 시 필요한 정보들을 담음
FGameplayAbilitySpec
: GameplayAbility를 ASC에 등록하기 위한 실행 정보(스킬 정보 구조체)- Ability 클래스, 레벨, 인풋 ID, 활성화 가능 여부 등을 저장
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