Unreal Match 3은 저희가 금년 4월에 진행하였던 에픽 프라이데이 프로젝트에서 iOS와 안드로이드로 제작한 게임입니다. 이 게임은 에픽 내에서 트레이닝용 리소스를 집중적으로 제작하는 작은 그룹인 학습 리소스 팀의 몇 명이 주로 제작하였습니다.
많은 수의 작은 학습 리소스 샘플들은 블루프린트 전용입니다. 그리고 아주 높은 가치를 가지고 있다는 것을 알지만, 저희는 더 많은 c++ 샘플들로 채워나가야 한다고 보고 있습니다. 브레인스토밍을 하는 중에 Tom Looman이 c++ 서바이벌 게임 아이디어를 내었고 저희는 게임의 스타일과 엔진의 기능을 보여주는 서로 다른 시각으로 접근하고자 하였습니다. 3개 맞추기(Match 3) 게임과 같은 것을 사용한다는 것은 저희가 사용할 수 있는, 어떻게 언리얼 엔진에 통합시키는지를 보여주는 데 집중할 수 있는 규칙을 만들었다는 것을 의미합니다.
저희의 초기 브레인스토밍에서 나온 리스트에는 AI와 데이터 테이블 같이 초기 샘플에 포함되지 않은 몇 가지의 기능이 들어 있었습니다. 저희는 이를 살아있는 샘플로 의도하여 만들었지만, 시간이 지나면서 새로운 기능이 추가되었습니다. 이런 기능들은 저희가 만든 다른 샘플처럼 되고 말 것입니다.
Unreal Match 3 코드 짜기
Richard와 저는 프로젝트의 출발점에 다가갔습니다. 저희는 저의 원래 프로토타입에 코드를 추가하기 시작하였습니다. 저희가 코드를 추가하게 되자, 세 가지의 규칙이 붙게 되었습니다.
첫 번째는 코드를 가능하면 포괄적으로 작성하라는 것이었습니다. 제가 만든 원래 격자 코드는 직사각형 격자를 예상하여 만들어 진 것이고 저희는 3개 맞추기 모드만을 필요로 하였습니다. 최종적으로 만들어진 Unreal Match 3 게임 코드는 직사각형이 아닌 격자로 설정할 것인지, 플레이어들에게 4, 5, 6개 또는 그 이상을 맞춰야 없어지도록 설정할 것인지 등을 파라미터로 넣을 수 있습니다. 결국 샘플에서 삭제하였지만 개발과정 중에 저희는 심지어 멀티플레이어 지원까지 고려해 보았습니다.
저희가 결정한 나머지 두 개의 코드 디자인 방향은 언리얼 엔진 안에서 객체에 기반한 프로그래밍이었습니다. 저희는 Game Instance, Game Mode, Player Controller 등의 프레임워크 클래스들을 이들에 맞게 사용하고자 하였습니다. 저희 Game Instance 클래스는 Game Mode가 지속적으로 3개가 맞았는지를 검사, 남은 시간 계산 등의 작업을 하는 동안에 전체 게임을 저장할 수 있고, 모바일 서비스에 정보를 보낼 수 있습니다. 저희는 물론 나중에 아트 부분은 그냥 넘어갔지만, 디자이너들이 블루프린트로 가져오고자 하는 것이 무엇인가를 생각하며 이러한 c++ 클래스를 작성하였습니다. 저희는 다시 돌아와서 블루프린트 API를 더 확장하였습니다.
프로젝트에서 코드 내/외를 넘나들며 2개월가량 작업을 한 뒤, 저희는 학습 샘플에서 리소스를 가져오고 마켓플레이스 무료 팩과 함께 아트를 추가해서 완성하기 위해 게임을 더 상세하게 만들었습니다.
HUD와 랜드스케이프 아트가 부족합니다. 폭탄 대신에 박스를 넣어두었습니다.
아트 제작 (+그 외)
팀을 늘려가던 때였습니다. 모두가 그랬듯이 프로젝트의 막바지에 저희는 여섯 명의 사람이 Unreal Match 3 파트 타임을 거의 6개월 동안 하고 있었습니다. 저희의 아티스트인 Mike는 게임에 필요한 새로운 텍스쳐를 몇 일 동안 만들었고 오디오 엔지니어인 Joey는 이틀 주기로 굉장한 사운드 이펙트를 만들어 주었습니다. 아트가 프로젝트를 좀 더 진짜같은 게임의 느낌으로 변화시키는 것을 지켜보는 것은 참으로 놀라운 일입니다.
팀의 덩치가 커지자 저희는 저희가 게임 로직을 몇 가지의 c++ 클래스로 만들어 낸 것에 대해 기뻐했습니다. (+ 다수의 블루프린트) 예를 들어, Wes는 Bomb Bar 위젯 블루프린트를 작업하는 동안 Alan은 서로 다른 종류의 폭발 효과를 제작하였고 저희는 각자가 확인을 위해 서로의 작업을 중단시키는 일이 거의 없었습니다.
여기 아트와 디자인 방면에서 상속과 클래스 분해 설정에 대해 어떻게 저희가 목표를 설정하였는가를 보여드릴 두 개의 예시가 있습니다.
- c++에서 저희의 베이스 타일 클래스는 폭발성인지 여부를 저장, 타일이 떨어질 때 애니메이션, 그리고 선택되었을 때 게임 그리드에 해당 결과를 반환하도록 하는 것 들을 다룰 수 있습니다. 블루프린트 타일 클래스는 여기서부터 상속받았고 떠오르는 점수 표시같은 기본 효과가 추가되어 있습니다. 마지막으로 각각의 특별한 시각 효과가 추가된 폭탄, 보석, 벽돌 블루프린트 클래스가 있습니다. 이 방법을 통해서 게임의 기본적인 룰이나 자주 일어나는 이벤트(타일 애니메이션 등) 들을 c++로 처리하는 동안에 시각적 또는 청각적 효과가 블루프린트에서 주로 다루어집니다.
- 저희는 블루프린트 네이티브 이벤트와 블루프린트 임플멘터블 이벤트를 프로젝트를 통틀어 사용하였습니다. 예를 들어, 대부분의 오디오 설정이 끝났을 때, Joey가 타일이 떨어졌을 때의 음향효과를 만들고 싶다고 하였습니다. 저는 코드에서 타일이 바닥에 떨어졌을 때 호출되는 블루프린트 임플멘터블 이벤트를 만들었고, 그는 아주 빠르게 블루프린트로 효과를 만들어서 테스트를 할 수 있었습니다.
Unreal Match 3의 디자인과 비주얼 부분에서, 저희는 업적, 리더보드, 광고, 인앱결제 등의 모바일 서비스들을 추가하였습니다. 저희는 또한 다양한 모바일 디바이스에서 이를 테스트 하기 시작하였습니다.
이 분야는 약간의 흥미와 어려운 질문들을 던져 주었습니다. 저희는 인앱결제 부분에서 게임플레이의 흐름에 영향을 주지 않도록 하는 최종 프로젝트를 보여주고 싶었기 때문에 레벨의 겉모습을 뒤집고 말았습니다. 악몽같은 스킨 작업은 지금은 제가 제일 좋아하는 부분이 되었습니다. 어쨌든 이 과정을 통해 서로 다른 아트와 오디오가 게임의 전체적인 느낌을 바꾼다는 것을 진지하게 보여주었습니다.
리더보드와 업적에 저희는 원래 권한을 갖는 온라인 서비스를 소유하고 있었고, 게임 내 최대 점수 데이터의 보안을 최고로 유지해야 하는 설정이 가장 이상적이었습니다. 하지만, 여러 차례의 토론 끝에, 저희는 로컬과 온라인 시스템을 오고가면서 오프라인플레이를 하는 유저들이 얻었던 최고득점을 업로드 할 수 있도록 열어두는 쪽을 선택하게 되었습니다.
결국, 모바일의 일선에서 저는 저희가 다양한 디바이스를 통틀어 테스트를 할 수 있게 되어 전에는 예상할 수 없었던 문제점들을 밝혀낼 수 있었다는 점에서 정말 기쁩니다. 저희는 넓은 범위의 디바이스들에서 가능한 높은 성능을 내기 위해 게임의 겉모습을 희생하지 않고 디바이스 프로파일을 아주 비중있게 사용하였습니다.
잘된 점
제가 참가한 Unreal Match 3은 아주 놀라운 프로젝트였고, 저는 언리얼 엔진 사용자들이 학습 도구로 유용하게 사용하기를 바랍니다. 모바일 샘플로, c++/블루프린트 영역으로 나뉘어 있고, 이벤트 주도적인 UI와, paper2D 설정은 다른 많은 프로젝트에 응용될 수 있을 것입니다.
- 저희는 저희가 활용할 수 있었던 것을 사용하였습니다. 그리고 프로젝트를 팀이 가지고 있는 기술에 맞추었습니다. 프로그래밍 측면에 힘을 더 싣는 동안 저는 프로젝트를 기획하면서 2D 게임 스타일에 대해서 배우게 되었고 거기에서 나머지도 배우게 되었습니다. 저희가 작은 팀으로 작업을 한 관계로 목표를 낮고 달성 가능하게 잡은 것이 장기적으로 완성해 나갈 수 있는 데 도움을 주었습니다.
- 완성하기까지 모두가 한 발 나아가야 하였다는 점에서 저희는 Unreal Match 3을 한동안 장난으로 "stone soup project"라고 불러왔습니다. 학습 리소스 팀은 주된 작업 팀이지만, 저희는 사내 아트, 사운드, 테스트 팀들과 협업을 하였고, 이는 정말 멋진 경험이었습니다.
- 게임을 만들며, 저희는 라이브스트림에 출연하였고 문서를 작성하여 UI 디자인으로부터 포스 피드백까지 프로젝트 설정에 대해서 설명하였습니다.
- 여기에 덧붙여, 이렇게 완성된 프로젝트를 만들어 나가는 것은 개발을 막는 장애요소와 어떻게 두 가지의 새로운 기능을 만들어 나가는지에 대한 가장 좋은 길을 찾는 것을 도와 주었습니다. 저희는 이러한 가르침을 앞으로 만들 다른 수 많은 학습 리소스들에 포함시킬 것입니다.
- 저는 Wes의 명언을 좋아합니다. 얼굴에 철판을 깔고 인용을 해 보자면, "우리에게 있어 이번 프로젝트 또한 배움의 한 과정이었습니다. 우리 중 누구도 태어나서부터 언리얼 엔진 4 전문가인 사람은 없으며, 우리 또한 여러분들처럼 매일 매일 더 배워 나갑니다. 이 프로젝트를 제작하는 것은 엔진을 더 겪어볼 수 있게 하였고 프로세스와 파이프라인에서 이미 발전시키고 있었던 부분들을 알게 하였습니다. 학습에 있어 가장 좋은 방법은 뭔가를 만들 계획을 세우고, 직접 만들며 필요한 것을 배우는 것이죠!"
- 모두가 프로젝트를 도울 수 있을 때 협력하여 주었습니다. 저희는 이들의 주요 업무와는 무관하게 각자의 역할을 정했고, 이 때문에 가끔 문제가 터지기는 했지만, 팀에게 주인 정신을 프로젝트 전반에서 가져다 주었습니다.
배운 점
이 학습 리소스가 언리얼 엔진 커뮤니티를 위한 것이라고 해도, 저희 또한 제작하며 많은 것을 배웠습니다.
- 왜냐하면 저희는 프로젝트로 들어가는 역할을 정하지 않았는데, 디자인에 대한 결정, 아트 스타일에 대한 질문, 기타 다른 토론등을 할 때 가끔 어렵게 되는 원인이었습니다. 모두가 주는 의견이 다 좋았지만, 가끔 결정적인 선택이 프로젝트를 돌아가게 하는 데 필요했습니다. 게임 디자인 문서가 여기에 많은 도움이 되었습니다. 저희가 한 쪽에서 가르치는 것에 매진하는 동안 전반적인 게임 플레이의 세부 사항에 대한 계획을 사용할 수도 있었을 것입니다.
- 저희가 아주 초기에 게임을 플레이 가능한 상태로 만들 당시, shipping 버전을 만들 때가 가까워짐에 따라 최종적인 버그 수정에 따른 마지막 (커다란) 부담감이 몰려오면서 작은 열정이 끓어올랐습니다. 분명 이 게임이나 팀은 특별한 것이 아니고, shipping에 단지 "몇 가지 작업만 남았을 뿐이라는 것을" 명심해야 하는데 말이죠.
- UI 스케일링은 저희가 수정과 테스트를 하는 데 아주 많은 시간을 들인 부분입니다. 이렇게 된 이유 중 일부는 일반적인 수정을 한 뒤 이를 각 디바이스로 좁혀나가는 방식이 아닌 각 디바이스마다 차이를 두었기 때문이었습니다. 최적화와 같이 UI 스케일링은 (그리고 일반적으로 디바이스 전용 수정사항) 일반적인 부분을 먼저 수정하고 각 디바이스로 좁혀나가고, 작은 부분부터 시작해야 하는 분야였습니다.
- 많은 수의 타일과 UI 텍스쳐를 만든 아티스트인 Mike는 다른 프로젝트를 하느라 매우 바빴습니다. 저희가 시간이 더 있었다면 작업을 더 하였을 것이지만, 다른 방법을 찾지 못하고 그냥 아트를 사용하고 말았습니다. 여기에서 배운 주요한 것은 팀 외부와 협업을 할 때에는 커뮤니케이션이 핵심이라는 것인데, 왜냐하면 다른 팀원이 여러분 팀의 속마음을 항상 알아주지는 않을 것이기 때문입니다.
Unreal Match 3 기타 숫자들
- 샘플 QA에 의해 플레이 된 게임 수 : 1,979
- 비공식 QA/Unreal Match 3 팬클럽에서 플레이한 게임 수 : 101,979
- 개발 중에 먹은 도넛 모양의 케잌 수 : 20 (4개는 글루텐 프리)
- 전반적으로 가장 인기있었던 대전 모드 : 2개 맞추기
저희가 여러분들께 드리기 위해 즐겁게 만든 만큼 여러분들께서 즐겨 주시기를 바랍니다. 저희가 큰 샘플을 많은 문서와 함께 배포하는 것은 처음이고, 게임도 재미있습니다!
학습 탭과 구글 플레이에서 다운로드 받아 보세요! 그리고 곧 iOS 앱스토어에서도 만나보실 수 있습니다. 또한 포럼에서 여러분의 의견을 들려 주시기 바랍니다. 감사합니다.