カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

swift2 + spriteKit のGameCenter対応まとめ

スポンサードリンク

走れ、勇者かっぱ!

走れ、勇者かっぱ!

  • Naoya Ito
  • Games
  • Free

f:id:InvokeTwoA:20151009145746p:plain「ついにカッパのアプリがGameCenter対応を!」
f:id:InvokeTwoA:20151023183618p:plain「やっと、世界と繋がった……(とか言ってみたくなる)」

まずはiTunes Connect で Game Center の機能を on にする

f:id:InvokeTwoA:20151208014445p:plain

iTunes Connect での操作は公式ドキュメント見るのが一番
https://developer.apple.com/jp/documentation/iTunesConnectGameCenter_Guide.pdf

leader board の作成

上部の機能タブをクリック-> Game Center

対応するアプリが所属するグループを設定。
特に複数アプリで共通のグループを使用とかじゃない限り、グループ名はなんでも良い。

Leaderboardは App の Game Center プレイヤー全員のトップスコアを表示するためのものです。Leaderboardは配信中の App バージョンでは削除できません。

  • Leaderboardタイプの選択 -> シングル
  • 各種項目を埋めていく

今回は下記のIDで登録

Leaderboard ID grp.hashire.kappa

達成項目の作成

  • 512*512の画像を用意する必要あり
  • 今回は深くは触れないのでまた今度まとめ

Xcode でGame Center の設定を on に

f:id:InvokeTwoA:20151208032248p:plain

これでほぼ自動で対応してくれる。
チェックマークが付いてない項目があったら下にある Fix issue のボタンを押せば良い。

プログラムをいじる

  • AppDelegate.swift を修正
import GameKit

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Game Center 対応
        let localPlayer = GKLocalPlayer.localPlayer()
        localPlayer.authenticateHandler = {(loginVC, error) -> Void in
            if GKLocalPlayer.localPlayer().authenticated {
                print("game center authenticated")
            } else if loginVC != nil {
                print("game center sign in.")
                self.window?.rootViewController?.presentViewController(loginVC!, animated: true, completion: nil)
            } else {
                if error != nil {
                    print("error : \(error!.code)  ( \(error!.description) )")
                }
            }
        }

        return true
    }

スコア送信、スコア読み込み用の関数を定義

  • 今回は自分は GameBaseScene.swift クラスに実装
import GameKit
class GameBaseScene: BaseScene, GKGameCenterControllerDelegate  {

    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!) {
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil);
    }

    // id に leaderboad の bundle id を入れる
    func showLeaderboardScore(id : String) {
        let localPlayer = GKLocalPlayer()
        localPlayer.loadDefaultLeaderboardIdentifierWithCompletionHandler({ (leaderboardIdentifier : String?, error : NSError?) -> Void in
            if error != nil {
                print("game center show error. \(error!.description)")
            } else {
                let gameCenterController:GKGameCenterViewController = GKGameCenterViewController()
                gameCenterController.gameCenterDelegate = self
                gameCenterController.viewState = GKGameCenterViewControllerState.Leaderboards
                gameCenterController.leaderboardIdentifier = id
                self.view?.window?.rootViewController?.presentViewController(gameCenterController, animated: true, completion: nil)
            }
        })
    }
    
    // スコアを送信するGKScoreクラスを生成
    func reportScore(id : String, score: Int) {
        let myScore = GKScore(leaderboardIdentifier: id")
        myScore.value = Int64(score)
        GKScore.reportScores([myScore], withCompletionHandler: { (error) -> Void in
            if error != nil {
                print("game center send error. \(error!.code).\(error!.description)")
            } else {
                print("game center send success")
            }
        })
    }
    
    func reportAchievement(achievementId: String) {
        let myAchievement = GKAchievement(identifier: achievementId)
        myAchievement.percentComplete = 100
        GKAchievement.reportAchievements([myAchievement], withCompletionHandler:
            { (error) -> Void in
                if error != nil {
                    print(error!.code)
                }
        })
    }

iOSアプリ申請

  • versionごとにどの leaderboard を使うかなどの設定が必要なので、設定をしておく
  • そしていつものように一週間ほどモヤモヤしながら待つ

締めの言葉

f:id:InvokeTwoA:20151023183618p:plain「GameCenterを実装するとさ、作者としてユーザーがどれくらい動いてるのがダイレクトに分かるのがありがたいんだよね」
f:id:InvokeTwoA:20151009145746p:plain「app analytics だけだと分からない情報も多いですもんね」
f:id:InvokeTwoA:20151023183618p:plain「そしてアクティブユーザーのあまりの少なさに絶望したりするんだ」
f:id:InvokeTwoA:20151009145746p:plain「……泣きません、ヒットするまでは」