[이창신]실전 아이폰게임 개발3

일반입력 :2009/07/19 16:10

월간 마이크로소프트웨어 제공

2009년 6월 17일, 아이폰 OS 3.0이 정식 출시되면서 아이폰 OS 3.0 SDK에 관련된 비공개 조약(Non-Disclosure Agreement, NDA)이 해제됐다. 지난 시간까지 필자는 cocos2d에 대해 설명했으며, 다음 호부터 OpenGL ES로 나아가기에 앞서 특별히 아이폰 OS 3.0 SDK가 게임 개발에 가져올 변화를 이번 지면을 통해 짚어보려고 한다.

2008년 7월 아이폰 OS 2.0이 출시된 이후 근 1년간 아이폰은 닌텐도 DS와 소니 PSP에 필적하는 휴대용 게임기로 부상했다. 올해 열린 E3에서도 아이폰은 비중 있는 게임 플랫폼으로 소개됐으며, 실제로 아이폰 OS 3.0은 그런 분위기를 반영하듯 게임과 관련된 기능의 대폭 강화로 화답하고 나섰다. 특히 OpenGL ES 2.0 지원은 필자에게도 무척 의외(실은 거의 충격)로 다가왔는데, 그것도 그럴 것이 OpenGL ES 2.0은 스펙상 OpenGL ES 1.1과 호환성이 없기 때문이다.

여기서 개인적인 경험담을 잠깐 이야기하자면, 필자는 작년에 아이폰 개발을 시작하면서 OpenGL ES에도 자연스럽게 관심을 갖게 되어서 『OpenGL ES 2.0 Programming Guide』라는 책을 구입했다. 그런데, 잘 살펴보니 아이폰은 OpenGL ES 1.1만을 지원하는 것이 아닌가? 게다가 OpenGL ES 2.0은 1.1과 하위호환성마저 포기한 상태로 진화한 스펙이라는 책의 자상한 설명에 망연자실, 결국 다른 책을 또 사고야 말았다.

하지만 어째서인지 OpenGL ES 1.1 공부를 하면서 간간히 OpenGL ES 2.0 책을 보니 흥미로운 점들이 많아 보였지만 결국 그림의 떡이라고 생각했었는데, 그것이 갑자기 그림 밖으로 뛰쳐나오니 놀라지 않을 수 있겠는가?

그러나 안타깝게도 아이폰 OS 3.0의 OpenGL ES 2.0 지원은 정확히 말하면 이번에 새로 출시된 아이폰 3GS에 국한된 것이다. 자세한 이야기는 이 글의 맨 마지막 부분에서 이어보도록 하겠다.

AV Foundation

게임을 구현하다보면 그래픽만큼이나 중요한 것이 사운드 처리다. 필자도 오래전부터 맥이나 아이폰 개발을 해온 것이 아니라서(특히 C나 C++에는 익숙하지 않다), Core Audio 계열들의 프레임워크들은 생소한 만큼이나 사용하기도 꺼려졌다. 간단한 MP3 음악 하나도 게임의 배경음악(BGM)으로 재생하기 어려웠으니 말이다. 그러던 것이 AV Foundation의 등장으로 서서히 숨통이 트여 아이폰 OS 3.0에서는 매우 편리해졌다.

● 재생

MP3와 같은 잘 쓰이는 압축 음악 파일의 재생이 AVAudio Player로 손쉬워진 것은 아이폰 OS 2.2이후부터다. 아이폰 OS 3.0에서는 그런 압축 파일의 다중 재생이 가능한데, 일단 하나는 하드웨어 코덱을 쓰고, 나머지는 소프트웨어로 처리하는 방식이다. 너무 과도하게 쓰면 무리가 가겠지만, 어쨌든 다중 재생을 코코아(Objective-C) 방식으로 할 수 있다는 것만으로도 감사한 기능이다.

● 녹음

꼭 게임이 아니더라도 녹음은 마이크가 달린 아이폰(그리고 이어폰으로 지원하는 아이팟 터치 2세대)에 매우 유용한 기능이다. 새로 도입된 AVAudioRecorder는 먼저 도입된 AVAudioPlayer와 짝을 이뤄 녹음 처리를 편리하게 해줄 뿐만 아니라 다양한 옵션(녹음 음질, 파일 형식 등)도 설정할 수 있어 강력함도 더했다.

● 세션

