OverRapid

요약

개발범위 iOS 백엔드 전반, Lua 일부 코드, php 일부 코드
레포지터리 주소 [비공개] https://git.meu.works/ArcStar/OverRapid
레포지터리 생성 일자 2016. 09. 09..
사용한 언어 Swift, Lua, php
사용한 개발 툴 (IDE) Xcode, Visual Studio Code
활성화 된 기능
  • iCloud - Key-value storage, iCloud Documents
  • Game Center
  • In-App Purchase
  • 사용된 라이브러리
  • Fabric - Total SDK platform service.
  • Crashlytics - Collect error when app crashed.
  • 스토어 링크 Play Store: 링크
    App Store: 링크

    개요

    OverRapid는 Team ArcStar에서 출시한 체감형 모바일 리듬액션 게임입니다. 6개의 라인으로 이루어져 있는 노트형 건반리듬게임입니다. Corona 엔진을 사용하여 만들어졌으며, CoronaCards 기술을 이용하여 엔진과 플랫폼 간의 데이터 교환 부분을 개발하였습니다.

    하단 앱 내용에 들어가기에 앞서, 본 애플리케이션의 개발 파트가 iOS 백엔드 부분이라 인 게임 사진은 최대한 제외하였습니다. 또한 화면이 아닌 기능으로써 각 기능을 중심으로 서술하겠습니다. 그리고 파트 전체가 바뀐 여력이 있는 만큼, 바뀐 부분의 버전을 나누어 차이점을 서술하고자 합니다.

    앱 내용 ( 2.0.0 이후 )

    기본적으로 CoronaCards의 프로토콜로 전달받는 함수인 coronaView(_ view: CoronaView!, receiveEvent event: [AnyHashable : Any]!) -> Any! receiveEvent 함수를 통해 필요한 기능과 인자를 전달받고, 필요에 따라 그 결과를 반환하거나, sendEvent(_ event: [AnyHashable : Any]!) -> Any! sendEvent 함수를 통해 새로운 Event로 Dispatch 합니다.

    Game Center

    Android 버전은 Google Play Game Services, iOS 버전은 Game Center 를 이용하여 개발하였습니다.

    1.0.7 버전까지는 iOS도 Google Play Game Services를 이용하였으나, iOS에서의 Play Game Services 가 Deprecated 됨에 따라 게임센터로 이전하였습니다.

    Game Center 기능을 통해 지원하는 기능은 다음과 같습니다.

    • 로그인
    • 리더보드와 성과표 보기
    • 유저 정보 가져오기
    • 점수 불러오기
    • 점수 저장하기
    • 성과 해금하기

    receiveEvent 함수를 통해 넘어오는 인자 중 개발 당시 정했던 키워드로 인자와 실행해야 할 함수를 전달받습니다. 각 넘어오는 인자는 플레이어의 데이터와 범위 등을 기반으로 하여 Game Center 함수를 실행하는데 필요한 인자를 모두 포함하고 있습니다. 따라서 넘어온 인자를 처리하여 값을 반환하기만 하면 되는 비교적 간단한 작업이었습니다.

    현재 Game Center 기능을 통해 해금할 수 있는 성과는 40여개, 그리고 리더보드는 150여개 정도입니다. 이는 게임을 하는 유저들에게 활발한 경쟁심을 유도하고, 노력했던 자신의 점수에 대한 보상을 확인할 수 있는만큼 큰 도움이 된다고 생각합니다.

    iCloud Documents

    Google Play Game Services에서 지원하던 Snapshot 기능을 대체하기 위해 개발하였습니다. iCloud를 통해 지원하는 기능은 저장로드 이며, 사용자가 iCloud와 iCloud Drive 옵션이 켜져있어야 사용이 가능합니다. 이 기능의 장점이라 함은 다른 기기로 기기를 바꿨을 경우에도 게임 데이터를 동기화하여 어느 기기에서든 이어서 플레이할 수 있다는 것이 장점입니다.

    Game Center 지원 킷인 GameKit 에서 GKLocalPlayer.localPlayer() 함수로 플레이어를 불러와 iCloud Container를 통해 데이터를 저장, 로드합니다.

    In-App Purchase

    앱에서 아이템을 판매할 수 있게 해주는 중요한 기능입니다. 개발하는데 제일 난항을 많이 겪었던 부분입니다. 먼저, In-App Purchase 기능을 통해 지원하는 기능은 다음과 같습니다.

    • 인 앱 결제 생성
    • 인 앱 결제 검증 ( 영수증 검증 )
    • 구매목록 복원

    이 애플리케이션의 전반적인 작동방법과 같이, 인자를 전달받고, 전달받은 인자로 값을 처리합니다.

    인자와 함께 함수를 호출받음 -> 인앱결제 생성 -> 인앱결제 처리(API) -> 영수증 검증 -> 결과 값 반환(Dispatch)
    

    영수증 검증은 API가 지원하는 영수증을 php 코드 기반으로 이루어진 영수증 검증 서버에 json 을 만들어 보냅니다. 그리고 서버에서는 전달받은 json을 애플의 영수증 검증 URL로 보내 그 결과값을 클라이언트에 반환하는 방식으로 작동합니다.

    인앱결제를 성공함 -> 검증 서버 탐색 -> 검증 서버를 정하여 영수증을 base64로 인코딩 한 후 json을 만들어 검증 서버에 전송 -> 검증서버에서 데이터를 확인한 후 환경에 따라 다른 Apple의 URL로 영수증을 보냄 -> 결과값을 반환받고 그 결과값을 클라이언트로 전송
    

    이 작동방식은 탈옥을 한 디바이스 등의 불법결제를 막을 수 있는 방법이며, 기기 내에서 요청을 전송하지 않으므로 Hosts 변조 등을 통해 잘못된 값이 처리되는 것을 막을 수 있는 장점이 있습니다. 본인이 집에서 서버를 운영하고 있는 만큼 안정성에 문제가 의심되어 여러개의 서버를 활용하고, checkServer(_:) 함수를 이용하여 사용 가능한 서버를 먼저 탐색합니다.

    현재 소스는 다른 곳의 소스를 참고하여 만든 것이라 Notification Center 등을 활용하여 앱에 설정을 저장하는 과정을 거치지만, 이를 개선할 수 있는 방법을 생각하고 있습니다.

    UserDeafult 등에 저장이나 Notification Center를 이용하는 방법은 네이티브 앱 개발에서는 유용할 수 있으나, 엔진게임에서는 별로 효과를 얻지 못하는 것 같아 protocol 등을 새로 제작하여 개선해 나갈 예정입니다.

    앱 내용 ( 2.0.0 이전 )

    Google Play Game Services

    C++을 기반으로 Google 에서 지원하는 Play Game Services 를 이용하여 현재 Game Center 로 대체한 기능을 구현했었습니다. 다만, 이 기능들은 iOS의 버전이 업데이트됨에 따라 점점 불안정해졌고, 마지막 Play Game 을 이용하는 버전인 1.0.7은 게임이 켜지지 않거나, 점수를 업로드 하려 하면 애플리케이션이 죽고, 앱의 용량을 100MB나 증가시키는 여러 문제점이 발생하였습니다. 그래서 Game Center 로의 이주는 언제나 고민거리였습니다. 결정적으로, 구글이 iOS 버전의 지원을 포기한 이후 Game Center 버전으로 넘어가게 되었습니다.

    작동방식은 현재 사용하고 있는 작동방식과 같았지만, Google Play Game Services 를 기준으로 만들어졌던 인 게임 UI들이 현재 게임센터에서는 맞지않는 부분이 존재한다는 것 입니다.

    다음은 작동방식의 차이점입니다.

    • 로그인 방식: 현재 앱은 자동으로 실행만 하면 애플리케이션이 자동으로 로그인을 처리하지만, 이전에는 게임 엔진이 실행되기 직전, UIAlertController를 통해 로그인을 물어봤습니다. 이는 Window의 중첩을 유발함으로써 애플리케이션의 안정성을 떨어트리는 결과를 낳았습니다.
    • 유저데이터 관리 방식: 문서 상 Legacy 로 분류되는 Snapshot 기능을 이용하여 저장하였습니다. 다만, Snapshot 은 특정된 분류 기준이 없었기 때문에 저장할 데이터에 따로 기준점을 두는 등의 과정이 필요했습니다. 하지만 이전시킴으로써 데이터 관리가 좀 더 수월해졌습니다.