본문으로 건너뛰기

안동민 개발노트

본문 시작

게임플레이 능력 시스템 구현

Ability·Effect·AttributeSet과 서버 권한·예측 흐름을 이해하고 비용과 쿨다운이 있는 기본 공격을 구현합니다.

지금까지는 게임 핵심 구조, 플레이어 상태 관리, 세이브/로드 등 기본 프레임워크 요소를 다뤘습니다.

이제는 플레이어/AI 캐릭터의 다양한 행동, 즉 능력(Ability)을 체계적으로 관리하는 방법으로 확장합니다.

언리얼 엔진은 복잡한 스킬/공격/아이템 사용 로직을 다루기 위해 게임플레이 능력 시스템(Gameplay Ability System, GAS)을 제공합니다.

이번 절에서는 GAS의 기본 개념과 주요 구성 요소, 그리고 간단한 구현 예시를 통해 게임플레이 로직 구조화를 살펴봅니다.

GAS는 능력 실행, 수치 변경, 상태 태그를 분리한다

스킬 로직을 한 블루프린트에 몰아넣지 않고 실행 흐름과 데이터 책임을 나눈다.

구성 요소맡는 일잘못 넣기 쉬운 일
ASC능력 부여, 실행, 취소, 이펙트 적용과 복제개별 스킬의 세부 연출
Gameplay Ability입력, 활성화 조건, 몽타주, 종료 흐름HP 같은 영구 수치 저장
Gameplay Effect데미지, 회복, 쿨다운, 코스트 같은 수치 변화입력 처리와 UI 클릭
AttributeSetHealth, Mana 같은 속성 저장과 클램프스킬별 분기 로직
Gameplay TagState.Stunned, Ability.Melee 같은 실행 가능 여부 판단긴 boolean 조합

게임플레이 능력 시스템(GAS)이란 무엇인가?

게임플레이 능력 시스템 (Gameplay Ability System, GAS)은 언리얼 엔진에서 캐릭터의 스킬, 마법, 공격, 방어, 버프/디버프, 아이템 사용 등 모든 형태의 능력을 모듈화하여 구현하고 관리하기 위한 고수준 프레임워크입니다.

이는 특히 RPG, AOS, FPS 등 복잡한 능력과 스탯, 상태 이상이 많은 게임에 최적화되어 있습니다.

GAS가 필요한 이유
  • 모듈화 및 재사용성: 각 능력을 독립적인 에셋(Gameplay Ability)으로 정의하여 여러 캐릭터에 재사용하고 관리하기 용이합니다.
  • 네트워크 복제 지원: 대부분의 GAS 구성 요소는 네트워크 복제를 기본으로 지원하여 멀티플레이어 게임 개발을 용이하게 합니다.
  • 상태 관리 (Gameplay Attributes): 체력, 마나, 공격력 등 캐릭터의 스탯(Attribute)을 중앙에서 관리하고 변경 사항을 효율적으로 복제합니다.
  • 상태 이상 및 버프/디버프 (Gameplay Effects): 기절, 중독, 속도 증가 등 다양한 상태 이상 효과를 유연하게 적용하고 해제할 수 있습니다.
  • 입력 매핑: 입력(키 누름, 버튼 클릭)과 능력 실행을 유연하게 연결합니다.
  • 데이터 주도적 설계: 많은 로직이 데이터 테이블이나 블루프린트 에셋 형태로 관리되어 디자이너의 참여를 확대하고 반복 작업 속도를 높입니다.

GAS의 주요 구성 요소

GAS는 여러 개의 핵심 클래스와 개념들이 유기적으로 결합되어 작동합니다.

UAbilitySystemComponent (능력 시스템 컴포넌트)
  • GAS에서 능력 실행과 상태 적용을 담당하는 중심 컴포넌트입니다. Pawn 또는 Character에 부착되어 해당 액터가 능력을 사용할 수 있게 합니다.
  • 능력 부여/제거, 능력 실행/취소, 속성(Attribute) 변경, 이펙트 적용/해제 등 모든 GAS 관련 기능을 담당합니다.
  • 네트워크 복제를 지원하여 서버-클라이언트 간 능력 및 속성 동기화를 처리합니다.
