如何解决Unity WebGL集成Firebase时的‘firebase is not defined’错误?
问题原因与解决方法
Firebase 9.x采用模块化API设计,不再像旧版本那样暴露全局的firebase对象,你在jslib里直接调用firebase.database()自然会提示未定义。下面是具体的修正步骤:
1. 修正HTML中的Firebase初始化代码
你需要导入Firebase 9的具体模块,并将封装好的操作方法挂载到window全局对象,让jslib能够访问:
<script type="module"> // 按需导入Firebase模块 import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; import { getDatabase, ref, set } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-database.js"; // 你的Firebase配置 const firebaseConfig = { apiKey: "你的API_KEY", authDomain: "你的AUTH_DOMAIN", databaseURL: "你的DATABASE_URL", projectId: "你的PROJECT_ID", storageBucket: "你的STORAGE_BUCKET", messagingSenderId: "你的SENDER_ID", appId: "你的APP_ID" }; // 初始化Firebase应用 const app = initializeApp(firebaseConfig); const db = getDatabase(app); // 封装数据提交函数,挂载到window供jslib调用 window.submitToFirebase = async (dbPath, data) => { try { await set(ref(db, dbPath), data); console.log("数据提交成功"); return true; } catch (err) { console.error("提交失败:", err); return false; } }; </script>
2. 修改jslib脚本中的调用逻辑
不要直接调用firebase.database(),而是调用我们挂载到window的封装函数:
mergeInto(LibraryManager.library, { // 示例:接收Unity传递的路径和数据,提交到Firebase SubmitDataToFirebase: function(pathPtr, dataPtr) { // 把Unity传递的指针转成字符串 const dbPath = Pointer_stringify(pathPtr); const data = Pointer_stringify(dataPtr); // 调用全局的提交函数 window.submitToFirebase(dbPath, data).then(success => { // 可选:回调通知Unity操作结果 // 比如通过SendMessage给Unity的某个GameObject发消息 if (success) { SendMessage("FirebaseManager", "OnSubmitSuccess", ""); } else { SendMessage("FirebaseManager", "OnSubmitFailed", ""); } }); } });
3. 关键注意事项
- 确保HTML中的Firebase模块脚本在Unity的WebGL加载脚本(比如
UnityLoader.js)之前执行,避免初始化未完成就调用方法。 - 测试阶段检查Firebase实时数据库的规则设置,如果是默认的严格规则,会导致提交失败,可以暂时改为:
上线前务必修改为符合需求的安全规则。{ "rules": { ".read": true, ".write": true } } - 不要尝试在jslib中直接导入Firebase模块,jslib的运行环境无法识别ES模块语法,必须通过全局对象共享实例或方法。
内容的提问来源于stack exchange,提问作者geodash
相关产品推荐
相关产品推荐