아이폰은 기본적으로 MP3 플레이어 기능을 가지고 있는 만큼, 아이폰의 음악 기능과 애플리케이션의 음악 기능이 어떻게 조화를 이뤄야 하는가는 매우 중요한 사안이다. 필자도 게임을 만들 때 미리 플레이되는 음악이 있으면 그대로 재생되도록 해달라는 요청을 받고 실제로 구현을 시도해보니 이 (오디오) 세션의 개념이 몸으로 다가왔다. 보통 애플리케이션은 실행과 함께 기존 재생 음악은 멈추고 애플리케이션이 사운드 출력의 소유권을 갖게 되는데, 꼭 그런 세션만 필요한 것은 아니기 때문이다.

간단히 설명하면, AVAudioSession으로 <표 1>과 같은 설정이 가능하다.

따라서 기존 음악 재생 위에 게임 음악을 재생하려면 Am bient를 사용하면 된다. 이밖에도 AVAudioSession으로 오디오 입출력 판별 및 설정(스피커, 이어폰, 마이크 등)이 가능해 사용자와의 세밀한 상호작용을 할 수 있다.

Media Player

이번 아이폰 OS 3.0에서 리듬 게임 제작자들에게 가장 기쁜 소식이 바로 이 Media Player 프레임워크의 변화가 아닌가 싶다. 거두절미하고, 이제 아이폰에 들어있는 음악을 게임에서 선택하고 재생할 수 있게 되었다. 더 이상 음악을 기반으로 하는 게임이 자체 음원 공급과 관리 기능을 구현하지 않아도 된다는 뜻이기도 하다.

반면, 이 기능이 매우 강력한 이면에는 아이폰 음악 정보를 읽기(read)만 할 수 있다는 근원적인 한계도 자리 잡고 있다. 예를 들어 가사가 들어 있지 않은 음원에 가사를 넣어준다던가, 아트워크(보통 앨범 표지나 아티스트의 사진)가 없는 음원에 사용자가 원하는 그림을 넣어준다던가 하는 것은 안 된다.

앞서 언급한 녹음 기능과도 조금 문제가 있는데, 이미지의 경우 애플리케이션에서 저장할 때 아이폰 내장 애플리케이션인 ‘사진’에 저장할 수 있는 기능이 있는 반면, AVAudioRecorder로 녹음한 파일을 아이폰 음원으로 저장할 수는 없다.

물론 지금 안 되는 것뿐이지 앞으로 영원히 안 될 거라는 보장(?)은 없지만, 어쨌든 애플리케이션을 만드는 입장에서는 아이디어 실행이 기술적인 장벽으로 인해 막혀버리는 사태는 무척 애석한 것은 틀림없다.

꼭 음악 관련 게임이 아니더라도 이번 Media Player 프레임워크 강화는 무척 의미가 깊다. 레이싱 게임이나 퍼즐 게임에서도 배경 음악을 자신이 이미 즐겨 듣는 음악으로 선택할 수 있다는 점은 무척 매력적이고, 더욱이 MP3 플레이어인 아이폰이 가지는 (다른 게임기와의) 큰 차별성이기 때문이다. 따라서 게임 개발 시에 이러한 차별성의 활용을 극대화하는 전략도 필요하다 하겠다.

Store Kit

아이폰에서 대박이 난 애플리케이션의 상당수가 게임이라는 점은 게임 개발자에게 무척 고무적이지만, 실제 수익성을 놓고 봤을 때는 그만큼 고민되는 것이 작금의 상황이다.

이유인즉슨 0.99달러로 치닫는 저가 경쟁에, 한번 내려 받으면 그 이후로는 수익을 창출하기 쉽지 않은(그래서 불법 복제에 취약한) 것이 현실이기 때문이다. 물론 그런 한계를 극복하는 게임들도 나오고 있지만(시리즈물을 많이 내서 애플리케이션의 종류를 늘린다거나, 아이템을 포함한 애플리케이션을 별도로 판매한다거나), 국내외에서 이미 정착된 정액제나 유료 아이템 판매를 근본적으로 아이폰에 적용시키는 것이 이제 아이폰 OS 3.0에서 애플리케이션 내 구매(In App Purchase, 이하 IAP)로 가능해진다. Store Kit은 바로 그런 IAP를 구현하기 위한 API이다.

IAP의 상품(product)으로 등록할 수 있는 것은 다음과 같이 크게 세 가지이다.

- 소비 가능품(consumable): 게임 아이템으로 치면 약물이나 식량같이 한번 사용하고 나면 수명을 다하는 것

- 소비 불가능품(non-consumable): 게임 아이템으로 치면 무기나 마법같이 한번 취득하면 반영구적인 것

- 가입(subscription): 게임으로 치면 일정 기간 게임을 할 수 있는 등록비

얼핏 보면 매우 포괄적인데, 그렇다고 아무거나 다 되는 것은 아니고 다음과 같은 제약이 있다.

- 상품이 현물과 연결되어 있으면 안 된다. (예: 게임에서 실제 사람이 입는 티셔츠를 산다 ×)