UGameplayAbility (게임플레이 능력)
  • 단일 능력의 로직을 정의하는 에셋입니다. (예: GA_Fireball, GA_MeleeAttack, GA_Heal)
  • 블루프린트로 구현되며, 능력 활성화 조건, 실행 로직, 쿨다운, 소모 비용(마나), 능력 취소 조건 등을 포함합니다.
  • Ability Tags, Activation Inputs 등을 통해 능력의 발동 방식을 설정합니다.
UGameplayAttributeSet (게임플레이 속성 세트)
  • 캐릭터의 스탯(Attributes)을 정의하는 컨테이너 클래스입니다. (예: 체력, 마나, 공격력, 방어력, 속도 등)
  • UAbilitySystemComponent에 의해 관리되며, 속성 값의 변경은 네트워크로 복제됩니다.
  • 각 속성은 기본 값, 현재 값, 최대 값 등을 가질 수 있습니다.
UGameplayEffect (게임플레이 이펙트)
  • 속성(Attribute)에 변화를 주거나 태그를 부여/제거하여 캐릭터의 상태를 변화시키는 에셋입니다. (예: GE_Poison (체력 지속 감소), GE_SpeedBoost (속도 증가), GE_Stun (기절 태그 부여))
  • 인스턴트(Instant): 즉시 적용되고 끝나는 효과 (예: 즉시 데미지)
  • 지속(Duration): 일정 시간 동안 지속되는 효과 (예: 버프, 독)
  • 반복(Periodic): 일정 주기마다 적용되는 효과 (예: 초당 체력 회복)
  • 수정자(Modifiers): 속성 값에 직접적인 변화를 줍니다 (덧셈, 곱셈 등).
  • 어트리뷰트 세트 (Attribute Set): 이펙트가 적용될 속성 세트를 지정합니다.
FGameplayTagContainer (게임플레이 태그 컨테이너)
  • 능력, 이펙트, 캐릭터 상태 등을 식별하고 관리하는 데 사용되는 계층적인 문자열 태그입니다. (예: Ability.Melee, State.Stunned, Buff.Speed)
  • 태그를 통해 특정 능력이 다른 능력에 의해 차단되거나, 특정 이펙트가 특정 태그를 가진 대상에게만 적용되도록 제어할 수 있습니다.
  • 프로젝트 세팅에서 Gameplay Tags를 활성화하고 정의합니다.
UAbilitySystemComponent (능력 시스템 컴포넌트)
  • GAS에서 능력 실행과 상태 적용을 담당하는 중심 컴포넌트입니다. Pawn 또는 Character에 부착되어 해당 액터가 능력을 사용할 수 있게 합니다.
  • 능력 부여/제거, 능력 실행/취소, 속성(Attribute) 변경, 이펙트 적용/해제 등 모든 GAS 관련 기능을 담당합니다.
  • 네트워크 복제를 지원하여 서버-클라이언트 간 능력 및 속성 동기화를 처리합니다.

GAS 핵심 관계 정리: Ability / Effect / AttributeSet

GAS는 조건을 통과한 Ability가 Effect를 거쳐 수치와 상태를 바꾸는 순환 구조다

Tag, Cost, Cooldown은 실행 전 문이고, GameplayEffect와 AttributeSet은 실행 결과를 다음 판정으로 되돌린다.

  1. Gameplay Tag

    조건 Stunned 같은 차단 상태와 요구 상태를 판정한다.

  2. Cost

    자원 마나·스태미나처럼 실행 전에 소비할 값을 확인한다.

  3. Cooldown

    시간 같은 능력을 다시 활성화할 수 있는 시점을 제한한다.

  4. Gameplay Ability

    입력과 실행 로직을 소유하고 효과 적용을 요청한다.

  5. Gameplay Effect

    즉시·지속·주기 방식으로 수치와 태그를 변경한다.

  6. AttributeSet

    체력, 마나, 공격력의 최종 값을 저장하고 복제한다.

