GS2-Ranking

ランキングを GS2 SDK for Unity から利用する手順を解説します。

ランキングテーブルを作成する

GS2マネージメントコンソールの GS2-Ranking から新しくランキングテーブルを作成します。

ランキングテーブルは複数のアカウントのスコアをまとめて管理する単位です。

../../../_images/step-00016.png

『ランキングテーブルの新規作成』をクリックします。

../../../_images/step-00026.png

ランキングテーブルの名前をつけます。

ランキングテーブルは異なるゲームごとにランキングを分けて管理する単位だと思ってください。

../../../_images/step-00035.png

ランキングテーブルの詳細ページに遷移します。

新しくゲームモードを作成します。ゲームモードはステージ1のスコアランキング、ステージ2のスコアランキング。というようにランキング処理をする単位ごとに用意します。

『ゲームモードの新規作成』をクリックします。

../../../_images/step-00045.png

ゲームモードの設定として、ゲームモードの名前。

スコアのソート方向(スコアランキングであれば降順、クリアタイムランキングであれば昇順)を設定し、

集計間隔 にはランキングを集計する間隔 15分〜24時間 の範囲で指定します。

GS2-Ranking は集計回数×参加人数で費用が発生しますので、ゲームの特性に合わせて集計間隔を調整してください。

これで、GS2マネージメントコンソールでおこなう準備は完了です。

ランキングを実装する

ここからは Unity での実装になります。

まずはログイン処理を実装する必要があります。ログインして Gs2.GameSession を取得するまでの手順は GS2-Auth をご参照ください。

ここからはログインが完了している前提で説明を進めます。

スコアを登録

gs2.Ranking.Put (
    result => {
        if(result.Error != null) throw result.Error;
        // スコアの登録が成功
        Debug.Log("スコアの登録が完了しました");
    },
    session,                 // GS2 のログインセッション
    RANKING_TABLE_NAME,      // GS2-Ranking で作成したランキングテーブル名
    GAME_MODE_NAME,          // GS2-Ranking で作成したゲームモード名
    1000,                    // 登録するスコア
    "meta data");            // スコアに付加するメタデータ(プレイヤー名の格納などに利用できます)

gs2.Ranking.Put() でランキングにスコアを登録することが出来ます。

スコアには最大128バイトのメタデータをもたせることが出来ます。

プレイヤーの名前や、レースゲームであればゴーストデータのIDなどを格納するのに利用できます。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string RANKING_TABLE_NAME = "ranking-0001";
    private const string GAME_MODE_NAME = "mode-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            USER_ID,
            KEY_NAME,
            authenticationToken);

        StartCoroutine (PutScore ());
    }

    IEnumerator PutScore() {
        // スコアを登録します
        yield return gs2.Ranking.Put (
            result => {
                if(result.Error != null) throw result.Error;
                // スコアの登録が成功
                Debug.Log("スコアの登録が完了しました");
            },
            session,                 // GS2 のログインセッション
            RANKING_TABLE_NAME,      // GS2-Ranking で作成したランキングテーブル名
            GAME_MODE_NAME,          // GS2-Ranking で作成したゲームモード名
            1000,                    // 登録するスコア
            "meta data");            // スコアに付加するメタデータ(プレイヤー名の格納などに利用できます)
    }

    void Update () {

    }
}

ランキングを取得

gs2.Ranking.GetRanking (
    result => {
        if(result.Error != null) throw result.Error;
        Debug.Log("--- Ranking ---");
        foreach(Gs2.Ranking.Ranking ranking in result.Result) {
            Debug.Log("[" + ranking.Rank + "] " + ranking.Score + " " + ranking.Meta);
        }
    },
    session,                   // GS2 のログインセッション
    RANKING_TABLE_NAME,        // GS2-Ranking で作成したランキングテーブル名
    GAME_MODE_NAME,            // GS2-Ranking で作成したゲームモード名
    0,                         // ランキングの取得開始オフセット
    10);                       // ランキングの取得件数

ランキングデータを取得します。

ランキングデータはランダムアクセスが可能で、指定したオフセットから指定した件数のデータを取得できます。

通常、データベースの特性上ランキングの下位となるランキング一覧取得には時間がかかりますが、

GS2-Ranking はアクセス時間が常に一定となるよう設計されています。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string RANKING_TABLE_NAME = "ranking-0001";
    private const string GAME_MODE_NAME = "mode-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            USER_ID,
            KEY_NAME,
            authenticationToken);

        StartCoroutine (GetRanking ());
    }

    IEnumerator GetRanking() {
        // TOP10 のランキングを取得します
        yield return gs2.Ranking.GetRanking (
            result => {
                if(result.Error != null) throw result.Error;
                Debug.Log("--- Ranking ---");
                foreach(Gs2.Ranking.Ranking ranking in result.Result) {
                    Debug.Log("[" + ranking.Rank + "] " + ranking.Score + " " + ranking.Meta);
                }
            },
            session,                   // GS2 のログインセッション
            RANKING_TABLE_NAME,        // GS2-Ranking で作成したランキングテーブル名
            GAME_MODE_NAME,            // GS2-Ranking で作成したゲームモード名
            0,                         // ランキングの取得開始オフセット
            10);                       // ランキングの取得件数
    }

    void Update () {

    }
}

自分の現在の順位を取得

gs2.Ranking.GetMyRank (
    result => {
        if(result.Error != null) throw result.Error;
        // 自分の順位の取得に成功
        Debug.Log("インデックス: " + result.Result.Index);
        Debug.Log("順位: " + result.Result.Rank);
    },
    session,                   // GS2 のログインセッション
    RANKING_TABLE_NAME,        // GS2-Ranking で作成したランキングテーブル名
    GAME_MODE_NAME);           // GS2-Ranking で作成したゲームモード名

順位情報には『インデックス』と『ランク』があります。

インデックスは同一スコアを別扱いした先頭からの位置情報。プレイヤーの前後のランキングを取得する際などに利用できます。ランクは同一スコアを同一順位とした順位情報です。

例えば、『ユーザA: 1000点』『ユーザB: 1000点』『ユーザC: 2000点』 というスコアで昇順のランキングだった場合は

インデックス ランク ユーザ スコア
1 1 ユーザA 1000点
2 1 ユーザB 1000点
3 3 ユーザC 2000点

となります。

同一スコアのユーザのどちらが上位のインデックスが付けられるかは不定です。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string RANKING_TABLE_NAME = "ranking-0001";
    private const string GAME_MODE_NAME = "mode-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            USER_ID,
            KEY_NAME,
            authenticationToken);

        StartCoroutine (GetMyRank ());
    }

    IEnumerator GetMyRank() {
        // 自分の順位を取得します
        yield return gs2.Ranking.GetMyRank (
            result => {
                if(result.Error != null) throw result.Error;
                // 自分の順位の取得に成功
                Debug.Log("インデックス: " + result.Result.Index);
                Debug.Log("順位: " + result.Result.Rank);
            },
            session,                   // GS2 のログインセッション
            RANKING_TABLE_NAME,        // GS2-Ranking で作成したランキングテーブル名
            GAME_MODE_NAME);           // GS2-Ranking で作成したゲームモード名
    }

    void Update () {

    }
}