2015년 11월 3일

Epic MegaJam 수상작 Guardians 개발 노트

저자: Team Blazing Badger

안녕하세요! 언리얼 엔진 4 동료 개발자 여러분! 저희는 독일 프랑크프루트에 위치한 작은 스튜디오 Blazing Badger입니다. 그리고 저희는 Epic MegaJam에 'Guardians'라는 게임을 제출하였습니다. 이 게임은 감사하게도 Eye Candy 상과 Allegorithmic 상을 수상하였습니다. 게임잼 내내 제출작을 전부 플레이한, 말그대로 게임 플레이 마라톤을 해낸 Michael Allar는 저희가 블로그에 포스팅을 하는 것을 권유하였고, 그래서 제가 여기에 글을 쓰게 되었습니다.

Guardians_!

시작!

2014년 4월에 Blazing Badger의 설립 이후, 저희는 데뷔작인 AIPD를 작업하고 있었습니다. 이 프로젝트가 완성되고 나서 Epic MegaJam대회가 개최되어 저희는 정말 기뻤습니다. 바로 창의적인 배터리를 가득 충전시킬 좋은 기회였기 때문이었습니다.

첫 날은 "거인의 어깨에 앉아서"라는 테마에 맞추는 것에 대하여 브레인스토밍이 이어졌습니다. 결국 동시에 두 가지의 결론을 내었습니다. 저희는 두 캐릭터를 소개할 것인데, 하나는 작은 잠수함이고 나머지 하나는 거대한 고래로 공생 관계로 묶인 (두 거인이 있고, 각자 자신의 길을 가는 것입니다.) 캐릭터들입니다. 또한 저희는 클래식한 게임으로 많이 치우쳤는데, 비유적으로 거인의 어깨에 앉아 있는다는 것을 의미합니다.

저희는 결국 "Tempest"와 비슷한 수중 게임을 만들게 되었습니다(Dave Theurer 원작) 이 게임은 일 주일만에 만들기에 충분할 정도로 간단하였고, 거대한 생물체를 위한 수 많은 스크린 스페이스가 사용 가능하였습니다!

기술적인 기반

단기간이었던 게임잼 프로젝트용으로 저희는 크리딧, 결과 스크린 기타 등등을 구성할 수 있도록 하는 탄탄한 기반을 만들기를 원하였습니다.

게임은 단순한 스테이트 머신을 사용하여 몇몇 상태로 나뉘어 졌습니다. 그 두 초기 스테이트는 메뉴와 게임중 스테이트로 해서 핵심적 게임플레이를 즉시 할 수 있도록 하였습니다. 나중에 저희는 크리딧 스크린과 결과 스크린을 추가하였습니다.

두 스테이트 간에 명확한 전환이 있었기 때문에, 어떤 데이터나 액터가 각 스테이트에 필요하던간에 각기 쉽게 초기화되고 정리될 수 있었습니다. 이렇게 해서 저희는 초기에 몇 판을 게임 재시작 없이도 플레이 할 수 있었습니다. 그리고 이 것이 고객들이 완성된 게임에서 원하는 것입니다.

저희는 또한 세션 데이터 구조체를 특정한 서비스 함수를 따라 퍼시스턴트 데이터 스트럭쳐로 설정하였습니다. 세션 데이터는 현재 점수처럼 "인게임 세션마다" 정보를 가지고 있습니다. 퍼시스턴트 데이터는 고득점과 같이 "남은시간" 정보를 담고 있습니다.

저희의 게임 디자이너는 데이터 스트럭쳐를 이용해서 각각 매 라운드마다 자동으로 초기화 되거나 세이브게임에 이어서 저장되는 더 많은 세션 데이터나 퍼시스턴트 데이터를 추가할 수 있었습니다.

레벨 생성기

저희의 레벨은 가상의 튜브를 형성하는 순차적으로 생성된 트랙에 기반하고 있습니다. 모든 게임플레이 액터는 이 튜브를 따라서 움직입니다. 주변 환경 지오메트리는 이 튜브 밖에 위치합니다.

게임 제작 전반에서, 저희는 초반에 순차적 레벨 생성기에 적용할 얼마나 많은 반복작업과 마감 작업을 적용할 수 있는 것인지를 몰랐습니다. 이 것은, 필요하면 내버려 둘 수도 있지만 쉽게 소모되는 것을 집어넣어야 한다는 것을 의미하였습니다. 저희는 또한 기본적인 레벨 제작이 아주 빠르게 이루어 질 수 있도록 게임 디자이너들이 아주 초기에 적군의 행동에 대한 작업을 시작할 수 있도록 했습니다.

