【发布时间】:2019-08-18 04:09:45
【问题描述】:
我正在使用 Firebase 实时数据库来存储用户及其朋友的游戏列表。保存数据没有给我带来任何问题,但检索它已经给我带来了几天的问题。每当我检索数据并调用任何 Unity 函数(我测试了 PlayerPrefs.GetString() 和 Instantiate())时,程序都会停止,没有任何错误,但也让我做其他事情,因为它是异步的(下面的代码更好地解释了)。
我尝试通过调试器运行它并使用一堆打印语句来查看问题所在。但是,该程序没有给我任何错误,因此无法调试它。我一直在瞎猜。
我已经设法以最简单的方式重现了这个问题:
using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;
using UnityEngine;
public class FirebaseData : MonoBehaviour {
private void Awake() {
PlayerPrefs.SetString("test", "hello");
FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("HERE IS THE URL TO MY PROJECT");
TestRetrieve();
}
public void TestRetrieve() {
FirebaseDatabase.DefaultInstance.GetReference("users/").GetValueAsync().ContinueWith(task => {
if (task.IsFaulted) {
// Handle the error...
} else if (task.IsCompleted) {
DataSnapshot snapshot = task.Result;
print("here");
PlayerPrefs.GetString("test");
print("there");
}
});
}
}
您会期望程序先打印“这里”,然后再打印“那里”。但是,只有“这里”被打印,然后“PlayerPrefs.GetString("test);”行后面的任何代码都不会运行。没有给出错误。
这实际上是项目中唯一的脚本,只是附加到一个空的GameObject。
奇怪的部分是打印功能和大多数其他与 Unity 无关但只是纯 c# 的功能似乎正在工作。只有 Unity 功能给我带来了麻烦。
【问题讨论】:
-
我对 Unity 了解不多,但问题是否可能在于该代码在另一个线程中执行?也许某些 Unity 引用必须在 UI 线程中执行?我不知道,只是抛出一些想法......
标签: c# firebase unity3d asynchronous firebase-realtime-database