- 상품이 해당 애플리케이션 외에서도 통용되면 안 된다. (예: A 게임의 사이버 머니를 B 게임에서 쓸 수 있다 ×)

특히 두 번째 항목은 조금 아쉬운 대목인데, IAP를 가상 화폐로 사용하는 것을 막으려는 안전장치가 아닐까 싶다. 아무튼 좋은 판이 벌어졌으니 ‘카트라이더’나 ‘아이온’ 같은 고부가가치 게임을 아이폰에서도 어서 만나 보길 기대한다.

APNS

Apple Push Notification Service는 게임의 경우 체스 게임에 적용된 사례가 대표적이다. 시간 제한 없이 턴제로 하는 게임의 경우, 상대방의 턴이 끝났을 때 알림(notification)을 받으면 무척 즉각적인 반응을 꾀할 수 있을 것이다.

기본적인 게임 연동과 더불어 최근 각광받고 있는 소셜(social) 게임과의 연계도 중요한 영역이다. 게임을 혼자 하는 것이 아닌, 친구와 함께 하는 경우 초대(invitation)라는 행위가 일어나는데, 이때 알림 기능이 유용하다. 꼭 게임 자체와 연결된 것이 아니더라도, 게임과 관련된 커뮤니케이션도 더 풍성해질 수 있다. 예를 들어 게임 아이템 거래(옥션)라던가 파티 플레이에도 얼마든지 적용할 수 있기 때문이다.

Game Kit

지금까지 게임 개발에 간접적인 연관성이 있는 프레임워크들을 살펴봤다면, 이제 본격적인 게임 관련 기술들로 나아가보려 한다.

아이폰 게임들이 성공하면서 가장 비교가 되는 플랫폼은 역시 같은 터치 인터페이스를 지닌 닌텐도 DS(이하 NDS)이다. 아이폰의 하드웨어 스펙은 대체로 NDS를 압도하기에 충분한데, 유독 부족한 부분이 바로 네트워크, 특히 애드혹(ad-hoc) 쪽이다.

NDS의 경우 DS통신이라고 해서, 보통 1대가 호스트가 되고 나머지(‘마리오 카트’의 경우 총 8대)가 게스트가 되는 애드혹 WiFi 모드를 사용할 수 있다. 이는 기본적으로 NDS가 애드혹 네트워크를 생성할 수 있기 때문이다.

반면, 아이폰의 경우 애드혹 네트워크를 생성하는 기능을 제공하지 않아, 다중 사용자 게임의 경우 어찌되었든 간에 무선 네트워크가 있어야 (즉 무선 AP가 있어야) 되므로 게임 환경에 제약이 있다(예를 들어 지하철에서는 멀티 플레이를 못하는 것이다).

필자도 전부터 이런 아이폰의 문제가 근본적으로 해결되기를 바래왔었는데, 이번 Game Kit의 도입으로 어느 정도는 해결이 되었다. 그런데 필자가 ‘어느 정도’라고 표현한 데에는, 아직 NDS나 Xbox 360 수준은 아니기 때문이다.

Game Kit에서 도입한 P2P 기능은, 현재 제공되는 수준으로는 딱 2대, 그것도 아이폰 3G 이상 아이팟 터치 2세대 이상에서만 가능하다. 하드웨어적으로 블루투스(2.0)를 이용하고 있으므로, 광대역의 데이터 교류에 제약이 있는 것도 사실이다. 아무튼 없었던 것보다는 나으니 2명이서 하는 게임 개발에는 매우 좋다. 우리나라에서는 ‘맞고’나 ‘장기’ 등이 적용되면 멋질 것이다.

한편, 3대 이상 동시 접속이 안 된다는 것은 참 아쉽다. 요새 나오는 콘솔 게임들도 3~4인을 지원하는 경우가 많고, 축구나 레이싱 게임 같은 것은 더 많은 사람들이 즐기기에도 문제가 없기에, 그 아쉬움은 더하다. 또 하나, P2P라 하더라도 근거리 블루투스가 아닌 일반 인터넷 연결을 지원하지 않는 것도 안타깝다. API 문서를 보면 그 가능성을 열어 두었지만(GKPeer PickerController의 설정에 쓰이는 GKPeerPickerCon nectionTypeOnline이 바로 그것이다), 실제 구현은 블루투스로만 되어 있다.