GAS를 안정적으로 운용하려면 세 요소의 책임 경계를 명확히 잡아야 합니다.

  • Ability (UGameplayAbility): 언제, 어떤 흐름으로 실행할지를 담당합니다. 입력 바인딩, 활성화 조건, 취소 조건, 애니메이션 트리거가 여기에 들어갑니다.
  • Effect (UGameplayEffect): 어떤 수치를 어떻게 바꿀지를 담당합니다. 데미지, 회복, 버프/디버프, 쿨다운/코스트를 데이터 중심으로 정의합니다.
  • AttributeSet (UGameplayAttributeSet): 실제 속성 저장소입니다. 체력/마나/공격력 등 런타임 값과 복제 동기화의 기준점입니다.
실무 규칙
  • Ability 안에 수치 계산을 하드코딩하기보다 Effect와 태그 규칙으로 분리합니다.
  • AttributeSet은 값 보관과 변경 이벤트 처리에 집중하고, UI 갱신은 별도 위젯/컨트롤러에서 처리합니다.
  • 쿨다운/코스트는 가능하면 GameplayEffect로 통일해 재사용성을 확보합니다.

멀티플레이어 기준 실행 흐름 (입력, 쿨다운, 코스트, 권한)

즉시 반응은 클라이언트, 최종 판정은 서버

GAS 예측은 조작감을 빠르게 보여주기 위한 장치이고, Cost, Cooldown, Tag, 효과 적용은 서버 권한으로 확정됩니다.

예측 실행과 서버 확정 판독표
시점클라이언트 역할서버 역할틀어질 때 볼 것
Input 능력 입력예측 애니메이션과 Cue를 먼저 표시입력 요청을 받고 Net Role 확인입력 바인딩과 AbilitySpec Handle
Can Activate 조건 검사가능해 보이면 즉시 UX 시작Cost, Cooldown, Tag, 거리, 시야 재검사실패 이유 Tag 차단, 쿨다운, 비용 부족
Commit 효과 적용예측 Attribute와 화면 효과 유지GameplayEffect와 Attribute 변경 확정권한 기준 데미지와 자원 소모는 서버값이 정답
Replicate 결과 전파복제된 Attribute와 Cue로 화면 보정결과 상태를 관련 클라이언트에 복제Replication Mode와 Cue 발송 범위
Rollback 불일치 보정실패한 예측 효과를 제거하고 원복거부 결과와 확정 상태를 기준으로 삼음잔상 제거 몽타주, Cue, UI 쿨다운 표시
  1. 입력 바인딩: 클라이언트 입력(InputAction)이 들어오면 Ability 활성화 요청을 보냅니다.
  2. 서버 권한 검증: 서버가 태그/상태/코스트를 검증하고 실제 실행 여부를 결정합니다.
  3. 코스트 적용: 실행 확정 시 코스트 Effect를 먼저 적용해 리소스를 차감합니다.
  4. 능력 실행: 애니메이션, 타격 판정, 이펙트 적용 로직을 진행합니다.
  5. 쿨다운 적용: 능력 종료 시점(또는 시작 시점)에 쿨다운 Effect를 적용해 재사용 제한을 동기화합니다.
  6. 복제/예측 처리: 클라이언트는 즉시 피드백(예측)을 보여주고, 서버 결과와 불일치 시 보정합니다.
블루프린트 구현 포인트
  • Ability 실행의 진실 소스는 서버로 두고, 클라이언트는 UX를 위한 예측 연출에 집중합니다.
  • 비용/쿨다운 실패 시에는 즉시 UI 피드백(아이콘 플래시, 사운드, 텍스트)을 제공합니다.
  • 네트워크 규칙은 9장 3절 리플리케이션과 동일한 기준을 따릅니다.

간단한 게임플레이 능력 구현 예시: 기본 공격

플레이어 캐릭터가 근접 공격 능력을 사용하는 시나리오를 GAS를 통해 구현해봅시다.

기본 공격은 입력이 아니라 권한 있는 Effect 적용으로 끝난다

