You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity编辑器脚本中调用Firebase Database函数遇阻求助

我之前也踩过这个坑!Unity编辑器环境下直接用Firebase的Runtime SDK确实会因为依赖DontDestroyOnLoad这类Play Mode专属API报错,不过不用急着切换到Python——有几个纯C#的方案能在编辑器脚本里实现Firebase Database的读写,完全贴合Unity项目的技术栈:

方案1:使用Firebase Admin SDK(工业项目首推)

Firebase Admin SDK原本是给后端/服务器场景设计的,但它不依赖Unity的Runtime组件,完全可以在编辑器脚本里使用,官方支持性也强。

实现步骤:

  1. 从Firebase控制台下载服务账号密钥(JSON格式),放在Unity项目的Assets/Editor目录下(记得不要把这个文件打包进Build,也别提交到公开版本库)。
  2. 导入Firebase Admin SDK的.NET包:可以通过NuGet下载FirebaseAdmin和Google.Apis.Auth相关DLL,然后把兼容Unity.NET版本的DLL复制到Editor目录。
  3. 编写编辑器脚本调用SDK:
using FirebaseAdmin;
using Google.Apis.Auth.OAuth2;
using FirebaseAdmin.Database;
using UnityEditor;

public class FirebaseEditorTools
{
    [MenuItem("Tools/Firebase/Write Editor Data")]
    public static void WriteDataToDatabase()
    {
        // 初始化Admin SDK(只初始化一次)
        if (FirebaseApp.DefaultInstance == null)
        {
            FirebaseApp.Create(new AppOptions()
            {
                Credential = GoogleCredential.FromFile("Assets/Editor/your-service-account-key.json")
            });
        }

        // 写入数据
        var db = FirebaseDatabase.DefaultInstance;
        var dataRef = db.GetReference("editor-managed/config");
        dataRef.SetValueAsync(new { version = "1.0.0", last_updated = System.DateTime.Now }).Wait();

        EditorUtility.DisplayDialog("Success", "数据已成功写入Firebase数据库!", "OK");
    }
}

注意事项:

  • 编辑器脚本是同步环境,所以用.Wait()阻塞等待异步操作完成(不要直接用async/await,会导致Unity编辑器无响应)。
  • 确保导入的DLL和Unity当前设置的.NET版本兼容(比如Unity 2022+推荐.NET 6)。
方案2:直接调用Firebase Database REST API

如果不想导入额外SDK,可以直接用REST API和Unity的UnityWebRequest(编辑器环境也支持)来实现读写,完全绕开Firebase Unity SDK的Runtime依赖。

核心思路:

  1. 用服务账号密钥生成访问令牌(用于身份验证)。
  2. 构造REST请求发送到Firebase数据库的URL。

示例代码:

using UnityEngine.Networking;
using UnityEditor;
using System.Threading.Tasks;
using Google.Apis.Auth.OAuth2;

public class FirebaseRestEditorTools
{
    private const string DatabaseUrl = "https://your-project-id.firebaseio.com/";
    private const string ServiceAccountPath = "Assets/Editor/your-service-account-key.json";

    [MenuItem("Tools/Firebase/Write Data via REST")]
    public static async void WriteData()
    {
        var accessToken = await GetServiceAccountToken();
        var targetPath = "editor-test/data.json";
        
        using (var request = UnityWebRequest.Put($"{DatabaseUrl}{targetPath}", "{\"message\":\"Hello from Unity Editor!\"}"))
        {
            request.SetRequestHeader("Authorization", $"Bearer {accessToken}");
            await request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.Success)
            {
                EditorUtility.DisplayDialog("Success", "REST请求写入成功!", "OK");
            }
            else
            {
                EditorUtility.DisplayDialog("Error", $"写入失败:{request.error}", "OK");
            }
        }
    }

    // 生成服务账号访问令牌
    private static async Task<string> GetServiceAccountToken()
    {
        var credential = GoogleCredential.FromFile(ServiceAccountPath)
            .CreateScoped(new[] { "https://www.googleapis.com/auth/firebase.database" });
        var token = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync();
        return token;
    }
}
不推荐的方案:修改Firebase Unity SDK

你也可以尝试反编译并修改Firebase Unity SDK的初始化代码,跳过DontDestroyOnLoad的调用,但这种方式风险极高——SDK更新后你的修改会被覆盖,还可能引入未知的稳定性问题,绝对不适合工业项目。

总结

工业项目里优先选Firebase Admin SDK方案,它官方支持、代码简洁,维护成本低;REST API作为备选,适合不想导入额外依赖的场景。完全没必要切换到Python脚本,纯C#就能完美解决问题。

内容的提问来源于stack exchange,提问作者Louis Petitjean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:54:21