여기에서 중요한 부분은 트랙이 바뀌어도 변하지 않게 되는 코디네이트 시스템을 정의하는 것이었습니다. 저희는 튜브의 지름과 각도를 적용하여 산출한 거리에 기반한 액터의 위치를 대표하는 시스템을 만들게 되었습니다. 이 시스템은 게임 디자이너들이 최종 트랙 레이아웃을 고려할 필요 없이 적의 행동 로직을 간단하고 일관된 코디네이트를 사용할 수 있게 하였습니다. 여기에는 매 액터 틱의 마지막에 코디네이트를 액터의 트랜스폼으로 변환하는 함수가 있습니다.

레벨 생성기의 첫 버전은 일자로 된 선만을 반환하였고, 저희는 시간이 없어서 그냥 내버려 두었습니다. 몇 가지의 실험을 해 본 뒤 저희는 몇 가지의 서로 다른 파장을 갖는 사인파 형태로 조절되는 거대한 원 모양을 만드는 것에 그치고 말았습니다. 즉, 전체적으로 튜브는 오른쪽 커브를 유지하고 로컬에서 위/아래/양 옆으로 굽이치게 됩니다.

환경 지오메트리를 놓기 위해서, 트랙은 서로 다른 길이의 조각으로 나누어 졌습니다. 모든 세그먼트는 “wall” 같이 프라이머리 환경 지오메트리가 할당되어 있습니다. 나머지 환경 지오메트리 타입은 조각을 채우는 데 사용되었습니다. 저희는 환경 타입을 추가할 시간이 시간이 없었지만, 애셋을 제작할 시간은 충분하였습니다.

플레이어 조작

플레이어 조작은 Guardians에서 그렇듯 아주 간단하고 직접적으로 시작되었습니다. 플레이어 조작 방법이 게임에 대한 느낌을 인지하는 데 아주 중요한 관계로, 저희는 몇 개의 특별한 기능을 추가하였습니다. 플레이어의 함선에는 짧은 가속과 감속이 있습니다. 함선은 회전하고 좌/우 이동을 하지만 조작을 직접 쉽게 할 수 있도록 움직이는 시각적 효과만을 보여주게 됩니다. 카메라는 플레이어의 함선이 거대한 고래 주변을 회전하는 동안 화면이 더욱 더 동적으로 보이고 느껴질 수 있도록 약간 기웁니다. 저희 팀에는 화면 쉐이크광이 한 명 있어서 화면이 인상깊은 느낌이 들도록 여기저기에 카메라 쉐이크를 추가하였습니다.

저희는 메뉴얼을 첨부하고 싶지 않았기 때문에, 간단하게 모든 게임패드 버튼이 총알을 발사하도록 설정해 두었고, 모든 방향 축을 “이동”에 연결하였습니다. 그러므로 여러분이 직감적으로 플레이 하셔도 동작하게 됩니다. 이 설정은 키보드에서도 동일합니다. 저희는 여러 개의 키보드 키에 “총알 발사”와 “이동”에 연결하여 두었습니다.

시간 제한 때문에 저희들은 게임패드와 키보드가 동일한 한 가지의 조작을 고수하도록 정하기로 하였습니다. 하지만 사람들이 처음에 게임을 플레이 하는 것을 보았을 때, 저희는 그들이 튜브의 왼쪽 상단으로 가고자 할 때, 주로 왼쪽 썸스틱을 좌측/상단 으로 움직이려고 한다는 것을 알아냈습니다. 저희는 이 문제가 터질거라고 걱정하였고, 게임 패드를 위한 추가적인 조작 방법을 만들기 위해 시간을 더 쏟았습니다.

카메라

저희의 목표들 중 카메라를 통해 성취하려는 것은 화면 중앙에서 인게임 액션을 갖도록 하는 것이었습니다. 저희는 또한 적군이 있는 화면의 부분을 가리지 않으면서도 플레이어의 함선과 거대한 동료 고래의 엄청난 크기 차이를 보여주고 싶었습니다.

저희는 인게임 카메라 설정을 돕는 작은 “툴” 을 제작하여서 아트와 디자인 요구사항 사이 최적의 위치를 찾고자 하였습니다.

저희가 멋진 카메라 설정을 찾아내었을 때, 한 가지 문제가 있었습니다. 플레이어가 고래옆에 있을 때는 (±90˚) 카메라가 “완벽”했습니다. 하지만 0이나 180도 위치에 있게 되면 플레이어 함선이 카메라에 보이지 않는 것이었습니다. 이 문제를 해결하기 위해서 저희는 플레이어가 고래로부터 갖는 각도에 따라 카메라의 최소 오프셋(CameraMinimumPositionOffset)과 최대 오프셋(CameraMaximumPositionOffset) 사이를 보간하였습니다.