Ability는 타이밍을 조율하고, Effect는 값을 바꾸며, AttributeSet은 상태를 보관합니다. 서버 확정 경계를 흐리지 않아야 예측과 복제가 맞습니다.

  1. Give Ability

    · SERVER 권한에서 Ability Spec을 ASC에 부여

  2. Activate request

    · CLIENT 입력 태그로 활성화 요청·예측

  3. Commit + Task

    · ABILITY 비용·쿨다운 확인 후 몽타주 시작

  4. Target data

    · HIT WINDOW 게임플레이 이벤트에서 대상 전달

  5. Apply GE Spec

    · SERVER GE_Damage로 대상 Health 변경·복제

0단계: GAS 모듈 활성화 및 기본 설정

플러그인 활성화: 언리얼 에디터에서 편집(Edit) > 플러그인(Plugins)으로 이동하여 Gameplay Ability System을 검색하고 활성화합니다.

에디터를 재시작합니다.

게임플레이 태그 설정: 편집(Edit) > 프로젝트 세팅(Project Settings) > 게임플레이 태그(Gameplay Tags)에서 다음 태그를 추가합니다.

  • Ability.Melee
  • State.Attacking
  • Event.Montage.Played (애니메이션 몽타주 재생 시 발생할 이벤트)
1단계: 캐릭터에 AbilitySystemComponent 및 AttributeSet 추가
BP_MyPlayerCharacter 블루프린트 열기
컴포넌트 추가
  • 컴포넌트(Components) 패널에서 + Add 버튼을 클릭하고 AbilitySystemComponent를 검색하여 추가합니다.
  • AbilitySystem이라는 이름으로 변경합니다.
속성 세트 생성
  • 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > All Classes에서 AttributeSet을 검색하여 선택합니다.
  • 이름을 AS_MyCharacterAttributes로 지정합니다.
  • AS_MyCharacterAttributes 블루프린트를 열고, 변수(Variables) 패널에서 Health (Float, 기본값 100.0), MaxHealth (Float, 기본값 100.0) 변수를 추가합니다.
  • 중요: 각 속성 변수를 선택하고 디테일 패널에서 ReplicationReplicated로 설정합니다.
  • OnRep_Health, OnRep_MaxHealth 등의 RepNotify 함수를 생성하고 필요에 따라 UI 업데이트 로직을 추가합니다.
  • PreAttributeChangePostGameplayEffectExecute 함수를 오버라이드하여 체력 감소/증가 로직을 구현합니다. (예: 체력이 0보다 작아지지 않도록 클램프, 최대 체력을 넘지 않도록 클램프, 사망 처리 등)
캐릭터 초기화 (Event BeginPlay 또는 Possessed)
  • BP_MyPlayerCharacter이벤트 그래프에서 Event BeginPlay 또는 OnPossessed 이벤트 뒤에 다음 로직을 추가합니다.
  • AbilitySystem 컴포넌트의 Get Ability System Component 노드를 호출합니다.
  • AbilitySystemComponentInit Ability Actor Info 노드를 호출합니다.
    • Owner Actor: Self (이 캐릭터 자신)
    • Avatar Actor: Self
  • Spawn Actor of Class 노드를 호출하여 AS_MyCharacterAttributes를 스폰합니다.
  • AbilitySystemComponentAdd Set 노드를 호출하고, 스폰된 AS_MyCharacterAttributes 오브젝트를 연결합니다.
  • 컴파일 및 저장합니다.
2단계: 근접 공격 GameplayAbility 생성
GameplayAbility 에셋 생성
  • 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > All Classes에서 GameplayAbility를 검색하여 선택합니다.
  • 이름을 GA_MeleeAttack으로 지정합니다.