여기에 견줄만한 것이 바로 Xbox 360의 XNA 프레임워크이다. Xbox 360도 아이폰처럼 일반 개발자가 게임을 개발해 판매할 수 있는데(현재는 Community Games라고 불린다), 이런 게임의 개발에 쓰이는 것이 XNA 프레임워크이다. 이 프레임워크를 보면 인터넷 네트워크 기반의 통신 프레임워크가 제공되어 게임 자체의 별도 구현 없이 온라인 멀티 플레이를 구현할 수 있다(즉 Xbox Live의 네트워크와 연동하고 있는 셈이다).

문제는 애플과 아이폰의 경우 Xbox Live와 같은 인프라가 없다는 점이다. 애플이 아이폰에 게임기로서의 방점을 크게 찍음에 따라 그런 인프라가 생길지도 모르겠다. 만일 그렇게 된다면, 3명 이상 멀티 플레이가 되는 인터넷 온라인 게임의 개발 비용이 무척 절감될 것이다.

OpenGL ES 2.0

서론에서 잠깐 꺼내었던 OpenGL ES 2.0을 이어보자. OpenGL ES 2.0은 아이폰 3GS(그리고 이후에 나올 아이폰과 아이팟 터치)에서만 가능하다. 그렇다면 첫 번째, 아이폰 3GS 이후 기종에서 OpenGL ES 1.1은 되지 않는가? 그렇지는 않다. 당연히 애플리케이션의 호환성을 위해 그런 무모한 선택을 했을 리는 없지만, 내부를 들여다보면 3D 그래픽 프로세서의 변경이 있었다.

- PowerVR SGX는 OpenGL ES 2.0과 1.1을 모두 지원하는 프로세서이다. 아이폰 3GS부터 채택된다.

- PowerVR MBX는 OpenGL ES 1.1을 지원하는 프로세서이다. 아이폰 3GS 이전 기기에 채택되었다.

(참고로 SDK에 들어있는 시뮬레이터는 맥 위에서 돌아가는 것이므로 둘 다 지원한다.)

이렇다 보니, 만약 OpenGL ES 2.0 기반으로 게임을 개발했다면, 그 게임은 아이폰 3GS이상에서만 돌아간다는 뜻이다. 더 많은 플랫폼에서 실행되기를 바란다면 OpenGL ES 1.1 기반으로 작성해야겠지만, 사실상 PC에서는 보편적인 OpenGL 2.0(실은 PC 쪽은 3.1이 올해 나온 판이다)으로부터 나온 OpenGL ES 2.0은 그만큼 더 많은 잠재성을 내포하기 때문이다.

필자가 OpenGL ES 1.1을 알아보다가 깜짝 놀란 것은, 2004년 처음 등장했으니 벌써 5년 된 기술이 아이폰에 채택되었다는 사실이다. 그래서 다른 플랫폼들도 둘러보니, 안드로이드와 심비안은 ‘1.0+알파(α)’ 수준으로 대동소이했다. 이런 점에서도 아이폰 OS 3.0(그리고 아이폰 3GS)는 무척 발 빠는 행보를 하는 셈이다(참고로 MS 윈도우 모바일 7도 OpenGL ES 2.0 지원을 예정하고 있다고 한다).

■3.0, 게임은 시작됐다

게임 시장은 뜨겁다. 특히 불황의 여파로 게임은 더더욱 사람들의 스트레스를 저렴하게 해소해주는 탈출의 창구로 각광받고 있다. 그리고 게임 시장에는 전통의 강자들이 있다. 닌텐도, 소니, MS는 그 동안 이 시장을 차지하기 위해 엄청난 투자와 노력을 해왔다. 그런데, 휴대전화로 시작한, 그리고 MP3 플레이어로 시작한 아이폰과 아이팟 터치가 난데없이, 하지만 소리 없이 게임 시장을 차지해가고 있다.

개발자에게는 역시나 ‘기회’라고 밖에는 설명할 수 없는 것이다. 그 기회는 단순히 아이폰용 게임을 만들어 앱 스토어 올리고 그래서 돈을 버는 그런 경험뿐 만은 아니다. NDS용 게임, PSP용 게임, Xbox 360용 게임(우리나라에서는 아직 안 된다)을 누구나 만들어 자유롭게 즐기고 팔 수 없는 그 짙은 어두움이 아이폰의 빛을 더 밝게 해주는 것이 아닐까.

그리고 그동안 SI와 웹, 그리고 서버에 국한되어 있던 우리나라 개발업계의 스펙트럼을 다양하게 해주는 것은 이미 시작되었다(한 애플 관련 커뮤니티에서 개발자들의 맥 사용이 늘어난다는 글을 봤었으니 말이다). 그럼 다음 시간부터는 OpenGL ES와 함께 독자들을 만나보려 한다.

[필자소개]

이창신 iasandcb@gmail.com, http://ias.myid. net|현재 모바일 애플리케이션 개발에 몰두하고 있다.