Unity работает с Async и Await в Firebase - PullRequest
0 голосов
/ 31 августа 2018

Я реализую небольшую игру с 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 голосов
/ 31 августа 2018

Согласно документации Unity для LoadScene ():

Примечание. Поскольку загрузка установлена ​​на завершение в следующем отображаемом кадре, вызов SceneManager.LoadScene заставляет завершить все предыдущие операции AsynOperation, даже если для AsyncOperation.allowSceneActivation установлено значение false. Этого можно избежать, используя взамен LoadSceneAsync.

Попробуйте вместо этого использовать LoadSceneAsync.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...