ランキング
以下の2つのスクリプトを作ります
HighScore(こちらはアタッチしなくてよい)
using System.Collections.Generic;
namespace NCMB
{
public class HighScore
{
public int score {
get; set; }
public string name {
get; private set; }
// コンストラクタ
-----------------------------------
public HighScore(int
_score, string _name)
{
score = _score;
name = _name;
}
/*
// サーバーにハイスコアを保存
-------------------------
public void save()
{
// データストアの「HighScore」クラスから、Nameをキーにして検索
NCMBQuery<NCMBObject> query = new
NCMBQuery<NCMBObject>("HighScore");
query.WhereEqualTo("Name", name);
query.FindAsync((List<NCMBObject> objList, NCMBException
e) => {
//検索成功したら
if (e == null)
{
objList[0]["Score"] = score;
objList[0].SaveAsync();
}
});
}
*/
//
サーバーからハイスコアを取得 -----------------
public void fetch()
{
// データストアの「HighScore」クラスから、Nameをキーにして検索
NCMBQuery<NCMBObject> query = new
NCMBQuery<NCMBObject>("HighScore");
query.WhereEqualTo("Name", name);
query.FindAsync((List<NCMBObject> objList, NCMBException
e) => {
//検索成功したら
if (e == null)
{
// ハイスコアが未登録だったら
if (objList.Count == 0)
{
NCMBObject obj = new NCMBObject("HighScore");
obj["Name"] = name;
obj["Score"] = 0;
obj.SaveAsync();
score = 0;
}
// ハイスコアが登録済みだったら
else
{
score = System.Convert.ToInt32(objList[0]["Score"]);
}
}
});
}
}
}
Ranking
using NCMB;
using System.Collections.Generic;
using UnityEngine;
public class Ranking : MonoBehaviour
{
public string name = "Test";
public int score = 15;
public int currentRank = 0;
public List<NCMB.HighScore> topRankers
= null;
public List<NCMB.HighScore> neighbors =
null;
// ハイスコアをセーブする ---------------
public void Save()
{
// 「HighScore」クラスを製作
NCMBObject obj = new
NCMBObject("HighScore");
// デフォルトID
obj.ObjectId =
"BaseScore";
// 保存済みのIDを取得
if
(PlayerPrefs.GetString("ObjectId") != "")
{
obj.ObjectId = PlayerPrefs.GetString("ObjectId");
}
// データをサーバ上に保存してあるか確認
obj.FetchAsync((NCMBException e) =>
{
// データが無い
if (e != null)
{
// 新規保存
obj = new NCMBObject("HighScore");
obj["Name"] = name;//オブジェクトに名前とスコアを設定
obj["Score"] = score;
//この処理でサーバーに書き込む
obj.SaveAsync((NCMBException e2) => {
if (e2 != null)
{
//エラー処理
}
else
{
//成功時の処理
//プレイヤーIDを保存
PlayerPrefs.SetString("ObjectId", obj.ObjectId);
}
});
}
// データがある
else
{
// 上書き保存
obj["Name"] = name;//オブジェクトに名前とスコアを設定
obj["Score"] = score;
obj.SaveAsync();//この処理でサーバーに書き込む
}
});
}
// 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
public void fetchRank(int currentScore)
{
//
データスコアの「HighScore」から検索
NCMBQuery<NCMBObject> rankQuery = new
NCMBQuery<NCMBObject>("HighScore");
rankQuery.WhereGreaterThan("Score", currentScore);
rankQuery.CountAsync((int count, NCMBException e) => {
if (e != null)
{
//件数取得失敗
}
else
{
//件数取得成功
currentRank = count + 1; // 自分よりスコアが上の人がn人いたら自分はn+1位
Debug.Log(currentRank);
}
});
}
// サーバーからトップ5を取得 ---------------
public void fetchTopRankers()
{
//
データストアの「HighScore」クラスから検索
NCMBQuery<NCMBObject> query = new
NCMBQuery<NCMBObject>("HighScore");
query.OrderByDescending("Score");
query.Limit = 5;
query.FindAsync((List<NCMBObject> objList, NCMBException
e) => {
if (e != null)
{
//検索失敗時の処理
}
else
{
//検索成功時の処理
List<NCMB.HighScore> list = new
List<NCMB.HighScore>();
// 取得したレコードをHighScoreクラスとして保存
foreach (NCMBObject obj in objList)
{
int s = System.Convert.ToInt32(obj["Score"]);
string n = System.Convert.ToString(obj["Name"]);
list.Add(new HighScore(s, n));
Debug.Log(s);
}
topRankers = list;
}
});
}
// サーバーからrankの前後2件を取得 ---------------
public void fetchNeighbors()
{
neighbors = new
List<NCMB.HighScore>();
//
スキップする数を決める(ただし自分が1位か2位のときは調整する)
int numSkip =
currentRank - 3;
if (numSkip < 0)
numSkip = 0;
//
データストアの「HighScore」クラスから検索
NCMBQuery<NCMBObject> query = new
NCMBQuery<NCMBObject>("HighScore");
query.OrderByDescending("Score");
query.Skip = numSkip;
query.Limit = 5;
query.FindAsync((List<NCMBObject> objList, NCMBException
e) => {
if (e != null)
{
//検索失敗時の処理
}
else
{
//検索成功時の処理
List<NCMB.HighScore> list = new
List<NCMB.HighScore>();
// 取得したレコードをHighScoreクラスとして保存
foreach (NCMBObject obj in objList)
{
int s = System.Convert.ToInt32(obj["Score"]);
string n = System.Convert.ToString(obj["Name"]);
list.Add(new HighScore(s, n));
Debug.Log(s);
}
neighbors = list;
}
});
}
}
Rankingの中にある
Save();を実行する事で サーバーにランキングを登録する事ができます
このスクリプトでは同じ人のランキングは古いランキングに上書きされる仕様になっています
fetchRank(int currentScore);を実行する事で currentScoreに代入したスコアが
ランキングで何位なのか取得する事ができます
fetchTopRankers();を実行する事で ランキングトップ5を確認する事ができます
fetchNeighbors();を実行する事で 自分のランクの前後2つを確認する事ができます
※事前にfetchRankで自分のランクを取得してる必要あり
戻る