1. GAS란?

골두·2024년 7월 9일

Unreal GAS Framework

목록 보기
1/8
post-thumbnail

해당 글은 https://github.com/tranek/GASDocumentation 의 설명을 한글로 번역 후 첨언 및 요약 해 나 보려고 내 입맛대로 작성한 글이다.

Intro to the GameplayAbilitySystem Plugin

GAS라는 것은 이 GameplayAbilitySystem의 줄임말로 Ability(능력 및 플레이어의 행동 스킬을 의미)와 Attribute(플레이어의 스탯 및 상태 등을 의미)를 관리할 때 높은 유연성을 보장해주는 프레임워크 플러그인 이라고 할 수 있다. (그래서 RPG나 MOBA 장르에서 사용해보기를 권장한다)

해당 프레임워크를 통해서 플레이어에게 특정 액션(행위)나 패시브 스킬을 사용할 수 있게하고 상태 이상 관리나 특정 Attribute(스텟 및 체력 마나 등)의 소모와 그 소모에 대한 SideEffect등을 관리하고, 특정 Ability에 대한 쿨타임 관리를 하는 것에도 유용하다.

레벨이나 스텟 등에 따라 이펙트, 사운드, 애니메이션 을 GAS에서 관리해주는 즉 복잡하고 다양한 기능을 관리하지만 쉽게 사용하고 추가할 수 있는 이점이 있고, 네트워크에 대한 지원도 있기에 멀티 플레이 게임에서도 사용할 수 있다.

이 GAS 프레임워크는 EpicGames의 시그니쳐 게임이라고 할 수 있는 Paragon과 Fortnite에서 이미 입증이 되었기에 걱정없이 사용해도 무방하다고 할 수 있다. (요새는 한국 현업에서도 사용하기 시작하는 모습이 보인다)

GAS Plugin의 이점과 기능

GAS 플러그인은 한번 설치 이후 별도의 추가적인 설치나 구성 없이(이것을 영어로 out-of-the-box 라고 말한다) 싱글 및 멀티 플레이어 게임을 구축하는데 필요한 솔루션들을 제공해준다.

GAS 플러그인 제공 기능 목록

  1. GameplayAbilities: 레벨 베이스의 캐릭터(레벨 베이스라고 말하지만 레벨이랑 크게 상관은 없어보인다.)에게 특정한 능력 및 스킬을 선택적인 코스트(마나 or 스테미나같은 소모 스탯을 의미)와 쿨타임을 설정해 제공하는 기능이다.
  2. Attributes: 숫자(float) 기반의 스탯을 액터에게 보유시키고 관리하는 역할을 수행하는 기능이다. (ex. 레벨 성장, 체력, 스텟 관리)
  3. GamePlayEffect: 액터의 상태이상 및 특정 효과를 관리하는 기능을 한다. (마나 소비, 스턴 상태이상 부여 등)
  4. GameplayTags: GAS와는 조금 별개이긴 하지만 특정 액터에게 Tag를 부여하고 관리하는 기능을 한다. 여기서 태그는 특정 액터에게 특정한 고유 ID값(string or int? 보통은 string으로)을 부여해 그 태그의 유무에 따라 특정 액션을 실행하거나 중단하게 하기 위한 식별자에 가까운 기능이다.
  5. GameplayCues: 비쥬얼 이펙트 or 사운드를 스폰(소환 및 재생이라고 생각하면 편하다)하는 기능을 의미한다.
  6. 위 5개를 전부 Replication 해 멀티플레이 게임에서 해당 기능들의 최신 상태를 유지하고 공유하는 기능을 보유하고 있다. (ex. AOS 장르에서 플레이어를 때릴 때 상대 플레이어의 체력이 달고 그것이 모든 플레이어들에게 정보가 공유된다)

멀티플레이어 게임을 위한 기능

GAS을 이용해 멀티플레이어 게임을 만드는 경우 Client Side Prediction(클라이언트 관점의 예측 기능)을 제공한다.

Client-Side-Prediction