최종적인 카메라 움직임은 아래와 같습니다.

블루프린트 스크립트는 아래와 같습니다. (FishAngle 은 PlayerAngle입니다)

플레이어의 서로 다른 상태를 시각적으로 표현하기 위해서 시간 상수를 가지고 아주 간단하게 만들어야 했습니다.

슬로모션 효과는 일반적인 신 텍스쳐와 찌그러진 텍스쳐 사이를 블랜딩함으로써 표현하엿습니다. 0 이나 1 값이 아닌 포스트 프로세스 값을 토글하는 방법 때문에 여러분은 자동적으로 더블 비전 효과를 얻게 됩니다.

나머지 포스트 프로세스는 비슷한 방법으로 동작합니다. 죽었을 때 회색으로 전환되고 플레이어가 트랙을 따라 진전이 있어서 자신이 있는 주변 환경에 점진적인 변화를 넌지시 주게 되면 아주 희미한 색조 값 사이에서 보간이 이루어 집니다. 저희는 여기에 관련된 작업을 더 하고 싶고 아마도 다음 번 기회가 생긴다면 여기에 더 집중하게 될 것입니다.

사용자 인터페이스

UI로 아주 간단하지만 우아한 것을 원했습니다. 매끈하고 마감이 잘 된 모습이지만 금방 만들 수 있는 것으로 말이죠.

여기에 있어 가장 중요한 양상은 어떤 폰트를 사용하고 싶은지를 결정하는 것이었는데, 왜냐하면 좋은 폰트는 특별한 설명이 필요없기도 하고, 혼자 던져 놔도 되기 때문입니다. 저희는 저희가 찾는 모든 것을 겸비한 “Geo Sans Light”라는 폰트를 찾았습니다.

이 게임은 총 합해서 세 개의 스크린을 가지고 있습니다. 메인 메뉴, 결과 창과 크레딧 창입니다. 우아한 폰트와 정보를 최소한으로 보여주는 접근 방법은 배경 씬 없이도 아주 잘 동작하였지만, 저희는 Guardians이 게임을 플레이 한 처음 그 순간에 여러분에게 좋은 인상을 주기를 원했습니다. 그래서 이를 위한 작은 메뉴용 레벨을 제작하였습니다.

처음 플레이를 하고 나서, 저희는 Guardians 에서 조준이 쉽지 않고, 특히나 트랙이 일자가 아닌 경우에 그렇다는 것을 금방 알아챘습니다. 이 문제에서 저희가 제거하게 된 것은 적군들에게 위젯 컴포넌트를 추가해서 플레이어와 일직선에 놓이게 되면 보이도록 한 것이었습니다. (약간의 범위를 인정합니다.)

효과적인 적군 디자인

저희는 세 가지의 적군을 만들기로 결정하였습니다. 모든 적군은 에너지/ 죽음 표시, 무브먼트 컴포넌트, 등록/등록취소 등의 변수들, 소환에 관련된 명령을 갖는 enemy 블루프린트를 공통된 부모로 가집니다. 이 것은 적군의 차이점 설정을 가볍게 하는 것을 가능하게 하였습니다.

적군 중 ‘drone’ 은 ‘Tempest’같은 스타일의 슈팅 게임속 일촉즉발의 게임플레이를 위해서 총알받이로 쓰입니다. 터널 벽의 경로 주변을 천천히 흘러다닙니다.

‘dodger’는 더 체력이 많고 공격을 당했을 때 자주 회전 기동을 합니다. 이렇게 해서 플레이어가 적어도 두 번은 공격을 하도록 하고 스스로 위치를 변경하도록 하였습니다.

마지막으로, 몇 초 후에 두 개로 갈라지는 ‘splitter’가 있습니다. 갈라진 조각들은 또 다시 두 개로 갈라집니다 내버려 두면 플레이어가 4개의 타겟을 공격해야 됩니다.

그리고 저희는 플레이어가 게임에서 진전이 있으면, 적군이 숫자가 많아지는 것 뿐만이 아니라 어떤 면에서 더 공격적으로 변합니다. 의도된 결과물은 플레이어에게 제약을 가해서 점수를 많이 얻지 못하도록 하는 것이었습니다. Drone의 최대 드리프트 속도가 늘어나고, Dodger는 더 빨리 돌고, Splitter는 더 빠르게 분열을 시작하게 됩니다.

