【问题标题】:FirebaseAuth.DefaultInstance competes with another instance -> only one worksFirebaseAuth.DefaultInstance 与另一个实例竞争 -> 只有一个有效
【发布时间】: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());
     }

【问题讨论】:

    标签: c# firebase unity3d


    【解决方案1】:

    不是专家,但我在当前项目中使用 Unity 和 Firebase,因此希望以下建议能有所帮助。

    首先 - 尝试将您的 CheckAndFixDependenciesAsync() 调用更改为如下所示。把它放在一个异步方法中,然后等待检查。这与正确调用主线程上的方法有关。 Unity 不能很好地处理“ContinueWith”调用。有一个particular article about firebase and async in Unity issues by google.

    async void Awake()
    {
        var dependencyStatus = await FirebaseApp.CheckAndFixDependenciesAsync();
        if (dependencyStatus == DependencyStatus.Available)
        {
            // all good, firebase init passed
            Debug.Log("Firebase Loaded");
            InitializeFirebase();
        }
        else
        {
            Debug.Log("Firebase Failed");
        }
    }
    

    这可能足以解决您遇到的问题。第二 - 据我了解,您只需要在启动时在项目中执行一次检查。因此,您可以将其从上述两个类中删除,并在检查通过后启用它们。例如

    // This class is enabled at startup, and does the firebase check
    // before you enable any other firebase objects in the scene.
    public class FirebaseCheck : MonoBehaviour
    {
    [Header("Firebase Objects")]
    public GameObject FirebaseManagerAuth;
    public GameObject FirebaseManagerGame;
    
    async void Awake()
    {
        var dependencyStatus = await FirebaseApp.CheckAndFixDependenciesAsync();
        if (dependencyStatus == DependencyStatus.Available)
        {
            // all good, enable our gameobjects
            // they need not perform the check and can just Initialize
            // as 'instances' 
            FirebaseManagerAuth.SetActive(true);
            FirebaseManagerGame.SetActive(true);
        }
        else
        {
            Debug.Log("Firebase Failed");
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2018-03-25
      相关资源
      最近更新 更多