GAS 아키텍처 개요
Gameplay Ability System의 핵심 구조와 설계 철학
Gameplay Ability System이란?
Epic Games의 검증된 게임플레이 프레임워크
Gameplay Ability System(GAS)은 Epic Games가 Fortnite와 Paragon에서 검증한 전투 및 스킬 시스템 프레임워크입니다. RPG, 액션 어드벤처, MOBA 등 게임플레이 중심 프로젝트에 적합합니다.
- 모듈화 - 스킬, 효과, 속성을 독립적인 컴포넌트로 관리
- 네트워크 복제 - 내장된 멀티플레이어 지원
- 확장성 - 복잡한 상호작용도 태그 기반으로 관리
- 디자이너 친화적 - 블루프린트로 스킬 생성 가능
GAS의 초기 설정(ASC, AttributeSet)은 C++로 구현해야 하지만, GameplayAbilities와 GameplayEffects는 디자이너가 블루프린트로 생성할 수 있습니다.
핵심 컴포넌트
GAS를 구성하는 다섯 가지 핵심 요소
AbilitySystemComponent
모든 GAS 상호작용을 관리하는 중앙 허브. 어빌리티 부여, 이펙트 적용, 태그 관리를 담당.
AttributeSet
체력, 마나, 공격력 등 수치 속성 정의. 리플리케이션과 변경 콜백 지원.
GameplayAbility
스킬, 공격 등 실행 가능한 액션. 입력 바인딩, 쿨다운, 비용 처리 포함.
GameplayEffect
속성 수정 방법 정의. 즉시 효과, 지속 효과, 무한 효과 지원.
GameplayTags
상태와 능력을 식별하는 계층적 태그 시스템. 조건부 로직의 핵심.
[AbilitySystemComponent]
|
+---------------------+---------------------+
| | |
[AttributeSet] [GameplayAbility] [GameplayTags]
| |
v v
Health, Mana... Skills, Actions
^ |
| v
+--------[GameplayEffect]---------+
Damage, Buffs, Debuffs
프로젝트 설정
GAS 모듈 추가 및 초기 설정
// GAS 모듈 의존성 추가
public class MyGame : ModuleRules
{
public MyGame(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"InputCore",
"GameplayAbilities", // GAS 핵심
"GameplayTags", // 태그 시스템
"GameplayTasks" // 어빌리티 태스크
});
}
}
#include "AbilitySystemGlobals.h"
void AMyGameMode::BeginPlay()
{
Super::BeginPlay();
// UE 5.2 이하에서는 수동 초기화 필요
// UE 5.3+에서는 자동 호출됨
UAbilitySystemGlobals::Get().InitGlobalData();
}
UE 5.3부터 InitGlobalData()가 자동 호출됩니다. 이전 버전에서는 GameMode의 BeginPlay에서 반드시 호출해야 합니다.
ASC 소유 패턴
AbilitySystemComponent 배치 전략
| 패턴 | ASC 위치 | 장점 | 사용 사례 |
|---|---|---|---|
| Character 소유 | Character 클래스 | 간단한 설정, AI에 적합 | 단순 NPC, 적 AI |
| PlayerState 소유 | PlayerState 클래스 | Pawn 변경 시 ASC 유지 | 플레이어 캐릭터 |
#pragma once
#include "CoreMinimal.h"
#include "AbilitySystemInterface.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"
UCLASS()
class MYGAME_API AMyCharacter : public ACharacter, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
// IAbilitySystemInterface 구현 - 필수!
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
protected:
// Character 소유 패턴
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Abilities")
UAbilitySystemComponent* AbilitySystemComponent;
// AttributeSet
UPROPERTY()
class UMyAttributeSet* AttributeSet;
};
데이터 흐름
GAS에서 데이터가 처리되는 과정
1. [입력] 플레이어가 스킬 버튼 누름
|
v
2. [ASC] TryActivateAbility() 호출
|
v
3. [GameplayAbility] CanActivateAbility() 검사
- 태그 조건 확인
- 비용(마나 등) 확인
- 쿨다운 확인
|
v
4. [GameplayAbility] ActivateAbility() 실행
- 몽타주 재생
- GameplayEffect 적용
|
v
5. [GameplayEffect] 대상에 효과 적용
- Execution Calculation 실행
- AttributeSet 수정
|
v
6. [AttributeSet] 속성 변경 처리
- PreAttributeChange() - 클램핑
- PostGameplayEffectExecute() - 후처리
- OnRep 함수 - 클라이언트 동기화
|
v
7. [UI] 속성 변경 델리게이트로 UI 업데이트
핵심 요약
- GAS는 Epic Games가 검증한 게임플레이 시스템 프레임워크
- 다섯 핵심 요소: ASC, AttributeSet, GameplayAbility, GameplayEffect, GameplayTags
- Build.cs에 GameplayAbilities, GameplayTags, GameplayTasks 모듈 추가 필수
- IAbilitySystemInterface 구현으로 ASC 접근 표준화
- 플레이어는 PlayerState 소유 패턴, AI는 Character 소유 패턴 권장
도전 과제
배운 내용을 직접 실습해보세요
프로젝트에서 GameplayAbilities 플러그인을 활성화하고, Build.cs에 GameplayAbilities, GameplayTags, GameplayTasks 모듈을 추가하세요. ASC, Ability, Effect, Attribute 클래스 간의 관계를 다이어그램으로 정리하세요.
RPG 전투 시스템(근접 공격, 마법, 버프/디버프, 패시브 스킬)을 GAS 프레임워크에 매핑하세요. 어떤 기능을 GameplayAbility로, 어떤 것을 GameplayEffect로, 어떤 것을 Attribute로 구현할지 설계 문서를 작성하세요.
GAS의 장단점(네트워크 복제 내장, GameplayTag 기반 필터링, 높은 학습 곡선)을 분석하고, 순수 C++ 커스텀 어빌리티 시스템과 비교하세요. RPG 프로젝트에서 GAS가 적합한 이유를 기술적으로 정리하세요.