단순화 된 AI

싸울 대상인 적군이 만들어 졌으므로, 저희는 적당히 이 적군이 보이기 시작하는 것을 확실히 해야 했습니다. 저희의 목표는 세 가지였는데, 스폰되는 위치가 적절히 랜덤이지만 혼란스러운 정도는 아니어야 했고, 적군의 분포가 시간에 따라 변해야 했으며, 새로운 적군이 출현하고 나서는 숫자가 증가해야 했습니다. 최종적으로 적군의 수가 플레이어을 압도해야 합니다.

스폰되는 위치에 대한 필요 조건은 저희가 각 적군을 완전히 랜덤하게 스폰되도록 해서 해결한 것은 아니지만, 대신에 몇 초 마다 새로운 ‘일반적인 스폰 위치’를 결정하였습니다. 이렇게 해서 나중에는 돌아다니느라 정신이 없겠지만 플레이어가 일정 시간동안 집중할 위치를 찾을 수 있도록 멋진 군집을 이뤄서 스폰되도록 할 수 있었습니다.

스폰 타이머는 게임이 시작된 이후로 흐른 시간에 따라 다음 적군이 스폰될 시간을 계산해 주는 아주 단순한 수식을 이용해서 만들어 졌습니다. 몇 가지 제한 사항을 둬서 스폰 타임은 ‘몇 초에 적군 하나’로 부터 ‘일 초에 적군 여럿’까지 게임 세션을 따라 흘러가도록 조절되어 있습니다.

마지막으로, 적군의 스폰시 확률은 단순히 ‘적군의 클래스’ 배열을 만들어 놓고, 시간에 따라 새로운 적군이 추가되는 게임의 진행에 맞추어 적군을 배열에 추가하는 것을 통해 구현하였습니다. 적군이 스폰될 때 마다, 배열이 섞이고 랜덤하게 이 중에서 선택을 하였습니다.

“적군 스폰 규칙 스크립트”는 게임 디자이너에 의해 만들어 졌습니다. 그들은 이 토픽에 관해 다양한 지역 컨퍼런스에서 강연을 하였습니다. 여러분이 여기에 관하여 더 알고 싶으시다면 slideshare.net에서 그들의 프리젠테이션을 열어 보시기 바랍니다.

배경음악과 음향효과

처음에는 게임을 위해 작곡을 해야 할지가 분명하지 않았습니다. 이렇다보니 적어도 배경음으로 사용할 고품질의 애셋이 필요하다는 결론에 도달하게 되었습니다. Guardians는 다섯개의 각기 다른 주파수 대역을 맡고 있는 서로 다른 반복 음향효과들을 섞어서 사용하고 있습니다. 이러한 반복 음향 효과들을 시간에 따라 순서있게 섞어서 분위기가 완전히 동일하지 않도록 하였습니다. 덧붙이자면 일 분에 두 번 재생될 수 있는 편리한 일회성 반복 음향이 재생되어 덜 반복적으로 느껴지게 됩니다.

Guardians의 나머지 음향 효과는 유료 사운드 라이브러리에서 자르고 섞어서 맞추었습니다. 저희는 운 좋게 거대한 고래가 살아있는 듯한 느낌의 음향 효과를 찾을 수 있었습니다. 저희는 상징적인 “인셉션”에서의 묵직한 뱃고동 소리를 추가하고 싶었습니다. 그래서 영화에서 사용되며 “거대 고래의 소리”에 어울리는 묵직한 뱃고동 소리를 시험해 보았습니다.

저희는 또한 리프로 재생되는 코드 생성에 기반한 간단한 업템포 일렉트로니카 장르의 게임속 음악을 작곡하였습니다. 베이스 드럼을 제외한 모든 소리가 일반적인 댄스 트랙보다 약하도록 해서 배경 음향에 더 비중을 줄 수 있도록 하였습니다. 저희는 타이틀곡/ 메뉴 트랙용 곡을 작곡할 시간이 없어서 게임을 시작했을 때 긴박감이 더 고조되고 메뉴 스크린으로 돌아왔을 때 긴장감이 풀리는 분위기가 흐르게 됩니다.

주변 환경 아트

첫 번째 단계는 컬러 팔레트와 게임의 비주얼 스타일을 고려한 분위기 보드를 만드는 것이었습니다. 이렇게 짧은 시간 동안에 가능한 많은 애셋을 만들기 위해서 저희는 게임을 간단하고 스타일 있게 만들고자 하였습니다.

