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组件,完全可以在编辑器脚本里使用,官方支持性也强。
实现步骤:
- 从Firebase控制台下载服务账号密钥(JSON格式),放在Unity项目的
Assets/Editor目录下(记得不要把这个文件打包进Build,也别提交到公开版本库)。 - 导入Firebase Admin SDK的.NET包:可以通过NuGet下载
FirebaseAdmin和Google.Apis.Auth相关DLL,然后把兼容Unity.NET版本的DLL复制到Editor目录。 - 编写编辑器脚本调用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依赖。
核心思路:
- 用服务账号密钥生成访问令牌(用于身份验证)。
- 构造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
相关产品推荐
相关产品推荐

