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

如何解决Unity接入Firebase实现登录注册时出现的空引用报错问题

问题根因

你遇到的空引用报错是auth变量未完成初始化就被调用导致的,核心问题有两个:

  1. Firebase的依赖检查和初始化是异步操作,你没有做「初始化完成前禁止点击登录/注册按钮」的逻辑,用户点击按钮时auth还没被赋值
  2. 现有代码的依赖检查逻辑不完整,没有处理依赖修复失败、初始化失败的分支,同时依赖检查的执行位置、线程调度也存在错误。

可直接落地的修复步骤

  • 第一步:补全FirebaseManager的基础逻辑,修正初始化流程,新增初始化完成标记
public class FirebaseManager : MonoBehaviour
{
    public static FirebaseManager instance;
    // 新增初始化完成标记
    public bool isFirebaseReady = false;
    public FirebaseAuth auth;
    public FirebaseUser user;

    private void Awake()
    {
        // 补全单例逻辑
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
            // 触发依赖检查,不要将依赖检查代码直接写在类成员定义位置
            CheckFirebaseDependencies();
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void CheckFirebaseDependencies()
    {
        // 使用ContinueWithOnMainThread避免后台线程操作Unity对象的问题
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(checkDependencyTask =>
        {
            if (checkDependencyTask.IsCompletedSuccessfully)
            {
                var dependencyStatus = checkDependencyTask.Result;
                if (dependencyStatus == DependencyStatus.Available)
                {
                    InitializeFirebase();
                    isFirebaseReady = true;
                    // 此处可自行添加逻辑,将登录、注册按钮改为可点击状态
                }
                else
                {
                    Debug.LogError($"Firebase依赖不可用:{dependencyStatus}");
                    // 此处可自行添加用户提示,告知登录注册功能暂时不可用
                }
            }
            else
            {
                Debug.LogError($"Firebase依赖检查失败:{checkDependencyTask.Exception}");
            }
        });
    }

    // 剩余的InitializeFirebase、RegisterLogic等原有逻辑保持不变即可
}
  • 第二步:添加按钮状态控制
    登录、注册按钮默认设置interactable = false,等isFirebaseReady变为true后再修改为可点击状态,避免用户在初始化未完成时点击触发空引用。

  • 第三步:添加调用前的防御判断
    在调用auth相关方法前加校验,避免极端情况报错,以注册按钮为例:

public void RegisterButton()
{
    if (!isFirebaseReady || auth == null)
    {
        registerOutputText.text = "服务初始化中,请稍后再试";
        return;
    }
    StartCoroutine(RegisterLogic(registerUsername.text, registerEmail.text, registerPassword.text, registerConfirmPassword.text));
}
  • 第四步:排查小概率配置问题
    如果上述修改后仍有报错,检查两个配置项:
    1. 你下载的google-services.json(安卓端)/GoogleService-Info.plist(iOS端)是否和Firebase后台创建应用时填写的包名完全匹配
    2. 打开Firebase后台的Auth模块,确认已经开启了「邮箱/密码」登录方式

内容的提问来源于stack exchange,提问作者Brian Wiggins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:54:03