저희의 주변 환경 콘셉트는 위에 사진으로 보실 수 있는데, 계획된 카메라 앵글과 가능한 애셋, 효과, 색채 조합 등의 엔진 스크린 샷입니다. 저희는 주변 환경 전체가 물고기떼와 물풀 등의 고정된 콘텐츠를 잃지 않으면서 시간에 따라 변하기를 원했습니다. 이런 방법으로 저희는 몇 애셋으로 수 많은 서로 다른 주변 환경들을 만들어 냈습니다. 슬프게도, 계획한 만큼의 애셋을 만들어 내지는 못하였고, 결국 저희는 돌과 조류, 물풀과 아주 멋진 빛줄기를 사용하였습니다.

애니메이션용으로 짧은 영상이 높이를 따라 싸인파로 애니메이션을 할 수 있는 UV로 사용되었습니다. 동일한 UV 그래디언트는 아래를 향하는 애니메이션을 마스킹 하는 데 사용되었기 때문에 짧은 영상이 기본 위치에서 덜 움직이게 됩니다. 파도 효과의 방향과 세기는 값의 조절을 쉽게 하기 위해서 머티리얼 콜렉션 파라미터를 이용하여 조절됩니다. 종합해서 매우 자명한, 아주 간단한 설정입니다.

움직임이 덜 일정하게 보이도록 하기 위해서, 텍스쳐 기반 월드를 돌아보는 기능이 추가되었습니다. 여기 위에, 랜덤한 힘 조절 애니메이션에 기반한 “PerInstanceRandom”이 추가되었는데, 레벨을 생성할 때 인스턴스화 된 스태틱 메시를 사용하기 때문입니다. 에픽에서 관대하게 제공해 준 걸 안 쓸 이유가 없죠.

거대한 고래

거인은 아주 크고 아주 오랜 기간 동안 바다를 여행한 고대 느낌의 고래같은 바다 생물이어야 했습니다. 바닷속에는 고래를 공격하는 포악한 생물체들로 가득 차 있기 때문에, 인류는 거대 고래의 멸종을 막기 위해서 유닛을 파견하였습니다.

고대 생물에 대한 설화를 그려내기 위해서, 거대 고래의 몸 전체에 빛나는 혈관이 그려졌습니다. 왜냐하면 플레이어가 고래의 머리를 축으로 회전하기 때문에, 이 부분에는 다양한 모양과 머티리얼로 흥미있는 모양을 갖도록 하였습니다. 처음에 낸 아이디어는(현재는 사용하지 않지만) 거대 고래의 입을 여는 것과 (교전 지역 공격) 고래의 빛나는 눈을 남은 체력으로 표시하는 것이었습니다.

아래는 고래에 대한 무드 보드입니다.

최종 콘셉트

고래의 큰 크기와 스크린에서 차지할 수 있는 영역 때문에, 오브젝트마다 사용하였던 버텍스 애니메이션 대신에 간단한 애니메이션용 릭을 만들기로 하였습니다.

플레이어 함선

플레이어 함선은 물속 세상에서 어울리고 캐릭터성을 부여하기 위해서 쥐가오리 모양에 기반하였습니다. 그리고 쥐가오리는 멋집니다. 컨셉트를 구체화하고 나서 거칠게 모델링 된 오브젝트가 바로 나왔습니다.

적군- 사악한 해파리 사이보그!

적군 디자인의 주된 목적은 주변에서 ‘튀어나오도록’ 하는 것이었습니다. 이 목표는 집중된 색들과 효과들에 의해서 달성되었습니다. 주변 환경은 파란색과 청록색 색감을 유지하였기 때문에 적군들은 노란색에서 빨간 색의 스펙트럼으로 선택지가 줄었고, 저희는 스크린에 올릴 색이 많지 않았습니다. 저희는 또한 해파리를 사이보그로 만들었는데, 왜냐하면 엔진에서 원하는 움직임에 따라 서로 다른 버텍스 쉐이더 애니메이션에 접근이 가능하였기 때문입니다.

결 론

Guardians는 작업하기에 아주 재미있는 프로젝트였습니다. 저희는 결과물을 아주 기쁘게 생각하는데 왜냐하면 완성된 게임처럼 느껴지기 때문입니다. 이 글을 전부 읽고 Guardians를 플레이 해 주시는 여러분께 감사를 드립니다! 저희는 향후 모든 GameJam에 참가를 할 수는 없지만, Epic Mega Jam 2016에 참가할 계획입니다!

질문이 있으신 분은 트위터 @blabadgerfb.com/BlazingBadger에 질문을 남겨 주시기 바랍니다.

화이팅!

The Blazing Badger Team