GA_MeleeAttack 설정
  • GA_MeleeAttack 블루프린트를 열고, 클래스 디폴트(Class Defaults)를 클릭합니다.
  • Ability Tags: Ability.Melee 태그 추가.
  • Activation Input: Ability1 (또는 여러분의 공격 입력 액션)으로 설정.
  • Ability Cost: (선택 사항) 마나 소모 등을 정의할 수 있습니다.
  • Cooldown: (선택 사항) 쿨다운 시간을 정의합니다.
  • 이벤트 오버라이드
    • Activate Ability이벤트 오버라이드: 능력이 활성화될 때 실행될 로직을 구현합니다.
      • Commit Ability 노드: 쿨다운, 비용 등 모든 활성화 조건을 만족하면 능력을 커밋합니다.
      • Play Montage and Wait 어빌리티 테스크 노드: 공격 애니메이션 몽타주를 재생합니다. Montage To Play 핀에 공격 몽타주(예: AM_PlayerAttack)를 연결하고 Event NameAttackHit (몽타주에 추가한 노티파이 이름)으로 설정합니다.
      • Apply Gameplay Effect To Owner 노드: 공격력 감소 이펙트 등을 자신에게 적용할 수 있습니다.
    • K2_OnEndAbility이벤트 오버라이드: 능력이 종료되거나 취소될 때 실행될 로직. (애니메이션 중단, 태그 제거 등)
공격 히트 로직 (Montage Event)
  • Play Montage and Wait 노드의 On Completed 또는 On Blended Out 이벤트 핀에서 Apply Gameplay Effect to Target 노드를 호출합니다.
  • 데미지 이펙트 GE_Damage (다음 단계에서 생성)를 생성합니다.
  • Get Ability System Component > Get Target Data from Actor 노드 등을 사용하여 타겟(적)을 가져옵니다. (콜리전 이벤트, 라인 트레이스 등으로 타겟을 감지하고 TargetData로 전달)
  • 타겟의 AbilitySystemComponent에 데미지 이펙트를 적용합니다.
  • End Ability 노드를 호출하여 능력 실행을 종료합니다.
3단계: 데미지 GameplayEffect 생성 (GE_Damage)
GameplayEffect 에셋 생성
  • 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > All Classes에서 GameplayEffect를 검색하여 선택합니다.
  • 이름을 GE_Damage로 지정합니다.
GE_Damage 설정
  • GE_Damage 블루프린트를 열고 클래스 디폴트(Class Defaults)를 클릭합니다.
  • Duration Policy: Instant (즉시 적용)
  • Modifiers: + 버튼을 클릭하여 새로운 수정자를 추가합니다.
    • Attribute: Health (AS_MyCharacterAttributes의 Health 속성)
    • Modifier Op: Additive (더하기)
    • Source: Attribute (데미지 원천 속성) 또는 Set by Caller (능력 블루프린트에서 데미지 값을 지정)
    • Magnitude: Value (예: -20.0 또는 Set by Caller를 사용하면 20.0을 전달)
  • 컴파일 및 저장합니다.
4단계: 캐릭터에 능력 부여
BP_MyPlayerCharacter 블루프린트 열기
Event BeginPlay (또는 Possessed) 이벤트 뒤에 다음 로직을 추가합니다.
  • AbilitySystem 컴포넌트의 Give Ability 노드를 호출합니다.
  • Ability Class 핀에 GA_MeleeAttack을 연결합니다.
  • Level1 (능력 레벨)로 설정합니다.
  • Input TagAbility1 (GA_MeleeAttack의 Activation Input과 동일하게)으로 설정합니다.
5단계: 입력 매핑 (Input Mapping)
편집(Edit) > 프로젝트 세팅(Project Settings) > 엔진(Engine) > 입력(Input)으로 이동합니다.

액션 매핑(Action Mappings): Attack이라는 새 액션 매핑을 추가하고 키를 Left Mouse Button으로 설정합니다.

BP_MyPlayerCharacterPlayerController (예: PC_MyPlayer) 열기
  • Event Graph에서 Input Action Attack 이벤트를 생성합니다.
  • Pressed 핀에서 Get Ability System Component 노드를 호출합니다.
  • AbilitySystemComponentTry Activate Abilities By Tag 노드를 호출합니다.
    • Ability TagsAbility.Melee 태그를 추가합니다.
    • Ignore Ability CostIgnore Cooldown은 필요에 따라 설정합니다.
  • 컴파일 및 저장합니다.

테스트 및 디버깅

