読者です 読者をやめる 読者になる 読者になる

スマゲ

スマートなゲームづくりを目指して日々精進

UnityでGameCenterのLeaderBoardを利用する

UnityでGameCenterのLeaderBoardを利用してみます

■LeaderBoard
GameCenterある機能の一つで、ユーザーが獲得したスコアを集計して順位付けを行う。いわゆるランキング機能

■AppIdの設定
Member Centerにログインし、新規AppIdを設定する

■iTunesConnectでの準備
LeaderBoardを利用するため、iTunesConnectで新しいアプリを準備する

1. アプリの新規作成
iTunesConnectにログインして、マイAppから [+] -> [新規App] を選択
f:id:sanukin39:20160531235453p:plain

2. アプリ情報の入力
表示されたポップアップにてアプリ情報を入力する

プラットフォーム: iOS
プライマリ言語: Japanese
バンドルID: 作成したAppIdを選択
SKU: バンドルIDと同じものを入力

3.ゲームセンターの有効化
アプリ情報のメニューから [機能] -> [GameCenter]を選択
表示されたLeaderBoardの [+] を選択
f:id:sanukin39:20160601222941p:plain

LeaderBoardを追加ではシングルを選択する

ハイスコア情報の作成
ボード名, ID, タイプ, 範囲を指定する
今回はゲームのハイスコアを想定して設定
f:id:sanukin39:20160601223130p:plain

スコアボードのローカライズ
日本語で表示するための情報を入力
f:id:sanukin39:20160601224323p:plain

うまく追加するとGameCenterのリーダーボードにこのように表示される
f:id:sanukin39:20160601224623p:plain

アプリバージョンでの有効化
[App Store] -> [iOS App] よりLeaderBoardを利用したいバージョンのアプリ情報を開く、なければ [+ バージョンまたはプラットフォーム]から新規作成する
アプリ情報の中ほどにGameCenterを有効にするボタンがあるので有効化し、作っておいたハイスコアのLeaderBoardを追加する
f:id:sanukin39:20160601224921p:plain

■Unityでの実装
1. 前準備
Unityで新規プロジェクトを作成、設定にてbundleIdを作成したAppIdに変更。バージョンを先ほど有効化したものに変更する
今回はUnity5.3.4f1を利用

2. テスト用のUI作成
上からハイスコア入力テキストフィールト、スコア送信ボタン、リーダーボード表示ボタン
f:id:sanukin39:20160601230428p:plain

3.実装
初期化、リーダーボードの表示、スコアの送信処理を実装、ボタンの押下処理と適切に紐付ける

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SocialPlatforms;
using System.Collections;

public class HighScoreSample : MonoBehaviour {

    // リーダボードID itunesConnectで設定した値を入力
    private const string leaderBoardId = "highscore";
    [SerializeField] InputField inputField;

    void Awake(){
        // 初期化処理
        Social.localUser.Authenticate(processAuthentication);
    }

    // 初期化処理が終了した時に呼ばれる, 引数は成功したかどうか
    private void processAuthentication (bool success)
    {
        if (success) {
            // 認証が成功した時の処理
        } else {
            // 認証が失敗した時の処理
        }
    }

    // リーダーボードの表示
    public void ShowLeaderBoard(){
        Social.ShowLeaderboardUI();
    }

    // ハイスコアの送信処理
    public void SendScore(){
        int score = 0;
        if(int.TryParse(inputField.text, out score)){
            Social.ReportScore (score, leaderBoardId, success => {
                if(success){
                    // 送信が成功した時の処理
                } else {
                    // 送信が失敗した時の処理
                }
            });
        }
    }
}

■動作確認
実機転送して動作確認を行う

起動時にGameCenterへログインする
f:id:sanukin39:20160601232054p:plain

スコアの送信
f:id:sanukin39:20160601232140p:plain

リーダーボードの確認
f:id:sanukin39:20160601232200p:plain

■うまく動作しなかった時に確認すること
・BundleIdは適切なものになっているか
・ビルドしたバージョンはGameCenterがきちんと有効化されているか(LeaderBoardが選択されているか)
・実機、もしくはエミュレータで確認しているか(Unity Editorでは動かない)
・リーダーボードのIDは間違っていないか
初期化、スコア送信、リーダーボード表示それぞれのタイミングでログを仕込んでデバッグすると問題を見つけやすい

■参考
Unity - マニュアル: ソーシャル API
概要