LoginSignup
inproduction
@inproduction (いっち)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

1Answer

Comments

  1. @inproduction

    Questioner
    初めて拝見しました。非同期だから悪いのかなと思いましたが、objList[0].Save();で実行しても値が更新されませんでした。記事の1つ目のプログラムquery.FindAsync関数内でDebug.Logをおこなっていますが、私のプログラムではDebug.Logすら実行されていないため、query.FindAsync関数内が正常に動作しているのかの確認ができていない状況です。query.WhereEqualTo("Name", name);まででDebug.Logをおこなうと正常に出力されます。

Your answer might help someone💌