모든 블루프린트를 컴파일하고 저장합니다.

게임을 플레이하고 Left Mouse Button을 눌러 GA_MeleeAttack이 활성화되고 애니메이션이 재생되는지 확인합니다.

디버그

  • ShowDebug AbilitySystem: 콘솔에 입력하면 GAS 관련 디버그 정보를 화면에 표시합니다.
  • AbilitySystemComponent 디버깅: 캐릭터를 선택한 상태에서 AbilitySystem 컴포넌트를 선택하고 디테일 패널 하단의 Debug 섹션을 확인합니다.
  • 게임플레이 태그 디버깅: 콘솔에 GameplayTag.Debug를 입력하여 현재 적용된 태그를 확인합니다.

GAS 멀티플레이어에서 자주 발생하는 실수 (Authority / Prediction)

  • 서버 검증 누락: 클라이언트에서만 능력 성공 처리를 완료하면 치트/불일치가 발생합니다.
  • 코스트-쿨다운 적용 순서 혼동: 코스트 실패인데 쿨다운이 들어가거나, 반대로 쿨다운만 빠지는 버그가 생길 수 있습니다.
  • 예측 보정 누락: 클라이언트 예측 결과와 서버 확정 결과가 다를 때 롤백/보정을 하지 않으면 순간이동, 중복 타격처럼 보입니다.
  • 태그 충돌 관리 부재: State.Stunned 같은 제약 태그를 통합 관리하지 않으면 스킬 동시 실행 버그가 빈번합니다.
권장 점검 순서
  1. 단일 플레이에서 Ability/Effect/AttributeSet 흐름이 의도대로 동작하는지 먼저 검증합니다.
  2. Listen Server 2인 테스트에서 입력-실행-복제 로그를 확인합니다.
  3. 패킷 지연(네트워크 에뮬레이션) 환경에서 예측/보정 품질을 점검합니다.
  4. ShowDebug AbilitySystem, stat net를 동시에 켜고 병목/불일치 구간을 추적합니다.

GAS의 장점과 복잡성

장점
  • 강력한 모듈화: 각 능력을 독립적으로 설계하고 테스트할 수 있습니다.
  • 네트워크 친화적: 복제 로직이 프레임워크 내에 잘 통합되어 멀티플레이어 개발이 용이합니다.
  • 유연한 상태 관리: 속성(Attribute)과 이펙트(Effect)를 통해 복잡한 스탯 및 버프/디버프 시스템을 효과적으로 관리합니다.
  • 데이터 주도적: 많은 설정을 데이터로 관리하여 개발 효율성을 높입니다.
복잡성
  • GAS는 학습 곡선이 가파르고 초기 설정이 복잡할 수 있습니다.
  • 소규모 프로젝트나 매우 간단한 능력 시스템에는 오버킬(Overkill)일 수 있습니다.

GAS는 언리얼 엔진에서 제공하는 가장 강력한 게임플레이 프레임워크 중 하나이며, 복잡한 RPG, 액션 게임 등에서 유연하고 확장 가능한 능력 시스템을 구축하는 데 필수적입니다.

초기 설정 비용이 있으므로 프로젝트 복잡도에 맞춰 GAS 도입 여부를 판단해야 합니다.


이번 절에서는 언리얼 엔진의 게임플레이 능력 시스템(GAS)의 기본 개념, 주요 구성 요소, 그리고 간단한 능력 구현 예시를 통해 GAS가 어떻게 게임플레이 로직을 구조화하고 관리하는지 알아보았습니다.

GAS는 강력하고 유연한 능력을 구현하는 데 필수적인 프레임워크입니다.

이로써 9장 게임플레이 프레임워크의 모든 내용을 마쳤습니다.


GAS는 Ability, Effect, AttributeSet, Tag의 책임을 분리하면 복잡한 스킬도 재사용 가능한 구조로 정리됩니다.

능력 흐름·수치 에셋 분리

