[GAS] 언리얼 게임플레이 어빌리티 시스템 개요 (UE GAS Overview)
해당 GAS관련 학습 프로젝트를 진행하며 작성하는 글에서의
사용자의 정의를 하고자한다.
해당 분류의 포스팅에서의 사용자의 의미는
언리얼에서 GAS를 사용하여 제작하는 사용자를 일컫는 말로 정의하고자 한다.
언리얼 게임 플레이 어빌리티 시스템을 이용하면
다양한 아이템을 제작할 수 있다.
또한
조종하는 캐릭터가 다양한 공격과 스킬을 사용할 수 있다.
물론 GAS를 사용하지 않아도
공격과 스킬, 다양한 아이템은 제작할 수 있다만
시스템을 사용해서 보다 효과적으로 구현해 본 경험을 가지는 게
나의 학습 목표이다.
자, 이제 왜 GAS를 사용하면 어떤 점이 좋은지
공부하며 차차 알아가보자.
오늘 포스팅 목표는 다음과 같다.
- 게임플레이 어빌리티 시스템을 구성하는 주요 개념과 핵심 구성요소의 학습
- C++ 언어로 게임플레이 어빌리티 시스템을 학습해야 하는 이유알기
먼저 게임 플래이 어빌리티 시스템에 대한 개요를 설명해나가며
GAS에 대해서 학습해 보자.
게임 플래이 어빌리티 시스템에 대한 개요
Gameplay Ability System
GAS는 포트나이트와 같은 실제로 지금 동작하고 있는
대형, 초대형 네트워크 멀티플레이어 서비스에서 사용하고 있는 하나의 프레임워크이다.
따라서 현재 많은 각광을 받고 있지만,
정작 이것을 공부할 수 있는 유용한 문서와 예제는 크게 없다.
언리얼 공식 샘플인 Lyra Starter 프로젝트가
사실 GAS를 잘 활용한 교육 자료라고 볼 수 있다.
이 프로젝트 자체가 여러 기능이 많이 들어가 있다.
UE5에서 새롭게 등장한 여러 가지 기능들이 모두 해당 프로젝트 예제에 들어가 있는 상태이며,
꽤나 완성도가 높은 상태라, 사실 초심자가 참고하기에는 적합하지 않다는 평도 있다.
따라서 전체적인 GAS를 이해할 수 있도록
최대한 간단하게 접근하고, Lyra를 접하는 것이 좋다.
Gameplay Ability System FrameWork
- GAS란 무엇인가?
Actor가 소유하고 발동할 수 있는 어빌리티 및
액터 간의 인터랙션 기능을 제공하는 프레임워크이다.
- RPG, 액션 어드벤처, MOBA 장르의 제작을 쉽게하기 위한 도구로
대부분의 복잡한 시스템의 제작을 쉽게 제작할 수 있도록 특화된 도구이다.
비단 위의 게임 종류 뿐만 아니라 대부분의 게임 제작에도 활용 가능하다.
GAS FrameWork의 장점
- 유연성과 확장성 ☆x5
다양하고 복잡한 게임 제작에 대응할 수 있도록 범용적으로 설계된 것이다.
(GAS를 사용하는 가장 큰 핵심 이유이다.)
유연성과 확장성의 가장 큰 장점의 예시는 다음과 같다.
초기 기획보다 기획이 커지고 더 확장되면
시스템을 다 갈아엎고 다시 새로 짜야한다.
아마 게임 개발을 해본 분들은 흔하게 경험한 패턴일 것이다.
하지만 GAS 프레임워크를 사용하게 되면
이로 인해 낭비되는 시간이나 리소스를 크게 줄일 수 있다.
만일 사용자가 게임 제작 경험이 많지 않다면,
먼저 GAS를 공부하는 것을 추천한다.
언리얼 게임 프레임 워크를 한 단계 더 발전시켜서
모든 게임 프레임 워크에 사용 가능하도록
확장시킨 프레임 워크가 GAS이다.
이 GAS가 가지는 확장성과 유연성의 특징 때문
앞으로 언리얼 엔진을 개발할 때
이 프레임 워크로 개발하는 팀과 그렇지 않은 팀과의 생산성에는 큰 차이가 날 수도 있다.
- 모듈러 시스템 ☆x3
각 기능에 대한 의존성이 최소화되도록 설계
(사용법이 중요 모듈러 시스템에 대한 개념을 숙지해야 사용할 수 있다.
모듈러 시스템을 알기 이전에 모듈에 대한 개념이 사용자에게 있어야 한다.)
게임 개발 규모가 커지면
내가 구현한 기능들 간의 의존성이 발생하면서 얽히고설키게 된다.
그래서 프로젝트 관리가 난해하게 되는데,
GAS는 각 기능이 독립적으로 동작하도록 모듈화 돼서 구성되어 있다.
따라서 언제든지 필요한 기능을 추가하고
삭제하고 변경해도 전체 프로젝트에는 크게 영향을 끼치지 않도록 동작하고 있다.
이번에 진행하는 GAS 전용 학습용 프로젝트에서는
이런 모듈러 시스템의 장점을 극대화해보도록 한 번 교환을 설계할 것이다.
- 네트워크 지원
네트워크 멀티플레이어 게임에서도 활용 가능하도록 설계
보통 이런 프레임워크들은 싱글 플레이에 적합하도록 설계가 되어 있다.
언리얼 네트워크 멀티플레이어 프레임워크까지 지원해서 설계가 되어있다.
그렇기 때문에 이런 GAS를 이용하면
배틀로얄과 같은 게임을
GAS를 사용하지 않던 것 보단 비교적 쉽게 제작할 수 있다.
- 데이터 기반 설계
데이터를 기반으로 동작하도록 설계
게임 제작자가 보통은 엑셀에 게임 데이터들을 정리하고
이것을 불러들이고 관리하는 기능들을 구현하는 것도 꽤나 번거로운 큰 일이다.
GAS 프레임워크는 이것을 받아 가지고
데미지 계산이라든지 레벨링에 사용할 수 있도록
지원하는 것 까지 고려되어 설계되어 있다.
또한 이 기능을 꽤나 고도화해서 사용할 수 있다는 것이 특징이다.
해당 GAS 학습용 프로젝트에서는
복잡하게 사용하지 않고 간단하게 이런 식으로 동작한다 정도만 다뤄보겠다.
- 완성도
포트나이트 게임 서비스를 통해 실효성 검증
보통 이런 프레임워크를 만들면 남이 만든 것이기 때문에
어디 문제 있지 않을까? 하는 의구심이 들기 마련이다.
이는 개발팀에서 유의해야 할 사항이고
이 의구심을 해소하고자 하려면
실제 라이브 서비스에 적용된 사례가 있는 가?에 대한 답이 있어야 한다.
이 프레임워크를 사용한 게임은 실제 포트나이트 게임 서비스에 사용이 되고 있다.
포트나이트 게임 같은 경우에는 피크 때 동접을 700만 명을 찍은 어마어마한 게임이다.
따라서 안정성 및 완성도는 보장되어 있는 것이다.
GAS FrameWork의 단점
자 완벽해 보이는 GAS의 단점이 뭘까?
바로 다음 2가지가 큰 단점이다.
- 배우는 학습 비용
구성 요소가 많아서 학습 비용이 꽤 크다.
관련 자료도 새로운 프레임 워크라 크게 없다.
기본적인 기능을 활용해서 제작할 때
최소 수십시간에서 수백시간의 시간 투자가 이루어져야 하며,
이는 오롯이 단순히 이용할 수 있는 정도에 대한 GAS
학습 비용의 순 시간이기 때문에
선뜻 배워나가기 꺼려질 수 있다.
만약 기획자 분들께서 이 시스템을 이해하고
C++를 굳이 사용하지 않더라도
블루프린트를 원하는 기능을 구현하신다고 하면
전체적인 팀의 생산성이 굉장히 높아진다.
그럼 프로그래머가 이를 이해하고 사용한다면,
굉장히 생산성이 높아질 것이다.
그런데 기본기에 대한 이해도나,
언리얼이나 게임 엔진에 대한 이해도가 전혀 없는 사람이 학습하고자 한다면
초기 학습 비용은 더욱 늘어나게 된다
- 오버헤드
작은 규모의 프로젝트에는 복잡한 구조가 오히려 부담이 될 수 있다.
너무 작은 프로젝트나 프로토 타입에 GAS를 무리하게 도입할 필요는 없다.
간단한 상태머신으로 돌릴 수 있는 프로젝트는 그냥 그렇게 돌리는 것이 편하기도 하다.
만약 GAS에 익숙해져 있는 사용자라면
후다닥 제작 가능하긴 하지만,
현재로써는 그렇지 않은 언리얼 사용자들도 많기 때문이다.
하지만 GAS로 후딱 만들어서 작은 프로젝트나 프로토 타입에 적용하면,
기획이 커졌을 때 바로 대응이 가능하다.
즉 단점은
GAS를 아는 사람도 많이 없을 뿐더러
GAS를 공부하는 데 진입 장벽도 높기 때문에
게임 개발에 유용하지만 쉽게 손이 안갈 수 있다 정도이다.
그거 말고 단점 없다.
그럼 어느 정도 게임 개발을 경험한 사람이라면
본격적으로 규모 있는 게임을 설계하고 싶은 욕심이 있을 것이다.
이 때, GAS는 굉장히 사용자에게 좋은 선택지가 될 수 있을 것이다.
- ASC
가장 첫 번째 [1,1] 위치에 있는 것이 어빌리티 시스템 컴포넌트이다.
이를 줄여서 ASC라고 부른다.
이 컴포넌트는 GAS FrameWork를
관리하고 처리하는 액터의 중앙 처리 장치라고 생각하면 된다.
GAS를 시작할 때 ASC에서부터 시작이 된다.
- Tag
그 다음으로는 현재 프로젝트 레벨에서
액터들의 상테나 행동에서 사용되는 Gameplay Tag가 있다.
- GA
게임플레이 어빌리티에서는
여기서 부터
모든 스킬, 액션들이 발동해서 시작된다고 볼 수가 있다.
- GE
Gameplay Ability 다음으로는 게임플레이 이펙트가 있다.
줄여서 GE라고 한다.
우리가 이펙트라고 하면
주로 특수효과를 생각하기 때문에
처음 접하는 분들에게는 오해가 있을 수 있다.
여기에서 이펙트는 특수효과가 아닌 영향이라는 뜻을 가진다.
그래서 전체 시스템의 구성은 게임플레이 어빌리티가 발동하면
행동에 대한 결과로 어떤 효과가 나타는 것인데,
그 때 이펙트를 사용해서 어빌리티에 대한 결과의 효과를 시스템에 알려주는
형태로 구성된다고 이해하면 된다.
- Attribute
캐릭터가 가진 스탯이라던지 어떠한 데이터 뭉치들이다.
GAS는 스탯같은 데이터를 어트리뷰트라고 이야기 한다.
이러한 다섯 가지 요소들이 뭉쳐서 게임플레이 어빌리티 시스템을 구성한다고 볼 수 있다.
게임플레이 어빌리티 시스템의 흐름
위에서 보이는 것처럼 모든 흐름의 중심에는 어빌리티 시스템 컴포넌트가 자리 잡고 있으며,
이 주위로 어트리뷰트라던지 게임플레이 어빌리티가 있다.
이 어빌리티 시스템 컴포넌트는
사실 모든 요소를 직접 제어할 수 있다.
그리고 게임플레이 태그 정보는
프로젝트 단위에서 어떤 시스템을 감싸고 있고
사용자가 어떤 로직을 전개할 때 이 태그를 사용해서
현재 상태를 기록하고 파악할 수 있게 된다.
이것들을 적절히 사용해서 게임에 필요한 다양한 기능을 구현할 수 있다.
처음부터 잘 모르고 막 사용하면
나중에 꼬여서 문제가 발생할 가능성이 높다.
그래서 효과적인 학습을 위해 정석으로 사용할 수 있는 부분만
한 번 따로 정리를 해봤다.
위 보이는 주황색의 화살표 부분이
해당 프로젝트를 진행하면서의 중요한 기본 메카니즘이라고 이해하면 된다.
이 핵심 메커니즘을 사용자가 잘 이해할 수 있도록
점진적으로 계속 공부를 진행할 수 있게 되는 것이
이번 프로젝트의 목표가 되는 것이다.
순서를 먼저 설명하자면,
모든 시스템을 관장하는 중앙 처리 장치인 어빌리티 시스템 컴포넌트를
액터에 생성을 해준다.
이 어빌리티 시스템 컴포넌트(ASC)에
사용자가 액터가 취할 액션인 어빌리티를 부여해주면 된다.
이 부여된 어빌리티(액션)이 조건에 맞으면 발동이 된다.
발동이 된다는 얘기는 어떤 캐릭터가 액션을 수행한다라고 이해하면 좋다.
이 캐릭터 액션이 발동이 된다면
액션의 종류에 따라서 주위에 영향을 끼치거나
사용자에게 영향을 끼친다.
따라서 영향, 즉 Effect의 의미는 특수효과의 의미가 아닌
영향이란 의미를 내포하는 뜻을 가리킨다.
이 이펙트가 발동이 되면 결과적으로
캐릭터의 데이터를 관리하는 Attribute에 영향을 미치게 된다.
이것을 결과적으로 캐릭터가 가지고 있는 스탯이라던지
데이터를 변동 시키게 되는 것이다.
결국 이펙트라는 것은 데이터를 변동시키는 요소이다.
그리고 사용자가 어떤 어빌리티 액션을 발동을 시킬 때,
즉 일정 시간이 경과를 필요로 할 때는 태스크라는 것을 이용해서
(예를 들어 일정 시간이 필요할 때는 애니메이션과 같이 결합된 경우를 뜻한다.)
작은 실행 단위로 쪼개어 우리가 원하는 액션을 제작할 수 있도록 설계가 되어 있다.
그리고 액션의 결과로 어떤 영향이 발동이 되면,
이 영향을 강조하기 위해서 시각적이나 청각적인 효과를 발동할 수 있다.
GAS는 이것을 Cue라고 한다.
이 기능을 Gameplay Cue라고 한다.
그래서 해당 프로젝트 이번 포스팅에서는
이러한 흐름을 사용자가 숙지할 수 있도록 여러 번 반복해서 설명한 것이다.
이러한 GAS를 이용한 프로젝트에서는
C++과 BP를 적절하게 혼용하는 것이 좋다.
GAS의 구현
C++ vs BP
- GAS의 기본 설정은 C++에서 진행되도록 구성되어 있다.
- 세밀한 제어는 오직 C++에서 가능하다.
- 게임플레이 어빌리티, 게임플레이 이펙트 및 장식 이펙트는 BP에서 작업이 용이하다
- 전체적인 GAS 시스템 설정을 C++로 작업하고,
BP를 활용해 게임 콘텐츠를 제작하는 것이 이상적이다.
C++ 프로그래밍으로 먼저 전체 과정을 직접 구현해 본 후,
블루프린트와 조합해 의존성을 최소화하는 것이 권장되는 학습 방법이다.
따라서 GAS를 사용하려면 C++를 사용할 줄 알아야한다.
이후 C++로 구현한 뒤
BP로 장식 이펙트, 게임 플레이 이펙트와 같은 것을 구현하는 것이 좋다.
프로그래머는 GAS를 활용하는 기본 시스템을 만들고
이후 BP까지 사용 가능한 개발자들이
전체적인 프레임 워크를 제작하는 것이
효율적인 제작 과정이다.
참고 사이트