Firebase认证出现NullReferenceException,求排查Unity配置或代码问题
Hey,我之前在Unity里折腾Firebase Auth的时候也碰到过一模一样的空引用错误,大概率是下面几个常见坑之一,咱们一步步排查:
1. Firebase Auth实例还没初始化就被调用了
你直接在代码开头就赋值auth = Firebase.Auth.FirebaseAuth.DefaultInstance,但Firebase在Unity里需要先完成依赖检查和初始化流程——如果FirebaseApp还没准备好,DefaultInstance会返回null,这时候调用auth.CreateUserWithEmailAndPasswordAsync肯定会炸。
解决办法:
把Auth实例的初始化放在Firebase依赖检查完成之后,比如在Start()方法里做:
private Firebase.Auth.FirebaseAuth auth; void Start() { // 先检查并修复Firebase依赖,确保初始化完成 Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => { var dependencyStatus = task.Result; if (dependencyStatus == Firebase.DependencyStatus.Available) { // 现在可以安全获取Auth实例了 auth = Firebase.Auth.FirebaseAuth.DefaultInstance; Debug.Log("Firebase Auth initialized successfully!"); } else { Debug.LogError($"Failed to resolve Firebase dependencies: {dependencyStatus}"); } }); }
2. UI输入控件没赋值,导致m_Emailadress或m_RegisterPassword为null
你代码里用了m_Emailadress.ToString()和m_RegisterPassword.ToString(),如果这两个是Unity的InputField控件,但你没在Inspector面板给它们拖入对应的组件,那调用ToString()的时候就会触发空引用。
另外提个小细节:InputField的文本不用ToString(),直接用.text属性就行,ToString()反而可能搞出问题。
解决办法:
- 先去Inspector面板,确认
m_Emailadress和m_RegisterPassword已经关联了场景里的InputField; - 在使用前加个null检查,避免崩溃:
public void FirebaseInfo() { // 先检查输入控件是否存在 if (m_Emailadress == null || m_RegisterPassword == null) { Debug.LogError("Email或Password输入框没赋值啊兄弟!"); return; } email = m_Emailadress.text; password = m_RegisterPassword.text; // 这里再确保auth实例不为null if (auth == null) { Debug.LogError("Firebase Auth实例还没初始化完成!"); return; } auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task => { // 你的现有代码... }); }
3. 线程上下文的小坑(次要但值得注意)
虽然你的错误是空引用,但后续如果在ContinueWith里要访问Unity的UI元素,可能会因为后台线程执行而出问题。可以加上TaskScheduler.FromCurrentSynchronizationContext()确保回到主线程执行:
auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task => { // 你的现有代码... }, TaskScheduler.FromCurrentSynchronizationContext());
排查优先级
先检查UI控件有没有赋值(这个是新手最容易踩的坑),再确认Firebase的初始化流程是否正确,基本上就能解决问题了。
内容的提问来源于stack exchange,提问作者thefudgeishot