Ability는 실행 흐름, GameplayEffect는 수치 변화, AttributeSet은 저장소, GameplayTag는 상태와 조건을 담당합니다.

  1. 활성화 요청

    Input 입력 액션이 AbilitySystemComponent에 능력 실행을 요청합니다.

  2. 조건과 연출

    Ability 태그, 코스트, 상태를 확인하고 몽타주나 타격 흐름을 시작합니다.

  3. 수치 변경

    Effect 데미지, 회복, 버프, 쿨다운을 GameplayEffect로 적용합니다.

  4. 상태 동기화

    Attr AttributeSet 값이 바뀌고 UI는 변경 이벤트를 받아 갱신합니다.

  5. 각 요소가 맡는 일

    능력 부여, 실행, 취소, 이펙트 적용의 중심 컴포넌트입니다. 기절, 공격 중, 쿨다운 같은 상태와 차단 조건을 표현합니다. 재사용 제한과 코스트는 GameplayEffect로 통일하면 관리가 쉬워집니다.

  6. ASC

    능력 부여, 실행, 취소, 이펙트 적용의 중심 컴포넌트입니다.

  7. GameplayTag

    기절, 공격 중, 쿨다운 같은 상태와 차단 조건을 표현합니다.

  8. Cooldown

    재사용 제한과 코스트는 GameplayEffect로 통일하면 관리가 쉬워집니다.

팀 프로젝트에서는 단일 플레이 검증 뒤 권한, 예측, 태그 충돌, 네트워크 로그를 같은 순서로 확인해야 GAS 회귀를 줄일 수 있습니다.

회귀 테스트는 실행 여부보다 서버 수렴 경로를 본다

Local Predicted는 소유 클라이언트에 먼저 보이지만, 비용·쿨다운·상태는 서버 판정과 복제 결과에 수렴해야 한다.

  1. 1 Owner input

    Owner input TryActivateAbility 가 ASC에 요청

  2. 2 Local prediction

    Local prediction prediction key와 함께 허용된 효과를 선반영

  3. 3 Server decision

    Server decision CanActivateAbility 검사 뒤 실행·commit

  4. 4 Authoritative state

    Authoritative state Effect·Attribute·Tag 변경을 복제

  5. 5 Reconcile

    Reconcile 승인은 catch-up, 거절은 예측 부작용 rollback

마지막으로 GAS에서 능력을 실행할 때 Ability, Effect, Attribute, 권한 검증이 이어지는 경로를 정리합니다.

GAS 능력 실행과 검증 경로

GAS는 Ability, Gameplay Effect, AttributeSet, Gameplay Tag를 분리해 권한과 예측을 다루는 시스템입니다.

  1. 능력은 요청, 효과는 상태 변경

    입력은 GameplayAbility를 활성화하고, 데미지와 버프 같은 수치 변화는 GameplayEffect가 AttributeSet에 적용합니다. 01 Ability Tag, Cost, Cooldown, Blocked Tag를 확인해 서버와 클라이언트 예측이 같은 조건을 보게 합니다. 02 GameplayEffect가 Health, Mana, AttackPower 같은 Attribute를 바꾸고 Replication Mode에 맞게 클라이언트에 전달됩니다. 03 AbilitySystemComponent의 태그, 활성 Ability, Cooldown GE, Attribute 값을 화면 로그나 GAS 디버그로 확인합니다.

  2. 능력은 요청, 효과는 상태 변경

    입력은 GameplayAbility를 활성화하고, 데미지와 버프 같은 수치 변화는 GameplayEffect가 AttributeSet에 적용합니다.

  3. 활성화 조건

    Ability Tag, Cost, Cooldown, Blocked Tag를 확인해 서버와 클라이언트 예측이 같은 조건을 보게 합니다.

  4. 효과 적용

    GameplayEffect가 Health, Mana, AttackPower 같은 Attribute를 바꾸고 Replication Mode에 맞게 클라이언트에 전달됩니다.

  5. 디버깅

    AbilitySystemComponent의 태그, 활성 Ability, Cooldown GE, Attribute 값을 화면 로그나 GAS 디버그로 확인합니다.

게임플레이 능력 시스템 구현은 Ability, Effect, Attribute, 권한 검증의 연결 기준으로 점검합니다.