NCMBを用いたランキングの更新ができない
NCMBを用いたランキングの更新ができない
3Dアクションタイムアタックゲームを作成しています。コースをクリアした後(正確には特定のobjectに接触した後)、最短時間でゴールした場合にNCMBデータスコア"HighScore"クラスにScoreを保存するよう作成しましたが、保存がされません。
具体的な問題
HighScore.csのquery.FindAsyncでScoreの書き込みがされない
プログラムの流れ
TimeCounter.csでOnTriggerEnter(GoalObjectとPlayerが接触した場合)が呼び出された場合SaveScore.cs内のSave(score)を実行
→Save(score)…HighScore.score(backendに保存されているScore値)よりもscoreの値が小さい場合(早くゴールした場合)highScore.scoreを更新、HighScore.cs内のsave()を実行
→save()…サーバーにハイスコアを保存
HighScore.csはmobile backendによるチュートリアル"ハイスコアをサーバーに保存する"のHighScore.csと同じ内容です。
TimeCounter.cs内のOnTriggerEnter(Collider c)
private void OnTriggerEnter(Collider c)
{
//ゴール判定後の内容
if (c.gameObject.tag == "Player")
{
score = (float)currentminute * 60f + currentsecond;
saveScore.Save(score);
}
}
SaveScore.cs内のSave(float score)
public void Save(float score)
{
//スコア更新の場合
if (highScore.score > score)
{
highScore.score = score;
highScore.save();
}
}
}
HighScore.cs内のsave()
public void save()
{
// データストアの「HighScore」クラスから、Nameをキーにして検索
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject>("HighScore");
query.WhereEqualTo("Name", name);
//ここまで機能している
//以降query.FindAsyncでScoreの書き込みがされない
query.FindAsync((List<NCMBObject> objList, NCMBException e) => {
//検索成功したら
if (e == null)
{
objList[0]["Score"] = score;
objList[0].SaveAsync();
}
});
}
自分で試したこと
HighScore.cs内のfetch()は正常に動作しているため、ハイスコアは取得できています。
HighScore.cs内のfetch()
// サーバーからハイスコアを取得 -----------------
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)
{
Debug.Log(objList.Count);
// ハイスコアが未登録だったら
if (objList.Count == 0)
{
NCMBObject obj = new NCMBObject("HighScore");
obj["Name"] = name;
obj["Score"] = 9999f;
obj.SaveAsync();
score = 9999f;
}
// ハイスコアが登録済みだったら
else
{
score = System.Convert.ToSingle(objList[0]["Score"]);
}
}
});
}
0