さんたのお中元

Unityでのゲーム開発について主に書いていきます

Kii Cloudを用いてランキング機能の実装する

「かくれんぼしよう!」のランキング機能を実装するにあたって、Kii Cloudのサービスを利用させていただきました。
Kii Cloudはモバイルアプリ向けサーバーサイド実装不要のクラウドサービスで、Unityにも対応しています。
日本語のリファレンスガイドも充実しています。

今回はランキング機能に使いたいデータのロード、データのセーブ、データの表示という流れを紹介したいと思います。


まずは軽く用語説明などから・・・。
Kii Cloudのサーバ上で複数のデータをまとめたものをBucket言います。
このBucketにデータを格納していく訳ですが、このBucketは3種類のScopeというもので扱われています。
ランキングで使いたいBucketは、その3種類のScope中のApplication Scopeに属したものであると楽ちんです。
Application Scopeに属するデータはすべてのユーザーから読み書きすることができるためです。
(他のScopeにGroup Scope(グループ内のユーザーだけ読み書き可)、User Scope(そのユーザーだけ読み書き可)があり、目的に応じて所属先を決めることができるようになっています。)

ここからは実際のコードになります。
もうすでにログインは済んだ状態として扱います。

using UnityEngine;
using System.Collections;
using KiiCorp.Cloud.Storage;

int nGAME;
int nWIN;
string sNAME;

 //Kii Cloud上のデータ保存枠を初期化
    void kiiDataInitialize()
    {
        //Application Scopeに所属するBucketを定義
        KiiBucket appBucket = Kii.Bucket("appData");
        KiiObject Dataobj = appBucket.NewKiiObject();
        //保存するデータを定義
        Dataobj["GAMENUM"] = 0;//総試合数
        Dataobj["WINNUM"] = 0;//勝利数
        Dataobj["PLAYERNAME"] = "";//プレイヤー名
        //オブジェクトを保存
        try
        {
            Dataobj.Save();
        }
        catch(System.Exception e)
        {
            Debug.LogError("Error:" + e);
        }
    }

    //保存されているデータを読み込み
    void loadKiiData()
    {
        string userId = KiiUser.CurrentUser.ID;//ログイン中のユーザーIDを取得
        KiiQuery query = new KiiQuery(KiiClause.Equals("_owner", userId));//IDが一致するオブジェクトを検索
        bucket.Query(query, (KiiQueryResult<KiiObject> result, System.Exception e) => {
            if (e != null)
            {
                Debug.Log("Error:" + e);
                return;
            }
            foreach (KiiObject obj in result)
            {
                //データを読み込み
                nGAME = (int)obj["GAMENUM"];
                nWIN = (int)obj["WINNUM"];
                sNAME = (string)obj["PLAYERNAME"];
            }
        });
    }

    //現在のデータの保存
    public static void saveKiiData()
    {
        string userId = KiiUser.CurrentUser.ID;//ログイン中のユーザーIDを取得
        KiiQuery query = new KiiQuery(KiiClause.Equals("_owner", userId));//IDが一致するオブジェクトを検索
        bucket.Query(query, (KiiQueryResult<KiiObject> result, System.Exception e) => {
            if (e != null)
            {
                Debug.Log("Error:" + e);
                return;
            }
            foreach (KiiObject obj in result)
            {
                //データを保持
                obj["GAMENUM"] = nGAME;
                obj["WINNUM"] = nWIN;
                obj["PLAYERNAME"] = sNAME;
                obj.Save();
            }
        });
    }

    //勝利数が多い順に表示
    void displayRankData()
    {
        KiiBucket bucket = Kii.Bucket("appData");
        KiiQuery query = new KiiQuery();
        //WINNUMの値が高い順に10件取得
        query.SortByDesc("WINNUM");
        query.Limit = 10;
        bucket.Query(query, (KiiQueryResult<KiiObject> result, System.Exception e) => {
            if (e != null)
            {
                Debug.Log("Error:" + e);
                return;
            }
            foreach (KiiObject obj in result)
            {
                //データ表示
                Debug.Log("プレイヤー名:"+obj.GetString("PLAYERNAME"));
                Debug.Log("勝利数:"+obj.GetInt("WINNUM"));
                Debug.Log("総試合数:"+obj.GetInt("GAMENUM"););
            }
        });
    }

Application Scopeにログイン中のユーザーのデータを保存するときは、ユーザーIDが一致するオブジェクトを指定しないと全てのユーザーのデータを上書きしてしまうことになるので注意が必要です。

オブジェクトの検索をさまざまな条件付けで行えるので、それを利用してランキング機能などを実装することができます。

こちらの本も参考にさせていただきました。
Unityによるオンライン対戦ゲーム作りの流れがチャプター構成でわかりやすく説明されています。
ここまで具体的にUnityでのオンライン対戦ゲームの作り方を学べる本はまだあまりないのではないかと思うので、お勧めです。