게임플레이 능력 시스템 구현
지금까지 게임의 핵심 구조와 플레이어 상태 관리, 세이브/로드 시스템 등 기본적인 게임플레이 프레임워크 요소들을 다루었습니다. 이제 플레이어 캐릭터나 AI 캐릭터가 게임 내에서 수행할 수 있는 다양한 행동, 즉 '능력(Ability)' 을 체계적으로 관리하고 구현하는 방법에 대해 알아볼 차례입니다. 언리얼 엔진은 복잡한 게임플레이 능력(스킬, 공격, 아이템 사용 등)을 효율적으로 만들 수 있도록 게임플레이 능력 시스템(Gameplay Ability System, GAS) 이라는 강력한 프레임워크를 제공합니다.
이번 절에서는 GAS의 기본 개념과 주요 구성 요소, 그리고 간단한 능력 구현 예시를 통해 GAS가 어떻게 게임플레이 로직을 구조화하는지 알아보겠습니다.
게임플레이 능력 시스템(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를 통해 구현해봅시다.
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) 변수를 추가합니다.- 중요: 각 속성 변수를 선택하고
디테일
패널에서Replication
을Replicated
로 설정합니다. OnRep_Health
,OnRep_MaxHealth
등의RepNotify
함수를 생성하고 필요에 따라 UI 업데이트 로직을 추가합니다.PreAttributeChange
와PostGameplayEffectExecute
함수를 오버라이드하여 체력 감소/증가 로직을 구현합니다. (예: 체력이 0보다 작아지지 않도록 클램프, 최대 체력을 넘지 않도록 클램프, 사망 처리 등)
캐릭터 초기화 (Event BeginPlay 또는 Possessed)
BP_MyPlayerCharacter
의이벤트 그래프
에서Event BeginPlay
또는OnPossessed
이벤트 뒤에 다음 로직을 추가합니다.AbilitySystem
컴포넌트의Get Ability System Component
노드를 호출합니다.AbilitySystemComponent
의Init Ability Actor Info
노드를 호출합니다.Owner Actor
:Self
(이 캐릭터 자신)Avatar Actor
:Self
Spawn Actor of Class
노드를 호출하여AS_MyCharacterAttributes
를 스폰합니다.AbilitySystemComponent
의Add 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 Name
을AttackHit
(몽타주에 추가한 노티파이 이름)으로 설정합니다.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
을 연결합니다.Level
은1
(능력 레벨)로 설정합니다.Input Tag
는Ability1
(GA_MeleeAttack의Activation Input
과 동일하게)으로 설정합니다.
5단계: 입력 매핑 (Input Mapping)
편집(Edit)
> 프로젝트 세팅(Project Settings)
> 엔진(Engine)
> 입력(Input)
으로 이동합니다.
액션 매핑(Action Mappings)
: Attack
이라는 새 액션 매핑을 추가하고 키를 Left Mouse Button
으로 설정합니다.
BP_MyPlayerCharacter
의 PlayerController
(예: PC_MyPlayer
) 열기
Event Graph
에서Input Action Attack
이벤트를 생성합니다.Pressed
핀에서Get Ability System Component
노드를 호출합니다.AbilitySystemComponent
의Try Activate Abilities By Tag
노드를 호출합니다.Ability Tags
에Ability.Melee
태그를 추가합니다.Ignore Ability Cost
및Ignore Cooldown
은 필요에 따라 설정합니다.
- 컴파일 및 저장합니다.
테스트 및 디버깅
모든 블루프린트를 컴파일하고 저장합니다.
게임을 플레이하고 Left Mouse Button
을 눌러 GA_MeleeAttack
이 활성화되고 애니메이션이 재생되는지 확인합니다.
디버그
ShowDebug AbilitySystem
: 콘솔에 입력하면 GAS 관련 디버그 정보를 화면에 표시합니다.AbilitySystemComponent
디버깅: 캐릭터를 선택한 상태에서AbilitySystem
컴포넌트를 선택하고디테일
패널 하단의Debug
섹션을 확인합니다.- 게임플레이 태그 디버깅: 콘솔에
GameplayTag.Debug
를 입력하여 현재 적용된 태그를 확인합니다.
GAS의 장점과 복잡성
장점
- 강력한 모듈화: 각 능력을 독립적으로 설계하고 테스트할 수 있습니다.
- 네트워크 친화적: 복제 로직이 프레임워크 내에 잘 통합되어 멀티플레이어 개발이 용이합니다.
- 유연한 상태 관리: 속성(Attribute)과 이펙트(Effect)를 통해 복잡한 스탯 및 버프/디버프 시스템을 효과적으로 관리합니다.
- 데이터 주도적: 많은 설정을 데이터로 관리하여 개발 효율성을 높입니다.
복잡성
- GAS는 학습 곡선이 가파르고 초기 설정이 복잡할 수 있습니다.
- 소규모 프로젝트나 매우 간단한 능력 시스템에는 오버킬(Overkill)일 수 있습니다.
GAS는 언리얼 엔진에서 제공하는 가장 강력한 게임플레이 프레임워크 중 하나이며, 복잡한 RPG, 액션 게임 등에서 유연하고 확장 가능한 능력 시스템을 구축하는 데 필수적입니다. 처음에는 어렵게 느껴질 수 있지만, 게임의 복잡도가 증가할수록 GAS의 진정한 가치를 느끼게 될 것입니다.
이번 절에서는 언리얼 엔진의 게임플레이 능력 시스템(GAS)의 기본 개념, 주요 구성 요소, 그리고 간단한 능력 구현 예시를 통해 GAS가 어떻게 게임플레이 로직을 구조화하고 관리하는지 알아보았습니다. GAS는 강력하고 유연한 능력을 구현하는 데 필수적인 프레임워크입니다.
이로써 9장 '게임플레이 프레임워크'의 모든 내용을 마쳤습니다.