게임 배속 구현하기

양규빈·2024년 6월 20일

유니티

목록 보기
34/34

게임에서 배속 시스템이란?

바쁜 현대인들은 게임을 즐기고 싶지만, 시간이 부족한 경우가 많습니다.
그렇기 때문에 최대한 짧은 시간 동안 많은 효용을 얻기 위해서, 게임의 속도를 올리는 경우가 많으며, 이를 또한 게임에서 지원하는 경우가 많습니다.

예를 들면, 스타크래프트의 2배속 유즈맵, 혹은 여러 모바일 게임에서 지원하는 배속 시스템이 이에 해당합니다.

(위 사진은 제가 즐겨하는 모바일 게임에서 지원하는 배속 시스템을 캡쳐한 사진입니다. 1,2,3 배속으로 나뉘어 유저의 선택에 따라 게임을 스피디하게 즐길 수 있습니다)

이러한 배속 시스템은 특히 디펜스 류에서 많이 사용되곤 합니다.(스타크래프트 타워디펜스류)

현재 진행중인 프로젝트 역시 타워디펜스 파트가 존재하는 만큼,
이러한 배속 구현의 도입을 느꼈습니다.

구현

실제 구현 영상 링크

현재는 간단하게 1배속, 2배속 버튼을 플레이어가 클릭하면 게임의 속도를 변경하는 방식으로 구현했습니다.

게임 매니저

게임매니저는 게임의 운영을 총괄하는 매니저입니다.
그렇기 때문에, 게임의 속도 또한 게임매니저에서 관리하도록 구현하였습니다.

fGameSpeed는 실질적인 게임 스피드를 나타내는 변수이며,
게임 스피드 값의 변화는 옵저버 패턴을 통해서, 관심있는 객체들에게 변화할 때마다 알릴 수 있도록 해줍니다.
C#의 System에서 지원하는 event와 델리게이트를 이용하여, 옵저버 패턴을 구독해줍니다.

스테이지

배속이 빨라지면, 스테이지에서 배출해내는 몬스터의 생성 주기가 빨라져야합니다.
이벤트로 상태변화를 송신받으면, 해당 값을 자기 자신이 가지고 있는 gameSpeed값에 대입해줍니다.

수시로 게임매니저 싱글턴 인스턴스에 접근하여, 값을 받아오는 것보다는 옵저버패턴으로 상태 변화시에만 값을 넘겨 받아, 자기 자신의 맴버 변수에 할당하여 사용하는 편이 훨씬 효율적이기 때문입니다.

UniTask를 이용하여 몬스터 생성을 구현합니다.
기본값 5초에 배속인 gameSpeed 값을 divde하여 보정된 time값 만큼 대기 후.
몬스터를 반복하여 생성하도록 해줍니다.

PoolableObject

캐릭터 클래스, 몬스터 클래스, 타워 클래스 등등.
인게임에서 사용되는 오브젝트들은 모두 PoolableObject를 상속받습니다.

해당 클래스는, 어드레서블+오브젝트풀에서 관리되는 객체로써, 모든 인게임 캐릭터들이 공통적으로 가지는 Animaotr와 gameSpeed 값을 보유하고 있습니다.

스테이지와 마찬가지로 GameSpeed 값을 게임매니저에게 구독하여 상태변화 때마다, 값을 갱신하는 방식으로 자기 자신이 가지고 있는 float 타임값을 관리합니다.
그리고 animator의 애니메이션 스피드 또한, 타임값만큼 변동을 주도록 합니다.

Move

고려해야할 것은 이동 부분도 있습니다.
게임의 배속이 빨라지면, 몬스터의 이동 속도도 빨라져야 하기 때문에, MyGameSpeed(PoolableObject의 time값)을 곱연산하여, 이동속도를 증가시켜줍니다.

이동 AI 프로세스 자체에도 배속을 반영해줍니다.
현재는 도착지 도착 후, 공격 하기까지의 대기 시간에 배속을 반영해줍니다.

앞으로의 관리

배속 시스템은 앞으로의 게임 개발에 있어서 주기적으로 신경써야할 부분일 것입니다.

플레이어 타워의 공격 AI
몬스터의 공격 AI
던전 진입(로그라이크) 시에, 플레이어블 캐릭터의 모든 행동 AI 등등.

게임 상의 시스템에 타임값을 고려하고 개발하지 않으면, 특정 부분은 배속이지만 특정 부분은 정속인 완성도가 떨어지는 모습을 보이게 될 것이기 때문입니다.

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글