게임 서버 프로그래밍에서 사용되는 개념으로 서버가 지연 시간이 길어질 때 게임 플레이에 부정적인 영향을 끼치지 않게하는 기법으로 클라이언트 측에서 예측 프로세스를 만들어 서버가 입력을 listen하고 상태를 업데이트 해 전달하기 이전에 클라이언트 측에서 먼저 사용자 입력에 대해 반응하는 것을 말한다.

웹 관점에서도 서버 네트워크 지연을 방지해 좋아요 같은 기능에 대해 낙관적 업데이트(API 호출과는 별개로 좋아요를 누르면 우선 눌러진 것 처럼 보여주고 후에 서버 반응에 따라 다시 설정해주는 것)라는 것을 제공하는데 해당 방식도 위와 동일한 기능을 한다고 생각하면 편할 것 같다.

제공 기능 목록

  • Ability 활성화
  • Attribute 변경에 대한 대응
  • GameplayTag 적용
  • GameplayCue 스폰
  • CharacterMovementComponentRootMotionSource 함수를 통한 이동 기능 연동. 즉 서버 반응에 따른 움직임 이전에 동작하게 설정

GAS의 주의사항

GAS는 반드시 C++ 기반으로 세팅이 되어야 한다. 다만 GameplayAbility와 GameplayEffect의 경우는 Blueprint로도 제작이 가능하다. 이말은 즉슨 C++ 기반의 프로젝트에서 GAS의 기본을 세팅하고 이후 추가적인 능력이나 반응에 대한 것들은 Blueprint로도 연동이 가능하다라는 것을 말한다.

현재 GAS의 이슈 (5.3 기준)

  • GameplayEffect의 latency reconciliation(지연에 대한 조정 기능), latency가 높고 낮은 것에 따라 쿨타임 동작의 결과를 출력하는 것이 현재로써는 불가능함. (오역 가능성 있음)
  • GameplayEffect의 제거에 대해 예측 프로세스 동작이 불가능하다. GameplayEffect가 부정적인 효과(attributes에 -값을 제공하는 효과를 의미하는 것으로 추정)에 대해서는 어느정도 예측해 효율적으로 제거할 수 는 있지만 이게 완벽하지도 정확하지도 않기 때문에 현재로써는 이슈로 판단하고 있음.
  • 문서 부족과 boilerplates의 부족. 해당 부분은 연구를 통해 더 작성이 필요하다.

Setting UP Unreal with GAS

세팅 자체가 어렵지는 않다. 의외로 간단한데 다음과 같은 작업을 하면 된다.

  1. Unreal Editor에서 GameplayAbilitySystem을 다운 받는다. (2번 하기 전에 1번을 하고 하는게 훨씬 편할 것이다)
  2. [프로젝트명].build.cs에서 "GameplayAbilities", "GameplayTags", "GameplayTasks" 총 3가지 옵션을 PrivateDependencyModuleNames에 추가하는 작업이 필요하다.
  3. 해당 프로젝트를 VS에서 새로고침 및 재생(?)한다. Rider에서는 .build.cs가 변경되면 알아서 새로고침이 되기 때문에 VS에서만 무언가 챙겨주면 될 것 같다.
  4. 4.24 ~ 5.2 까지는 TargetData를 이용하기 위해서는 UAbilitySystemGlobals::Get().InitGlobalData()로 먼저 글로벌 데이터 초기화 작업이 필요하다. tranek에서 제공한 샘플 프로젝트 (위의 깃헙 링크)에서는 UAssetManager::StartInitialLoading() 즉 별도의 에셋 매니저를 통해 초기화를 진행하였다. 5.3 버전 이상의 경우는 해당 기능이 자동으로 실행되기 때문에 세팅할 필요는 없다.
  5. 이후 AttributeSet과 ASC(Ability System Component)를 Character나 PlayerState에 세팅하는 것 부터 시작해 원하는 캐릭터나 플레이어에 ability와 effect를 만들어나가면 된다.

참고글

profile
나 볼려고 만든 블로그 (블로그 이전: https://goldfrosch.tistory.com/)

0개의 댓글