Unity在Firebase中与Async和Await配合使用

时间:2018-08-31 12:44:13

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

我正在与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");

使用此新代码,我得到了我之前解释的错误。有人可以帮我吗?我不知道错误在哪里。

谢谢!

1 个答案:

答案 0 :(得分:0)

根据Unity文档中的LoadScene():

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

尝试改用LoadSceneAsync。