はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】NCMBを使って簡単にランキングを実装する方法

はじめに

今回はNCMBを使ってゲームにランキングを実装してみる記事になります!

もしランキングの実装を実装しようと思ったら、自分でサーバーを立てる事が一般的だと思います。

しかしNCMBというmBaaSというサービスを用いることで、自身でサーバーを立てたりすることなく非常に簡単にランキングなどを実装することができます。

mbaas.nifcloud.com

では早速みていきましょう。

準備をする

まずは実際にコードを書く前に、NCMBを使うための準備をしましょう。

以下の記事を参考にしながら設定を済ませてください。

www.hanachiru-blog.com

データを登録する

データストアにデータを登録するサンプルを作ってみました。

using System.Collections.Generic;
using UnityEngine;
using NCMB;

public class DBManager : MonoBehaviour
{
    public void Save(string key, int value)
    {
        //データストアにスコアクラスを定義
        NCMBObject test = new NCMBObject("Score");

        //データストアに登録したい値を設定
        test[key] = value;

        //サーバーに書き込む
        test.SaveAsync((NCMBException e) =>
        {
            if(e != null)
            {
                Debug.LogWarning("保存に失敗: " + e.ErrorMessage);
            }
            else
            {
                Debug.Log("保存に成功");
            }
        });
    }
}

NCMBを使ったデータの登録はNCMBObjectというクラスのインスタンスをまず作る必要があります。

また今回はSaveAsyncというメソッドを用いていますが、これは非同期で処理を行います。

これに対してSaveというメソッドがありますが、こちらは同期処理です。

状況に応じて使い分けることができますが、基本は非同期処理で良いと思います。

データを取得する

上のサンプルに対応したデータを取得するスクリプトを書いてみました。

using System.Collections.Generic;
using UnityEngine;
using NCMB;
using System.Linq;

public class DBManager : MonoBehaviour
{
    public void Save(string key, int value)
    {
        //データストアにスコアクラスを定義
        NCMBObject test = new NCMBObject("Score");

        //データストアに登録したい値を設定
        test[key] = value;

        //サーバーに書き込む
        test.SaveAsync((NCMBException e) =>
        {
            if(e != null)
            {
                Debug.LogWarning("保存に失敗: " + e.ErrorMessage);
            }
            else
            {
                Debug.Log("保存に成功");
            }
        });
    }

    public void Load(string key)
    {
        //データストアの"Score"クラスから検索
        NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject>("Score");

        //"Score"クラスのkeyカラムを降順に並び替え 例)3,2,1
        query.OrderByDescending(key);

        //実際に取得する
        query.FindAsync((List<NCMBObject> objList, NCMBException e) =>
        {
            if(e != null)
            {
                Debug.LogWarning("取得に失敗: " + e.ErrorMessage);
            }
            else
            {
                var scores = objList.Select(o => System.Convert.ToInt32(o[key]));

                foreach(var item in scores)
                {
                    Debug.Log(key + ": " + item);
                }
            }
        });
    }
}

Saveと同じkeyを持つデータを全て取得して、ログに表示するスクリプトを追加してみました。

まずデータを取得するためにはNCMBQuery<NCMB>のインスタンスを作成する必要があります。

これはざっくりというとデータベースから取得するときに条件を付けるものです。ランキングの上位5位みたいなものですね。

データを取得するメソッドはFindAsyncFindの2種類ありますが、先程同様それぞれ非同期処理と同期処理の違いです。

基本は非同期処理でいいでしょう。

さいごに

これを実際に実行してみるとちゃんと動作しました。

f:id:hanaaaaaachiru:20190911015547p:plain

次はファイルストアや認証機能なんかも面白そうなので、触ってみたいと思います。