Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
@inproduction36
Revisions
Report this question
Subscribe question
Help us understand the problem. What is going on with this question?
Q&A

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
1
Answer

こちらの記事が見つかりましたが、参考にされましたでしょうか?
https://qiita.com/otochan/items/2b462b280b82bbc2981f

0
初めて拝見しました。非同期だから悪いのかなと思いましたが、objList[0].Save();で実行しても値が更新されませんでした。記事の1つ目のプログラムquery.FindAsync関数内でDebug.Logをおこなっていますが、私のプログラムではDebug.Logすら実行されていないため、query.FindAsync関数内が正常に動作しているのかの確認ができていない状況です。query.WhereEqualTo("Name", name);まででDebug.Logをおこなうと正常に出力されます。
Help us understand the problem. What is going on with this answer?
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login