2018年3月4日日曜日

GameCenterの設定方法

iTunes Connectの処理

iTunes ConnectでGame CenterのスイッチをONにする。

マルチプレーヤー互換性には、今登録しようとしているアプリが入ることになるのだが、他のタブとかを行き来してるとしばらくして勝手に表示してくれる。

上のタブの「機能」、左のタブの「Game Center」に移動。
グループに移動は他のアプリとスコアを共有する場合なので、アプリ単独の場合は無視。
Leaderboard(0) の+を押すと以下の画面に。

シングルLeaderboardを選択する。

Leaderboard

Leaderboardとは、Game Center画面の項目のこと。

  • Leaderboardの参照名
    • Leaderboardごとに付ける内部名。iTunes Connect内で検索する際に使用
  • Leaderboard ID
    • このLeaderboardのための固有の識別子。. や _ も含められる。
    • プログラムの中で使う
    • 一度決めたら変更不可なので注意
    • 自分の他のアプリとも共通なので、アプリごとにユニークにする必要があるようだ
  • スコアのフォーマットタイプ

      • 整数
      • 固定小数 —— 少数点以下1〜3桁
      • 経過時間 —— 分、秒、100分の1秒
      • 金額 —— 整数、小数点以下2桁まで
  • スコア送信タイプ
    • 最初に表示するのをベストスコアにするか、最新スコアにするか
  • 並べ替えの順序
    • 最高のスコア(一番多いスコア)を最初に表示するなら「降順」を。スコアが小さい方が勝ちのゲームなら「昇順」でいいんじゃないかと思う。
  • スコアの範囲(オプション)

  • Leaderboardのローカリゼーション

言語ごとにLeaderboardに表示する「名前」を変える。(例として挙げてるゲームは漢字やエジプト文字を取るゲームなので、日本語でのローカライズ時は「漢字」と表示させる。まぎらわしくてスマン)
スコアのフォーマットは、3桁ごとにカンマ「,」で区切るかピリオド「.」で区切るかとかそんなもの。
スコアのフォーマットサフィックスってのは「〇〇点」などと付ける場合。
画像も付けられる。使ったことないけど。

実際の設定例



Leaderboardを追加

Leaderboardの設定が終わって保存されたら、最初のGame Centerの所にLeaderboard(+)が出てくるので、クリックして設定したものをチェックして加える。

Xcodeの設定

CapabilitiesをONにする

これはGameKit.frameworkのインストールとInfo.plistへの設定追加を自動でしてくれるものなので、次のように自分でやっても同じことだが、こっち推奨。
❗️で警告されてるのはiTunes Connectで設定しろって意味だと思うんで、もう終わってる。iTunesConnectできちんと設定できていればそのうち✔に変わってくれるはずだ。


以下の2つは自分でやる場合。自分でやってもCapabilitiesのON/OFFは変化せずアンマッチになるので、CapabilitiesをONにした方が楽で確実だ。
  1. GameKit.frameworkをインストール
  2. プロジェクトファイルのTARGETS / アプリ名 / Info / Custom iOS Target Properties の Required device capabilitiesにgamekitのstringを追加。
    1. これはInfo.plistと同じなので、直接そちらをいじってもよし。

コード

import GameKit するのは当然。

class のところで GKGameCenterControllerDelegate を追加する。

最低限必要な実装は以下。
  • Game Centerへのログイン
  • Leaderboardなど、ランキングのウィンドウの表示
  • ランキングのウィンドウを消去
  • ハイスコアやチャレンジをクリアしたらGame Centerに情報を送る

ログイン処理

ゲーム開始時に以下のようにGame Centerにログイン処理をする。
このログイン処理は、AppDelegateあたりに書いておいて、他のアプリからアクティブになった時にも機能するようにするといいって。


func authenticateLocalPlayer() {
    let player = GKLocalPlayer.localPlayer() //ログイン確認画面の作成
    player.authenticateHandler = {(viewController, error) -> Void in
        //GameCenterに認証されていない時、viewControllerに認証画面が入ってくるので、
        //それを表示させれば認証処理が簡単にできる
        if viewController != nil
        {
            self.present(viewController!, animated: true, completion: nil)
        }
    }
}

Leaderboard表示と消去

//GameCenterのランキング表示
@IBAction func showRanking(_ sender: Any) {
    let gcView = GKGameCenterViewController()
    gcView.gameCenterDelegate = self
    gcView.viewState = GKGameCenterViewControllerState.leaderboards
    self.present(gcView, animated: true, completion: nil)
}

ログイン後に閉じるdelegate処理も

//Leaderboard処理終了時のdelegate
func gameCenterViewControllerDidFinish(_ gameCenterViewController: GKGameCenterViewController) {
    //Viewを閉じる
    self.dismiss(animated: true, completion: nil)
}

ハイスコアを送る

以下のようなメソッドを用意しておき、ハイスコア更新時に呼び出す。
引数のIDはiTunes Connectで設定したもの。
rateがスコアになる。Leaderboardの値がInt64なのでそれに合わせてる。

func sendLeaderboardWithID(ID:String, rate:Int64) -> Void {
    //Leaderboard用のインスタンス
    let score = GKScore(leaderboardIdentifier: ID)
    if GKLocalPlayer.localPlayer().isAuthenticated {
        //スコアを設定
        score.value = rate
        print("最高値送信")
        GKScore.report([score], withCompletionHandler: { (error) in
            if error != nil {
                // エラーの場合
                print("GameCenter送信時にエラー \(String(describing: error))")
            }
        })
    } else {
        print("GameCenterにログインしてない!?Σ(((°Д°;))))ガクガク")
    }
}

実機テスト

かつてはiTunes Connectの「ユーザと役割」の「Sandboxテスター」でテスト用アカウントを作る必要があったようだが(実機の設定 / Game Cemter / sandbox をONにする必要もあった)、現在は不要になったそうだ
そのままのアカウントでやるとどうなるのかについての肝心の説明は、Appleのドキュメントからデッドリンクになっててわからん!🤮

参考サイト

0 件のコメント:

コメントを投稿