0

我正在使用 Firebase 实时数据库来存储某些游戏模式设置,并让我使用的设置GetValueAsync().ContinueWith()在我测试它时可以正常工作,Debug.Log()但是当我需要通过激活消息对象来向玩家显示消息时它不起作用正确地,即调试代码执行在到达之前停止时GameObject.SetActive()。这是执行我描述的代码。

private void GetValue(string path, Action<DataSnapshot> onValueGet)
{
    dbRef.Child(path).GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Debug.LogError($"Failed getting Value Async. {task.Exception}");
        }

        if (task.IsCompleted)
        {
            onValueGet?.Invoke(task.Result);
        }
    });
}

internal void GetGamemode(string id, Action<Gamemode> onGamemodeGet)
{
    GetValue($"{id}/Settings/Gamemode", (snapshot) =>
    {
        if (int.TryParse(snapshot.ToString(), out int result))
        {
            onGamemodeGet?.Invoke((Gamemode)result);
        }
        else
        {
            onGamemodeGet?.Invoke(Gamemode.Default);
        }
    });
}

我打电话给GetGamemode()哪个电话GetValue(),如果没有得到正确的数据,我会为玩家显示一条消息

        FirebaseController.Instance.GetGamemode(id, gamemode =>
        {
            if (gamemode == Gamemode.Default)
            {
                Debug.Log("Failed getting gamemode");
                MessageController.Instance.ShowMessage("Failed getting gamemode... Check game id!", Color.white);
            }
            else
            {
                ShowJoinSelection(gamemode);
            }
        });

我通过它调用的 Debug 看到了这一点,ShowMessage()但它在方法中没有做任何事情ShowMessage()

4

1 回答 1

0

好的,我让它工作的方式是等待协程中的响应,并在收到响应后调用回调

private IEnumerator GetValue(string path, Action<DataSnapshot> onValueGet)
{
    bool responseGot = false;
    DataSnapshot responsePayload = null;
    dbRef.Child(path).GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Debug.LogError($"Failed getting Value Async. {task.Exception}");
        }

        responseGot = true;
        responsePayload = task.Result;
    });

    yield return new WaitUntil(() => responseGot);
    onValueGet?.Invoke(responsePayload);
}

这是获取值的修改方法,它可以正确地与UnityEngine对象交互。

于 2021-04-15T13:40:56.503 回答