ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Unityで作ったゲームにランキング機能を追加してみよう

f:id:mbaasblog:20220118154457p:plain

Unityで作ったアプリにニフクラ mobile backendを使って無料でランキング機能を追加する方法を紹介します👌 コピペで実装できるので初心者の方でも簡単に実装できます👫

はじめに

こんにちは。mobile backend企画担当の伊藤です。
今回はUnity SDKを利用してランキング機能を実装する方法を解説していきます。

Unity SDKのドキュメントはこちらです👀

ドキュメント : 開発者向けドキュメント | ニフクラ mobile backend

ニフクラ mobile backendのサービスの概要はこちらをご参照ください👀

mobile backendをUnityアプリと連携させる手順

ニフクラ mobile backendのクイックスタートで画像を用いながらわかりやすく説明しているので 是非以下を参考に連携させてみてください😃✨

▼イメージ f:id:mbaasblog:20220118160043p:plain

イントロダクション (Unity) : クイックスタート | ニフクラ mobile backend

ランキング機能

ランキング機能を実装するためには

  • データストア(DB)にユーザー名とスコアを保存
  • データストアに保存されているデータをスコア降順で5件取得
  • ユーザーネームとスコアを画面表示

という順番で実装していきます。

このアプリは、ログイン中のユーザー(カレントユーザー)を認識してゲームで遊んでいるため、ユーザーはログインしている必要があります。
Unityで作ったアプリにログイン機能を追加する方法は別途ブログで公開していますので まだ実装されていない方はそちらからご覧ください👩‍💻👨‍💻

blog.mbaas.nifcloud.com

データストア(DB)にユーザー名とスコアを保存

f:id:mbaasblog:20220118164041p:plain

私は今回ブロック崩しゲームにランキング機能を付けました。 定義は以下です。

  • ブロックが1個ボールに当たるごとに点数が+100点
  • 成功しても失敗しても「data」クラスにスコアとユーザーネームが保存される

データストアにデータ(ユーザーネームとスコア)を保存する場合のコードは以下です。
の部分が今回ニフクラ mobile backendのコードです。他の箇所はゲームの処理です。)

using System;
using UnityEngine;
using NCMB;

public class Ball : MonoBehaviour
{
    Rigidbody rigid;
    GameManager manager;

    public string currentUserName;
    
    [SerializeField]
    int speed = default;
    //スコアは0からスタート
    int score = 0;
    // ★クラスのNCMBObject(data)を作成
    NCMBObject data = new NCMBObject("data");

    void Start()
    {
        //ゲームの中身
    }

    void OnCollisionEnter(Collision collision)
    {
        // ボールの移動速度を一定にする処理など
        // ボールがブロックに衝突した場合
        if (collision.gameObject.name.StartsWith("Block", StringComparison.Ordinal))
        {
            // ブロックを削除
            Destroy(collision.gameObject);
            GameManager.Instance.BlockCount--;
            //点数を追加
            score += 100;
        }
         
            // クリアした場合
            if (manager.IsClear()){
                manager.EndGame("Game Clear!");

                // ★カレントユーザーの確認
                NCMBUser currentUser = NCMBUser.CurrentUser;
                   if (currentUser != null) {
                        UnityEngine.Debug.Log ("ログイン中のユーザー: " + currentUser.UserName);
                    } else {
                        UnityEngine.Debug.Log ("未ログインまたは取得に失敗");
                    }
                    // ★UserNameとscoreを「data」クラスに保存する
                    data["score"] = score;
                    data["UserName"] = currentUser.UserName;
                    // ★データストア(「data」クラス)への登録
                    data.SaveAsync();

            return;
            }

        // ゲームオーバーの場合も同じ
        if (manager.IsGameOver()){
      //失敗した際の処理を書く
            //★ニフクラ mobile backendの処理は上と同じ
        }
    }
}

ニフクラ mobile backendのデータストア(「data」クラス)にも保存されていることを確認できました💮
(画像をクリックすると拡大して表示されます🧐)

f:id:mbaasblog:20220118174848p:plain

データストアに保存されているデータをスコア降順で5件取得して表示させる

  • データストアに保存されているデータをスコア降順で5件取得
  • ユーザーネームとスコアを画面表示

は1ファイルにまとめて書いています。

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

public class RankingHyoji : MonoBehaviour

{
    public Text targetText; 
    void Start () {
        //順位のカウント
        int count = 0;
        string tempScore = "";
        //★ データストアの「data」クラスから検索
        NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject>("data");
        //★Scoreフィールドの降順でデータを取得
        query.OrderByDescending ("score");
        //★検索件数を5件に設定
        query.Limit = 5;
        query.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {
                if (e != null) {
                  UnityEngine.Debug.Log ("ランキング取得失敗");
                } else {
                    //検索成功時の処理
                    UnityEngine.Debug.Log ("ランキング取得成功");
                        // 値とインデックスのペアをループ処理
                        foreach (NCMBObject obj in objList)
                        {
                            count++;
                             //★ユーザーネームとスコアを画面表示
                            tempScore += count.ToString() + "位:" + ":ユーザーネーム:" + obj ["UserName"] + ":スコア:" + obj ["score"] + "\r\n";
                        }
                        targetText.GetComponent<Text>().text = tempScore;
                }                     
         });
    }
}

最後に

以上で、ランキング機能が追加できました!

f:id:mbaasblog:20220118173250p:plain

不明点があればユーザーコミュニティ*1へ質問してみてください! github.com

f:id:mbaasblog:20181005111552p:plain

伊藤みなみ

mobile backend企画担当。2018年4月、富士通クラウドテクノロジーズに新卒で入社。大学は文系でプログラミングは全くの未経験ですが、日々勉強しております!

*1:こちらはニフクラ mobile backend の全ユーザ向けのユーザーコミュニティです。ただし、回答保証はありません。回答保証があるサポートを希望される場合、有償プランにて提供しておりますテクニカルサポートをご利用ください。