質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
mBaaS

mBaaSとはモバイルアプリケーションでの利用に特化したBaaSです。スマートフォン向けのWebアプリケーションが必要とするサーバ側の様々な機能をインターネットを通じてサービスとして提供しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1030閲覧

ランキングの並び順がおかしくなる[Unity&NCMB]

Jejeje

総合スコア38

mBaaS

mBaaSとはモバイルアプリケーションでの利用に特化したBaaSです。スマートフォン向けのWebアプリケーションが必要とするサーバ側の様々な機能をインターネットを通じてサービスとして提供しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/09/02 15:04

Unityのゲームん内でレートの高い順の全国ランキングを実装しいているのですが開くと95%ぐらいの確率で並び順が滅茶苦茶になっています。(残り5%の超ラッキー時はちゃんと並ぶ)

コードはこんな感じです。
Scoreというフィールド(フィールドであっていますか?もしかしたらレコードかも)から値の高い順に並べています。

C#

1 void GetRanking() 2 { 3 NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject>("Ranking"); 4 query.OrderByDescending("Score"); 5 query.Limit = 1000; 6 7 query.FindAsync((List<NCMBObject> objList, NCMBException e) => 8 { 9 if (e != null) 10 { 11 Debug.Log("E"); 12 } 13 else 14 { 15 Debug.Log("ok"); 16 foreach (NCMBObject obj in objList) 17 { 18 int s = System.Convert.ToInt32(obj["Score"]); 19 string n = System.Convert.ToString(obj["Name"]); 20 int icon = 0; 21 if(obj.ContainsKey("Icon")) 22 { 23 icon = System.Convert.ToInt32(obj["Icon"]); 24 } 25 string id = obj.ObjectId; 26 query.WhereGreaterThan("Score", obj["Score"]); 27 query.CountAsync((int count, NCMBException e2) => 28 { 29 if (e2 != null) 30 { 31 //件数取得失敗 32 } 33 else 34 { 35 //件数取得成功 ここでランキングの順位やレートの値を渡しています 36 int playercurrentRank = count + 1; // 順位表示 37 GameObject rankingPrefab = Instantiate(prefab); 38 rankingPrefab.transform.SetParent(prefabParent.transform,false); 39 rankingPrefab.GetComponent<RankingValue>().SetInfoPrefab(playercurrentRank, s, n, id); 40 rankingPrefab.GetComponent<RankingValue>().icon.sprite = iconData.icons[icon]; 41 } 42 }); 43 } 44 } 45 }); 46 }

もし解決策があれば教えて欲しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

query.WhereGreaterThan("Score", obj["Score"]);
query.CountAsync((int count, NCMBException e2) =>
{
if (e2 != null)
{
//件数取得失敗
}
else
{
//成功
});
ここの部分を消したらいい感じになりました

投稿2021/09/04 21:19

Jejeje

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

取ってきたデータの並び順がおかしいのか、それともそれを元に生成したオブジェクトの並び順がおかしいのか調べないといけません。

まずはデバッグ出力などして、データ順のが本当におかしいのか調べたらよいでしょう。

試しに以下のコードでデータを登録し、ソートしながら取得→出力してみたら何もおかしいことはありませんでした。

c#

1using System.Text; 2using System.Collections.Generic; 3using UnityEngine; 4using NCMB; 5 6public class NCMBRankingTest : MonoBehaviour 7{ 8 /// <summary> 9 /// ランダムなランキングデータを作る 10 /// </summary> 11 /// <param name="count">作るデータの件数</param> 12 public void GenerateRanking(int count) 13 { 14 for (int i = 0; i < count; i++) 15 { 16 NCMBObject ranking = new NCMBObject("Ranking"); 17 ranking["name"] = System.Guid.NewGuid().ToString(); 18 ranking["score"] = Random.Range(10, 99999); 19 ranking.Save(); 20 } 21 } 22 23 /// <summary> 24 /// ランキングデータを取ってきて Console に出力する。 25 /// ランキングの並び順は「ハイスコア順」とする。 26 /// </summary> 27 /// <param name="limit">出力するランキング件数</param> 28 public void GetRanking(int limit) 29 { 30 NCMBQuery<NCMBObject> rankingQuery = new NCMBQuery<NCMBObject>("Ranking"); 31 rankingQuery.OrderByDescending("score"); 32 rankingQuery.Limit = limit; 33 rankingQuery.FindAsync((List<NCMBObject> objects, NCMBException e) => 34 { 35 if (e == null) 36 { 37 // 取ってきたランキングを文字列にして出力する 38 StringBuilder b = new StringBuilder(); 39 b.AppendLine("Ranking"); 40 41 foreach (var o in objects) 42 { 43 b.Append(int.Parse(o["score"].ToString()).ToString("D5")); 44 b.Append(" : "); 45 b.AppendLine(o["name"].ToString()); 46 } 47 48 Debug.Log(b.ToString()); 49 } 50 else 51 { 52 Debug.LogError(e.ToString()); 53 } 54 }); 55 } 56}

投稿2021/09/04 03:16

bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問