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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:22:41