Unreal Gameplay Ability System 기초

2026. 7. 13. 01:11·Unreal

Gameplay Ability System (GAS)

 

GAS란? 스킬, 속성, 상태 이상 효과 등을 체계적으로 구현하기 위한 언리얼 엔진의 프레임워크.

캐릭터가 수행할 수 있는 행동, 캐릭터가 가진 수치, 그 수치와 상태를 변화시키는 요인 등을 가지고 있다.

 

네트워크 동기화를 지원해 클라이언트의 예측과 서버의 검증이 있고 스킬, 버프, 데미지 공식이 서로 다른 객체와 데이터로 구분되어 있어 모듈화 및 재사용성이 좋다. 기존에 모든것을 상속 - BP로 만들어야 하는 구조와 다르게 Data-Driven 한 설계를 할 수 있다.

 

핵심 클래스: 

UAbilitySystemComponent

액터 컴포넌트. 어빌리티의 활성화, 이펙트 적용, 태그 관리 등을 지원한다.

 

FGameplayTag

계층을 가진 이름표.

태그의 유무를 통해 캐릭터의 상태 / 물체의 상태 등을 판별해 어빌리티 실행 여부를 통제한다.

 

UGameplayAbility

캐릭터가 실행할 수 있는 단일 스킬/행동을 정의한다.

몽타주 재생, 투사체 생성, 타겟팅 처리 등을 수행하며 쿨타임, 소모 자원 등의 조건 설정이 가능하다.

 

FGameplayAbilitySpec

ASC에 GA가 부여될 때 생성되는 데이터이다.

어빌리티의 레벨, 활성화 상태 등을 관리한다.

struct GAMEPLAYABILITIES_API FGameplayAbilitySpec : public FFastArraySerializerItem
{
	FGameplayAbilitySpecHandle Handle; //int32 프로퍼티를 가지고 있는 스펙을 식별하기 위한 ID
    TObjectPtr<UGameplayAbility> Ability; // 인스턴스화된 GA 객체를 가리키는 포인터
    int32	Level; //어빌리티의 레벨
    int32	InputID; //  키보드/마우스와 매핑하기 위한 값
}

// 1레벨, 0번 입력키를 가진 어빌리티 스펙 구조체를 생성한다.
FGameplayAbilitySpec AbilitySpec(MyAbilityClass, 1, 0);

// 생성된 스펙을 ASC에 부여한다.
AbilitySystemComponent->GiveAbility(AbilitySpec);

 

UAbilityTask

GA는 단일 프레임에서 적용, 종료되는것을 확장하기 위해 종료 대기, 입력 대기 등 비동기 흐름 제어용

 

UArributeSet

체력, 이동속도, 방어력 등 캐릭터가 가지는 수치 데이터의 집합이다.

값이 변경될 때 발생하는 이벤트를 정의하고 관리할 수 있다.

 

UGameplayEffect

Attribute를 변경하거나 타겟에게 태그를 부여하는 클래스이다.

즉발형 데미지, 버프, 디버프, 패시브 등을 구현할 수 있고, 이를 태그 기반으로 실행한다.

 

GameplayEffect는 여러개의 Moditfier을 가질 수 있는데,  대상 어트리뷰트, 연산 방식, 값으로 구성되어 있다.

값(Modifier)을 결정하는 방식은 4가지이다.

Scalable Float DataTable에서 지정하는 구조체 값
Attribute Based EffectSpec을 만든 주체/ 타겟의 CurrentValue / EffectSpec을 사용
Custom Calculation Class MMC 클래스를 사용해 커스텀으로 계산
Set By Caller 런타임에 Ability / EffectSpec 생성할 때 값 설정

 

GameplayEffect는 3가지의 지속시간 타입을 가진다.

Duration GameplayCue Usage
Instant Execute Attribute의 BaseValue에 즉각적이고 영구적인 변화를 줄 때 사용합니다. 이 경우 GameplayTag는 적용되지 않으며, 한 프레임 동안조차도 존재하지 않습니다.
Duration Add / Remove Attribute의 CurrentValue를 일시적으로 변경하거나 특정 기간 동안 GameplayTag를 적용할 때 사용합니다. 해당 기간은 UGameplayEffect 클래스 또는 블루프린트에서 정의됩니다.
Infinite Add / Remove Attribute의 CurrentValue를 일시적으로 변경하거나 무한으로 GameplayTag를 적용할 때 사용합니다. 해당 Effect는 스스로 만료되지 않으며, 반드시 Ability나 ASC(Ability System Component)를 통해 수동으로 제거해야 합니다.

 

GameplayEffect는 다양한 방법으로 적용이 가능한데, GA의 함수나 ASC의 함수로 적용한다.

GE를 직접 넘기는 방식은 블루프린트에 설정된 정적인 데이터만 적용 가능하고,

런타임에 데미지 수치를 계산하는 등의 데이터 조작이 필요한 경우에는 Spec을 만들어 적용해야 한다.

ApplyGameplayEffectToSelf: 자신에게 GE 클래스를 직접 적용한다.
ApplyGameplayEffectToTarget: 특정 대상에게 GE 클래스를 직접 적용한다.
ApplyGameplayEffectSpecToSelf: 자신에게 동적으로 설정된 GE 스펙(Spec)을 적용한다.
ApplyGameplayEffectSpecToTarget: 특정 대상에게 동적으로 설정된 GE 스펙을 적용한다.

 

FGameplayEffectSpec

GE를 타겟에게 적용시키기 전에, FGameplayEffectContextHandle, Level, Period, Duration, Dynamic Gameplay Tag를 넣어 생성한다. 

 

FGameplayEffectContextHandle

FGameplayEffectSpec 구조체 안에 포함되어있는 정보로 FGameplayEffectContext 를 가리킨다. 

FGameplayEffectContext는 시전자, 충돌 정보 등을 담고있다.

// 1. 컨텍스트 생성 (상황 정보 캡처)
FGameplayEffectContextHandle ContextHandle = AbilitySystemComponent->MakeEffectContext();

필요 시 컨텍스트에 추가 정보 주입 (예: 타격 위치 정보)
ContextHandle.AddHitResult(MyHitResult);

// 2. 스펙 생성 (클래스 + 레벨 + 컨텍스트 결합)
FGameplayEffectSpecHandle SpecHandle = AbilitySystemComponent->MakeOutgoingSpec(DamageEffectClass, 1.0f, ContextHandle);

동적 데이터 주입 (예: Set By Caller 수치 설정)
if (SpecHandle.IsValid())
{
    SpecHandle.Data.Get()->SetSetByCallerMagnitude(FGameplayTag::RequestGameplayTag(FName("Data.Damage")), 50.0f);
}

// 3. 타겟에게 적용
if (SpecHandle.IsValid() && TargetASC)
{
    AbilitySystemComponent->ApplyGameplayEffectSpecToTarget(*SpecHandle.Data.Get(), TargetASC);
}

 

 

 

 

 

'Unreal' 카테고리의 다른 글

무기 시스템 - 1  (0) 2026.07.12
'Unreal' 카테고리의 다른 글
  • 무기 시스템 - 1
GRstory
GRstory
  • GRstory
    GRstory Blog
    GRstory
  • 전체
    오늘
    어제
    • 분류 전체보기 (39)
      • Unity (0)
      • Unreal (2)
      • DirectX (3)
      • 프로그래머스 (30)
      • GameReady Format (1)
      • AI (2)
      • ETC (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    GameReady
    OpenUSD
    SimReady
    omniverse
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
GRstory
Unreal Gameplay Ability System 기초
상단으로

티스토리툴바