【发布时间】:2021-10-26 08:07:45
【问题描述】:
我正在将 Firebase 与 Unity 结合使用,但我观察到一种奇怪的行为。在我的程序开始后,我的 FirebaseManagerAuth 初始化了与 firebase 身份验证的连接:
FirebaseAuth fbAuth = FirebaseAuth.DefaultInstance;
同时我的 FirebaseManagerGame 初始化与 firebase 数据库的连接:
DatabaseReference DBreference = FirebaseDatabase.DefaultInstance.RootReference;
我将它们分成 2 个类,分配给 2 个不同的游戏对象,以使每个类更小且更易于维护。
两个 Firebase 操作似乎相互竞争,因为它始终只有两者中的一个成功获得其引用。另一个产生“对象引用未设置为对象的实例”。这似乎是某种比赛条件,因为“获胜者”会不时变化。
如果我停用一个游戏对象,另一个游戏对象的初始化总是成功。
我有问题要找出这个问题的实际原因是什么。堆栈跟踪没有提供任何(对我而言)有用的信息。
这是调试输出:
知道了 - 认证!你调用的对象是空的 UnityEngine.Debug:Log (object) FirebaseManagerAuth:InitializeFirebase ()(在资产/脚本/FirebaseManagerAuth.cs:68) FirebaseManagerAuth:b__5_0 (System.Threading.Tasks.Task`1
)(在 资产/脚本/FirebaseManagerAuth.cs:32) System.Threading._ThreadPoolWaitCallback:PerformWaitCallback()
如果您能帮我解决这个问题,我将不胜感激!
以下是相关代码:
FirebaseManagerAuth
public class FirebaseManagerAuth : MonoBehaviour
{
public static FirebaseManagerAuth instance;
[SerializeField] private PlayerDataSO playerData;
//Firebase variables
[Header("Firebase")]
public DependencyStatus dependencyStatus;
public FirebaseAuth fbAuth;
public FirebaseUser fbUser;
void Awake()
{
//Check that all of the necessary dependencies for Firebase are present on the system
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
dependencyStatus = task.Result;
if (dependencyStatus == DependencyStatus.Available)
{
//If they are avalible Initialize Firebase
InitializeFirebase();
}
else
{
Debug.LogError("Could not resolve all Firebase dependencies: " + dependencyStatus);
}
});
if (instance == null)
{
instance = this;
Debug.Log("FirebaseManagerAuth - awake - instance was null");
}
else if (instance != null)
{
Debug.Log("Instance already exists, destroying object!");
Destroy(this);
}
}
private void InitializeFirebase()
{
try
{
fbAuth = FirebaseAuth.DefaultInstance;
}
catch (Exception e)
{
Debug.Log("Gotcha - AUTH! " + e.Message);
//throw e;
}
if (fbAuth == null)
Debug.Log("INIT FirebaseManagerAUTH + fbAuth = null");
}
FirebaseManagerGame(数据库)
public class FirebaseManagerGame : MonoBehaviour
{
public static FirebaseManagerGame instance;
[SerializeField] private PlayerDataSO playerData;
//Firebase variables
[Header("Firebase")]
public DependencyStatus dependencyStatus;
public DatabaseReference DBreference;
void Awake()
{
// excatly the same as above.
}
private void InitializeFirebase()
{
try
{
DBreference = FirebaseDatabase.DefaultInstance.RootReference;
}
catch (Exception e)
{
Debug.Log("Gotcha - GAME! " + e.Message);
throw e;
}
Debug.Log("INIT FirebaseManagerGAME + DBreference: " + DBreference.ToString());
}
【问题讨论】: