暗纹团结火力地堡实时数据库错误:“自定义运行循环,不支持”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暗纹团结火力地堡实时数据库错误:“自定义运行循环,不支持”?相关的知识,希望对你有一定的参考价值。

我目前attemping搭建统一的自定义编辑工具,利用火力地堡实时数据库。该工具将允许在检查员的场景资产有人右击并选择“锁定”或“解锁”的情景。在我们的火力地堡数据库,这个锁是通过字典来表示,每个场景名称作为密钥,并且每个值要么被“锁定”或“解锁”。这funcitonality稍后将扩大,但现在,我只想把事情成立,使我其实可以连接并使用火力地堡实时数据库。

我看了看火力地堡快速启动项目统一为实时数据库(一个功能类似排行榜),并发现它工作得很好。我可以更换数据库的URL与URL我的应用程序的数据库中的项目,当我进入价值,他们似乎我的实时数据库中。

所以,根据我的代码从快速入门的代码我的自定义编辑器的脚本。事实上,我复制粘贴的大部分。我会后脚本本身,然后描述我收到的错误,以及该给错误的行:

    using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using Firebase;
using Firebase.Unity.Editor;
using Firebase.Database;

[CustomEditor(typeof(SceneAsset))]
[ExecuteInEditMode]
public class SceneLockingEditor : Editor
{
    static string sceneName;
    DependencyStatus dependencyStatus = DependencyStatus.UnavailableOther;

    protected virtual void OnEnable()
    {
        Debug.Log("OnEnable Called");
        sceneName = target.name;

        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
            dependencyStatus = task.Result;
            if (dependencyStatus == DependencyStatus.Available)
            {
                InitializeFirebase();
            }
            else
            {
                Debug.LogError(
                    "Could not resolve all Firebase dependencies: " + dependencyStatus);
            }
        });
    }

    // Initialize the Firebase database:
    protected virtual void InitializeFirebase()
    {
        Debug.Log("Initializing Firebase");
        FirebaseApp app = FirebaseApp.DefaultInstance;
        app.SetEditorDatabaseUrl(CENSORING MY DATABASE SORRY);
        if (app.Options.DatabaseUrl != null) app.SetEditorDatabaseUrl(app.Options.DatabaseUrl);
    }

    static TransactionResult SceneLockTransaction(MutableData mutableData)
    {
        List<object> sceneLocks = mutableData.Value as List<object>;

        if (sceneLocks == null)
        {
            sceneLocks = new List<object>();
        }

        if(mutableData.ChildrenCount > 0)
        {
            //Look at every child in the scene locks directory.
            foreach (var child in sceneLocks)
            {
                Debug.Log("Checking next child.");

                if (!(child is Dictionary<string, object>))
                    continue;

                //If we find the scene we're looking for...
                Debug.Log("Checking if the scene has the name we want");
                foreach(string key in ((Dictionary<string, object>)child).Keys)
                {
                    Debug.Log("Key: " + key);
                }
                if(((Dictionary<string, object>)child).ContainsKey(sceneName))
                {
                    string childLockStatus = (string)((Dictionary<string, object>)child)["lockStatus"];
                    //If the scene is already locked, just abort.
                    if (childLockStatus == "locked")
                    {
                        Debug.Log("Scene is already locked. Abort.");
                        return TransactionResult.Abort();
                    }
                    else
                    {
                        Debug.Log("Scene existed in the database and was not locked. Locking it.");
                        // If the scene existed in the database but was not locked, we will lock it.
                        ((Dictionary<string, object>)child)[sceneName] = "locked";

                        // You must set the Value to indicate data at that location has changed.
                        mutableData.Value = sceneLocks;
                        return TransactionResult.Success(mutableData);
                    }
                }
            }
        }
        Debug.Log("Scene did not exist in the database. Adding it as locked.");
        // If the scene didn't exist in the database before, we will add it as locked.
        Dictionary<string, object> newSceneLock = new Dictionary<string, object>();
        newSceneLock[sceneName] = "locked";
        sceneLocks.Add(newSceneLock);

        // You must set the Value to indicate data at that location has changed.
        mutableData.Value = sceneLocks;
        return TransactionResult.Success(mutableData);

    }

    static TransactionResult SceneUnlockTransaction(MutableData mutableData)
    {
        List<object> sceneLocks = mutableData.Value as List<object>;

        if (sceneLocks == null)
        {
            sceneLocks = new List<object>();
        }

        if (mutableData.ChildrenCount > 0)
        {
            //Look at every child in the scene locks directory.
            foreach (var child in sceneLocks)
            {
                Debug.Log("Checking next child.");

                if (!(child is Dictionary<string, object>))
                    continue;

                //If we find the scene we're looking for...
                Debug.Log("Checking if the scene has the name we want");
                foreach (string key in ((Dictionary<string, object>)child).Keys)
                {
                    Debug.Log("Key: " + key);
                }
                if (((Dictionary<string, object>)child).ContainsKey(sceneName))
                {
                    string childLockStatus = (string)((Dictionary<string, object>)child)["lockStatus"];
                    //If the scene is already locked, just abort.
                    if (childLockStatus == "unlocked")
                    {
                        Debug.Log("Scene is already unlocked. Abort.");
                        return TransactionResult.Abort();
                    }
                    else
                    {
                        Debug.Log("Scene existed in the database and was locked. Unlocking it.");
                        // If the scene existed in the database but was not locked, we will lock it.
                        ((Dictionary<string, object>)child)[sceneName] = "unlocked";

                        // You must set the Value to indicate data at that location has changed.
                        mutableData.Value = sceneLocks;
                        return TransactionResult.Success(mutableData);
                    }
                }
            }
        }
        Debug.Log("Scene did not exist in the database. Adding it as unlocked.");
        // If the scene didn't exist in the database before, we will add it as locked.
        Dictionary<string, object> newSceneLock = new Dictionary<string, object>();
        newSceneLock[sceneName] = "unlocked";
        sceneLocks.Add(newSceneLock);

        // You must set the Value to indicate data at that location has changed.
        mutableData.Value = sceneLocks;
        return TransactionResult.Success(mutableData);

    }

    static public void AddSceneLock()
    {
        Debug.Log("Attempting to add scene lock to database.");
        DatabaseReference reference = FirebaseDatabase.DefaultInstance.GetReference("SceneLocks");

        Debug.Log("Running Transaction...");
        // Use a transaction to ensure that we do not encounter issues with
        // simultaneous updates that otherwise might create more than MaxScores top scores.
        reference.RunTransaction(SceneLockTransaction)
          .ContinueWith(task => {
              if (task.Exception != null)
              {
                  Debug.Log(task.Exception.ToString());
              }
              else if (task.IsCompleted)
              {
                  Debug.Log("Transaction complete.");
              }
          });
    }

    static public void RemoveSceneLock()
    {
        Debug.Log("Attempting to add scene lock to database.");

        DatabaseReference reference = FirebaseDatabase.DefaultInstance.GetReference("SceneLocks");

        Debug.Log("Running Transaction...");
        // Use a transaction to ensure that we do not encounter issues with
        // simultaneous updates that otherwise might create more than MaxScores top scores.
        reference.RunTransaction(SceneUnlockTransaction)
          .ContinueWith(task => {
              if (task.Exception != null)
              {
                  Debug.Log(task.Exception.ToString());
              }
              else if (task.IsCompleted)
              {
                  Debug.Log("Transaction complete.");
              }
          });
    }

    [MenuItem("CONTEXT/SceneAsset/Lock Scene", false, 0)]
    public static void LockScene()
    {
        Debug.Log("LockScene Called for scene " + sceneName + ".");
        AddSceneLock();
    }

    [MenuItem("CONTEXT/SceneAsset/Unlock Scene", false, 0)]
    public static void UnlockScene()
    {
        Debug.Log("UnlockScene Called for scene " + sceneName + ".");
        RemoveSceneLock();
    }
}

这些错误总是来自这一行:

FirebaseDatabase.DefaultInstance.GetReference("SceneLocks");

具有与“FirebaseDatabase.DefaultInstance”做任何一行将抛出以下两个错误之一

错误1:

InvalidOperationException: SyncContext not initialized.
Firebase.Unity.UnitySynchronizationContext.get_Instance ()
Firebase.Platform.PlatformInformation.get_SynchronizationContext ()
Firebase.FirebaseApp.get_ThreadSynchronizationContext ()
Firebase.Database.DotNet.DotNetPlatform+SynchronizationContextTarget..ctor ()
Firebase.Database.DotNet.DotNetPlatform.NewEventTarget (Firebase.Database.Internal.Core.Context c)
Firebase.Database.Internal.Core.Context.EnsureEventTarget ()
Firebase.Database.Internal.Core.Context.InitServices ()
Firebase.Database.Internal.Core.Context.Freeze ()
Firebase.Database.Internal.Core.RepoManager.CreateLocalRepo (Firebase.Database.Internal.Core.Context ctx, Firebase.Database.Internal.Core.RepoInfo info, Firebase.Database.FirebaseDatabase firebaseDatabase)
Firebase.Database.Internal.Core.RepoManager.CreateRepo (Firebase.Database.Internal.Core.Context ctx, Firebase.Database.Internal.Core.RepoInfo info, Firebase.Database.FirebaseDatabase firebaseDatabase)
Firebase.Database.FirebaseDatabase.EnsureRepo ()
Firebase.Database.FirebaseDatabase.get_RootReference ()
SceneLockingEditor.OnInspectorGUI () (at Assets/Bitloft/SCRIPTS/Editor/SceneLockingEditor.cs:37)
UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor[] editors, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1242)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

错误2:

Exception: Custom Run loops are not supported!
Firebase.Database.Internal.Core.Context.GetExecutorService ()
Firebase.Database.Internal.Core.Context.GetConnectionContext ()
Firebase.Database.Internal.Core.Context.NewPersistentConnection (Firebase.Database.Internal.Connection.HostInfo info, IDelegate delegate_)
Firebase.Database.Internal.Core.Repo..ctor (Firebase.Database.Internal.Core.RepoInfo repoInfo, Firebase.Database.Internal.Core.Context ctx, Firebase.Database.FirebaseDatabase firebaseDatabase)
Firebase.Database.Internal.Core.RepoManager.CreateLocalRepo (Firebase.Database.Internal.Core.Context ctx, Firebase.Database.Internal.Core.RepoInfo info, Firebase.Database.FirebaseDatabase firebaseDatabase)
Firebase.Database.Internal.Core.RepoManager.CreateRepo (Firebase.Database.Internal.Core.Context ctx, Firebase.Database.Internal.Core.RepoInfo info, Firebase.Database.FirebaseDatabase firebaseDatabase)
Firebase.Database.FirebaseDatabase.EnsureRepo ()
Firebase.Database.FirebaseDatabase.get_RootReference ()
SceneLockingEditor.OnInspectorGUI () (at Assets/Bitloft/SCRIPTS/Editor/SceneLockingEditor.cs:37)
UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor[] editors, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1242)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

它总是一个错误或其他的,我不能确定是什么原因导致一个错误出现,而不是其他。这两个错误停止一切操作我想数据库,这意味着我不能用我的数据库中的所有交互上做。

我已经看到了在快速启动项目,并观看了人们建立火力地堡一些视频与他们的项目工作,我似乎无法确定过程中,我已经搞砸。我有进口我的谷歌,services.json到统一的项目。快速启动项目工作就好了我的数据库交互。这只是这是行不通的这个特定的脚本。我找不到任何地方谷歌这两个错误的任何提及。我甚至接触正式支持火力地堡,他们不能给我的错误是什么意思或者什么可能会导致他们的任何意见。

我认为一个问题可能是在我的初始化函数。而不是做的:

FirebaseApp app = FirebaseApp.DefaultInstance;

我想,也许我应该使用FirebaseApp.Create()与传递一个自定义名称,但是,导致在同一行被抛出同样的错误。我在为如何处理这个问题继续亏损。我不知道还有谁拥有了这些特定的错误,我已经做了很多的实验用不同的方式在过去数天来访问数据库。如果有人有什么,我做错了什么,或者是什么原因导致这些错误(以及如何解决这些问题)的想法,我真的很感激它。

答案

首先,你应该初始化与唯一的名称FirebaseApp的新实例火力点。我不喜欢这样写道:

FirebaseApp firebaseApp = FirebaseApp.Create(
    FirebaseApp.DefaultInstance.Options, 
    "FIREBASE_EDITOR");

二是建立引用(DatabaseReference,StorageReference等),与此firebaseApp情况下,只有FirebaseApp.CheckAndFixDependenciesAsync后再使用()

总体代码如下所示:

public static void Initialize(bool isEditor = false)
{
    if (isEditor)
    {
        FirebaseApp firebaseApp = FirebaseApp.Create(
            FirebaseApp.DefaultInstance.Options, 
            "FIREBASE_EDITOR");

        firebaseApp.SetEditorDatabaseUrl("https://project.firebaseio.com/");

        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
        {
            if (task.Result == DependencyStatus.Available)
            {
                database = FirebaseDatabase.GetInstance(firebaseApp).RootReference;
                storage = FirebaseStorage.GetInstance(firebaseApp).RootReference;
                auth = FirebaseAuth.GetAuth(firebaseApp);
            }
            else
            {
                Debug.LogError(
                    "Could not resolve all Firebase dependencies: " + task.Result);
            }
        });
    }
    else
    {
        FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://project.firebaseio.com/");

        database = FirebaseDatabase.DefaultInstance.RootReference;
        storage = FirebaseStorage.DefaultInstance.RootReference;
        auth = FirebaseAuth.DefaultInstance;
    }

    IsInitialized = true;
}

我有同样的错误。我花了几个小时解决这个和它的工作对我来说

以上是关于暗纹团结火力地堡实时数据库错误:“自定义运行循环,不支持”?的主要内容,如果未能解决你的问题,请参考以下文章

text 火力地堡

markdown 火力地堡

java 火力地堡

燕麦工作室第一卷:火力地堡高清下载

如何获得具有特定属性的特定孩子..这是我的火力基地

颤振火力线操作