Uppercut Games는 2011년에 전 Irrational Games Australia 개발자들에 의해 세워졌습니다. 저희는 전에 EPOCH, EPOCH 2등 다수의 언리얼 엔진 3 모바일 게임을 앱스토어에 출시한 바 있습니다. 금년 말에는 첫 언리얼 엔진 4 타이틀인 Submerged를 Steam, PS4, XBOX One 용으로 출시할 것입니다.
언리얼 엔진 4를 이용해 PC와 콘솔로 출시하고 난 후, 저희는 조금 더 가볍고 빠른 게임을 만들고 싶었습니다. 그것은 바로 모바일 입니다! 여러가지 조사를 하였는데 언리얼 엔진 4.9버전에 저희가 필요로 하는 기능이 전부 들어가 있었기 때문에 App Store에 얼마 전 출시한 Danger Dogers를 제작할 수 있었습니다. 아래에 이어서 콘셉트부터 실제 완성까지 얼마나 빠르게 제작할 수 있었는지 보여드리겠습니다.
더 짧아진 개발 사이클
Damger Dodgers 개발은 총 6개월이 소요되었습니다. 프로토타이핑 2개월, 개발 3개월, 버그 수정+튜닝+테스트 1개월 입니다. 풀타임 4명 + 파트타임 2명 총 여섯 명의 개발자가 참여하였습니다.
머티리얼, 머티리얼, 머티리얼!!!!
언리얼 엔진 3과 개발 측면에서 나는 차이는 머티리얼을 더 자유롭게 창조적으로 사용할 수 있다는 것이었습니다. 하지만, 이는 양날의 검으로 iPad2 부터 신형 iPad Pro까지 iOS 디바이스들 간 엄청난 성능 차이를 감안해야 함을 의미합니다. 퍼포먼스의 간극은 특히 메탈 지원 여부에서 극명히 드러납니다.
단일한 색상,러프니스,노멀맵을 갖는 아주 단순한 쉐이더 (위 사진)의 경우 10fps 이하가 나왔습니다. (또는 iPad2와 같은 구형 모델에서요) 저희는 잘 보이지 않는 많은 쉐이더의 ‘Fully Rough’를 최적화 시켰습니다. 게임에서 클레이메이션 느낌을 사용하는 관계로 이 최적화 방법이 잘 들었습니다.
확장성
저희는 머티리얼에 대한 확장성이 제한적인 4.9 버전에서 DangerDodger를 만들기 시작했습니다. 모든 머티리얼의 그래프에 수동으로 노드를 추가해서 LOD를 조절해야 했지만, 4.10버전부터는 새로운 iOS ES2 품질 프리셋 기능을 사용할 수 있었습니다.
이 시스템에는 여러분이 지정하는 디바이스마다 저품질로 랜더링하게 할 수 있습니다. 프리셋을 설정하고 디바이스 프로파일에 한 줄 추가하는게 전부일 정도로 간단합니다. 출시를 못 할 정도였는데, 바로 10프레임 상승하는 것을 목격할 수 있었습니다.
디바이스 프로파일의 편집과 관리를 위한 새로운 UI는 수 많은 iOS 디바이스의 퍼포먼스를 테스트 하고 관리하는 데 많은 도움이 되었습니다. 텍스트 에디터에서 말고 UI를 통해 직접 편집할 수 있어서 많은 시간을 절약할 수 있었습니다.
모바일 테스트
프로젝트를 다수의 디바이스로 한번에 디플로이 하는 것은 테스트하는 데 굉장한 도움이 되었습니다. 추가 전원 공급되는 USB허브에 8대의 디바이스를 연결해서 새로운 빌드를 동시에 인스톨할 수 있었고, 테스트시 효율성에 날개가 달렸습니다.
Danger Dodgers가 돌아가야 하는 다양한 디바이스들
버텍스 쉐이더
Danger Dodgers는 몇 가지의 버텍스 쉐이더로 배경에 좀 더 생기를 줍니다. 퍼포먼스에는 영향을 조금만 주면서도 게임 비주얼은 확 바꾸었습니다.
첫 번째 쉐이더는 "squash and stretch"인데, 이름 그대로 짓누르고 늘려버립니다. 운석이 바닥에 떨어질 때 늘려서 짓누릅니다. 고무공같이 잘 튀는 느낌을 주는 효과입니다. 아래는 머티리얼 노드의 모습입니다.
저는 여기에서 약간 꼼수를 사용하였습니다. 버텍스를 누른 다음 원형으로 늘리는 것으로 추정하였죠. 운 좋게도 떨어지는 운석들이 원형이었어요 대박! 물체의 피벗이 중심에 있다는 것으로 추정하였는데 이 또한 들어맞았습니다. 예압! 이 두 가지 추정이 첫 번째 그래프 계산에서 각 버텍스를 중심으로부터 계산하고 Z방향 값만을 가져다가 각 버텍스의 XY 평면으로부터 운석까지의 거리로 사용하였습니다. 이 값을 오브젝트의 반지름으로 나누고 stretch factor, 버텍스 z 오프셋과 곱하면 -1과 1 사이의 값이 나옵니다. 그럼, 원론적으로 XY 평면에서 더 멀어질 수록 더 많이 늘어나고 짓눌려지게 됩니다.
각 운석의 stretch/squash를 조정하기 위해 스폰될 때 마다 새로운 다이나믹 머티리얼을 지정하였습니다. 그리고 나서 FallingObjectStretch값을 각 틱마다 변경시켰습니다. 운석이 떨어지는 동안은 FallingObjectStretch의 값을 max stretch로 맞추었는데, 이렇게 하면 떨어지는 동안 최대 값이 점점 커집니다. 그리고 바닥에 부딪힐 때 max stretch 값을 elastic easing 함수를 이용해서 고무 공처럼 줄어들게 합니다. 이 때 사용한 ease 함수는 Robert Penner의 ease 함수입니다.
게임 영상:
나머지 한 개의 버텍스 효과는 두 개의 서로 다른 효과를 하나의 머티리얼에 섞어서 레벨 위 대부분의 오브젝트에 적용할 수 있습니다. 좀 큰 운석이 오브젝트 위로 떨어지면 맞은 오브젝트가 하늘로 튀어 올라가고 다시 바닥에 튕깁니다. 머티리얼에서 튕기는 부분의 표현은 아래와 같습니다.
튕기기는 짓누르고 늘리기처럼 오브젝트를 변형시키지는 않습니다. 여기서는 상대적인 액터의 위치로부터 충돌 위치의 Z 오프셋을 만들어 낼 뿐입니다. 스피어 마스크는 충돌 위치로 부터 꽤 근사한 감쇄 값을 반환해 줍니다. 이어서 LandedObjectForce가 코드 속 이즈 함수에 의해서 처리가 됩니다. 이 효과와의 차이점은 오브젝트마다 따로 적용되는 것이 아니라는 점입니다. 머티리얼 파라미터 콜렉션 값에 의해 모든 오브젝트가 영향을 받습니다. (일종의 글로벌 쉐이더 파라미터 입니다.) 이 방법이 갖는 제한사항은 한 번에 한 개의 운석만 튕김 효과를 받도록 할 수 있다는 것입니다. 저희는 이 효과를 아주 큰 운석용으로 제한하였는데, 왜냐하면 아주 큰 운석이 아니면 효과가 잘 안 보였기 때문입니다.
Danger Dodgers에는 폭발하는 특수한 운석이 있습니다. 폭발할 때 플레이어를 바깥쪽으로 밀어버립니다. 커다란 운석이 폭발할 때는 “잔 물결” 뒤틀림 효과를 나타냅니다. 아래는 잔 물결 효과 머티리얼의 일부입니다.
여기에서의 기본 아이디어는 월드에서 스피어 마스크를 움직이는 것입니다. 저희는 시간에 따른 ExplosionRadius를 키우고 스피어 마스크의 중심을 이동시키도 버티스를 ExplosionLocation으로부터 상대적인 위치에 기반하여 마스킹 아웃합니다. ExplosionRadius가 스피어 마스크의 반지름을 증가시키면 버티스가 위로 밀려 올려지고 스피어가 움직이면 아래로 내려오게 됩니다. 음... 내용이 이해가 잘 되었으면 하네요. 아래는 커다란 운석이 떨어질 때 튕김 및 잔물결 효과에 대한 영상입니다.
잔 물결 효과는 튕기효과와 같이 동시에 한 개의 효과만 나타난다는 제한을 갖고 있습니다.
각 노드는 Add 노드를 거쳐서 튕겨나가는 물체 주변에 잔 물결 효과를 줍니다.
이 내용이 익숙하지 않은 분들도 있겠지만, Danger Dodgers 게임 개발 과정을 재미있게 봐 주셨으면 해요.
Danger Dodgers 는 App Store에서 다운로드 가능합니다., 무료로 다운로드 받으시고 여러분의 의견을 들려주세요!
Andrew @UppercutAJ | Ryan @Luachunk | Uppercut Games