LoginSignup
2
0

More than 5 years have passed since last update.

NCMB(Unity,C#)でカウントの複数検索

Last updated at Posted at 2016-12-25

NCMBでは、自分のスコアを元にランキングの順位を検索出来る。
やり方は以下に書いている。

「(自分のスコアよりも大きなものがいくつ存在するのかカウント)+1」というやり方だ。

  // 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
  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位
    }
      });
  }

では、別の条件でカウントしたい場合はどうするのか。
答えはここに書かれている。

WhereXXXXXX()関数がたくさんあって、それぞれの通りに書けばOK

では、複数の条件でカウントしたい場合はどうだろう。
実はその場合はWhereXXXXX()を複数個書けばよいらしい。

    rankQuery.WhereGreaterThanOrEqualTo("Score", currentScore);
    rankQuery.WhereLessThan("Score2", Score2);

これで両方の条件に当てはまるものを持ってきてくれる。

しかし、AND条件で持ってくるために、以下のルールではちょっと問題が起きる。

ハイスコアの決め方が、以下のルールならどうだろう。

-点数の高いものがより良い順位(500点と1000点なら1000点の勝ち)
-点数が同じ場合は死亡数の少ないものが勝ち(2回死んだ場合と1回死んだ場合は1回死んだ側の勝ち)

以下のように書いてみる。

  // 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
  public void fetchRank( int currentScore )
  {
    // データスコアの「HighScore」から検索
    NCMBQuery<NCMBObject> rankQuery = new NCMBQuery<NCMBObject> ("HighScore");
    rankQuery.WhereGreaterThanOrEqualTo("Score", currentScore);
    rankQuery.WhereLessThan("Death", currentDeath);
    rankQuery.CountAsync((int count , NCMBException e )=>{

    if(e != null){
      //件数取得失敗
    }else{
      //件数取得成功
      currentRank = count+1; // 自分よりスコアが上の人がn人いたら自分はn+1位
    }
      });
  }

実はコレは思ったとおりに動作しない。

(自分のスコア)Score=100 , Death=2
(他人のスコア)Score=100 , Death=1
(他人のスコア)Score=500 , Death=3
(他人のスコア)Score=200 , Death=3

自分のスコアは、本来は4位であるが、2位となってしまう。

検索条件が

2 <= currentScore && currentDeath < 100

となっているためである。

「Aで並び替えた後に、Bで並び替え」という方法ではなく
「Aに該当 かつ Bに該当」という絞込み。

複数条件によるカウント方法を用いた順位は、この方法では上手くいかないようだ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0