Unity中Firebase开发与生产环境多google-services.json文件配置问题
解决Unity中Firebase多环境(开发/生产)Storage配置切换问题
你的问题核心在于Firebase默认会自动读取google-services.json的配置,而Unity生成的build.gradle又会覆盖你手动修改的变体配置,所以手动初始化FirebaseApp是最可靠的方案——完全通过代码控制环境配置,不会受自动生成文件的影响。下面是具体的实现步骤和优化方案:
1. 完善环境配置参数
首先把你已经写的APIConfig类补全,填入两个环境对应的Firebase配置信息(这些信息可以直接从各自的google-services.json里提取):
public static class APIConfig { #if DEVELOPMENT_BUILD || UNITY_EDITOR public static string apiKey = "你的开发环境apiKey"; public static string authDomain = "你的开发环境authDomain"; public static string databaseURL = "你的开发环境databaseURL"; public static string projectId = "你的开发环境projectId"; public static string storageBucket = "你的开发环境storageBucket"; // 格式:xxx.appspot.com public static string messagingSenderId = "你的开发环境messagingSenderId"; #else public static string apiKey = "你的生产环境apiKey"; public static string authDomain = "你的生产环境authDomain"; public static string databaseURL = "你的生产环境databaseURL"; public static string projectId = "你的生产环境projectId"; public static string storageBucket = "你的生产环境storageBucket"; public static string messagingSenderId = "你的生产环境messagingSenderId"; #endif }
2. 手动初始化FirebaseApp(关键步骤)
创建一个启动脚本(比如FirebaseBootstrap.cs),放在游戏启动的第一个场景中,设置脚本执行顺序为最优先(确保在任何Firebase服务初始化前运行),在Awake方法中手动初始化FirebaseApp:
using Firebase; using Firebase.Storage; using UnityEngine; public class FirebaseBootstrap : MonoBehaviour { private void Awake() { // 避免重复初始化 if (FirebaseApp.DefaultInstance != null) return; // 根据当前环境构建Firebase配置选项 var firebaseOptions = new FirebaseOptions { ApiKey = APIConfig.apiKey, AuthDomain = APIConfig.authDomain, DatabaseUrl = APIConfig.databaseURL, ProjectId = APIConfig.projectId, StorageBucket = APIConfig.storageBucket, MessagingSenderId = APIConfig.messagingSenderId }; // 创建默认Firebase实例,后续所有Firebase服务都会使用这个配置 FirebaseApp.Create(firebaseOptions); } }
重要设置:关闭自动初始化
打开Unity的Firebase设置面板(Window > Firebase > Settings),找到Auto Initialize Firebase选项并取消勾选——如果不关闭,Firebase会优先自动读取默认的google-services.json,覆盖我们的手动配置。
3. 优化Storage初始化代码
现在FirebaseStorage.DefaultInstance已经会自动使用我们配置的环境参数,你可以简化FBStorage类的代码,不用再硬写存储桶链接:
private FBStorage() { // 直接获取配置好的默认Storage实例 storage = FirebaseStorage.DefaultInstance; // 直接获取根存储引用,无需硬写gs://链接(更安全) root_storage_ref = storage.RootReference; // 或者如果你需要指定子路径,比如:root_storage_ref = storage.GetReference("your-sub-path"); }
为什么这是最优方案?
- 不受Unity自动生成文件影响:不需要修改
build.gradle,完全规避了文件被覆盖的问题 - 和现有代码逻辑兼容:沿用你已经在用的预处理指令切换环境,学习成本低
- 配置集中管理:所有环境的配置都在
APIConfig里,后续修改或新增环境都很方便 - 避免硬编码错误:不用手动写
gs://链接,直接用Firebase实例的默认配置,减少人为失误
额外说明:多实例场景(如果需要)
如果你需要同时连接两个Firebase环境(比如开发和生产同时使用),可以给实例指定名称:
// 创建开发环境实例 var devApp = FirebaseApp.Create(devOptions, "Development"); // 获取对应实例的Storage var devStorage = FirebaseStorage.GetInstance(devApp);
但你的场景是切换环境,所以用DefaultInstance就足够了。
内容的提问来源于stack exchange,提问作者mushter
相关产品推荐
相关产品推荐

