如何解决Unity接入Firebase实现登录注册时出现的空引用报错问题
问题根因
你遇到的空引用报错是auth变量未完成初始化就被调用导致的,核心问题有两个:
- Firebase的依赖检查和初始化是异步操作,你没有做「初始化完成前禁止点击登录/注册按钮」的逻辑,用户点击按钮时
auth还没被赋值 - 现有代码的依赖检查逻辑不完整,没有处理依赖修复失败、初始化失败的分支,同时依赖检查的执行位置、线程调度也存在错误。
可直接落地的修复步骤
- 第一步:补全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)); }
- 第四步:排查小概率配置问题
如果上述修改后仍有报错,检查两个配置项:- 你下载的
google-services.json(安卓端)/GoogleService-Info.plist(iOS端)是否和Firebase后台创建应用时填写的包名完全匹配 - 打开Firebase后台的Auth模块,确认已经开启了「邮箱/密码」登录方式
- 你下载的
内容的提问来源于stack exchange,提问作者Brian Wiggins
相关产品推荐
相关产品推荐

