【问题标题】:Unity working with Async and Await in FirebaseUnity 在 Firebase 中使用 Async 和 Await
【发布时间】:2018-09-01 02:30:51
【问题描述】:

我正在用 Unity 实现一个使用 firebase 服务的小游戏。 Firebase RealtimeDataBase 有一点问题。 我有一个方法“UpdateScoreAsync”,这个方法将新玩家的记录发布到数据库中。现在我用这样的代码调用这个方法:

await UpdateScoreAsync();
LoadScene("ReloadActualScene"); // It starts the game again.

效果很好,但是就像您在代码中看到的那样,新场景会在乐谱完全更新时加载。我的目标是在分数更新时加载新场景,但如果我只是在场景重新加载时删除“等待”游戏中断。我看到我的设备日志(Android),我认为问题是这样的:

本机线程在没有调用 DetachCurrentThread 的情况下退出(也许它会使用 pthread_key_create 析构函数?)(等等)

UpdateScoreAsync 方法的对象是一个单例,在重新加载场景时不会破坏。虽然游戏破解,但分数在数据库中更新!

我目前的方法“UpdateScoreAsync”是这样的:

public async Task UpdateScoreAsync(string userId, int newScore)
{
    Debug.Log("Actualizando puntuación en la base de datos...");
    await FirebaseDatabase.DefaultInstance.GetReference("string").Child("string").Child("Score").SetValueAsync(newScore).ContinueWith(task => {
        if (task.IsFaulted) {
            ...
        } else if (task.IsCanceled) {
            ...
        } else if (task.IsCompleted) {
            Debug.Log("Score updated");
            ...
        }
    });
}

我尝试像这样改变这种方法:

public void UpdateScoreAsync(string userId, int newScore)
{
    Debug.Log("Actualizando puntuación en la base de datos..."); 
    FirebaseDatabase.DefaultInstance.GetReference("string").Child("string").Child("Score").SetValueAsync(newScore).ContinueWith(task => {
        if (task.IsFaulted) {
           ...
        } else if (task.IsCanceled) {
           ...
        } else if (task.IsCompleted) {
           Debug.Log("Score updated");
           ...
        }
    });
}

以及对该方法的调用:

UpdateScoreAsync();
LoadScene("ReloadActualScene");

有了这个新代码,我得到了我之前解释过的错误。谁能帮帮我??不知道哪里出错了。

提前致谢!

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database async-await


    【解决方案1】:

    根据 LoadScene() 的 Unity 文档:

    注意:由于加载设置为在下一个渲染帧中完成,因此调用 SceneManager.LoadScene 会强制完成所有先前的 AsynOperations,即使 AsyncOperation.allowSceneActivation 设置为 false。这可以通过使用 LoadSceneAsync 来避免。

    尝试改用 LoadSceneAsync。

    【讨论】:

    • 但是如果我不理解不好,我所做的就是在其他异步操作完成之前场景不会加载。但是我想在后台执行其他操作时加载新场景,当异步操作(前一个场景中的抛出)仍在执行时,我应该能够在新场景中播放事件。
    • 你试过这个方法吗?它奏效了吗?如果没有,发生了什么?
    • 我下周试试!刚才我的电脑坏了。我会在测试时再次发布!提前致谢!
    • 恐怕错误还在继续...... :(错误是:在没有合格用户的情况下调用系统进程中的方法:android.app.ContextImpl.sendBroadcast。知道什么问题是??
    • 这看起来与您之前收到的错误消息不同,对吗?
    猜你喜欢
    • 2019-06-08
    • 2017-09-28
    • 2021-01-13
    • 2021-04-01
    • 2021-09-25
    • 2021-06-20
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多