Unity Firebase登录注册项目出现6个IEnumerator相关错误求助
Unity Firebase登录注册项目IEnumerator相关错误排查
错误根源定位
你遇到的6个IEnumerator相关编译错误,核心原因是FirebaseManager脚本的RegisterLogic方法中,UserProfile对象初始化时存在语法错误:在设置PhotoUrl的行末尾多了一个分号,破坏了对象初始化器的语法结构,导致整个方法无法正确编译,进而引发一系列关联的IEnumerator相关报错。
修复方案
1. 修正RegisterLogic中的语法错误
找到FirebaseManager脚本里RegisterLogic方法中初始化UserProfile的代码段,删除PhotoUrl行末尾多余的分号:
错误代码:
UserProfile profile = new UserProfile { DisplayName = _username, PhotoUrl = new System.Uri("https://t4.ftcdn.net/jpg/02/29/75/83/360_F_229758328_7x8jwCwjtBMmC6rgFzLFhZoEpLobB6L8.jpg"); };
修复后代码:
UserProfile profile = new UserProfile { DisplayName = _username, PhotoUrl = new System.Uri("https://t4.ftcdn.net/jpg/02/29/75/83/360_F_229758328_7x8jwCwjtBMmC6rgFzLFhZoEpLobB6L8.jpg") };
2. 其他潜在问题修正(可选优化)
- 在
CheckAutoLogin方法中,初始状态下user为null,直接执行user.ReloadAsync()会引发空引用异常,建议先通过auth.CurrentUser获取当前用户再进行判断:
private IEnumerator CheckAutoLogin() { yield return new WaitForEndOfFrame(); user = auth.CurrentUser; // 先获取当前用户 if (user != null) { var reloadUserTask = user.ReloadAsync(); yield return new WaitUntil(() => reloadUserTask.IsCompleted); AutoLogin(); } else { AuthUIManager.instance.LoginScreen(); } }
- 在
LoginLogic方法的成功分支中,登录完成后需要更新user引用:
else { user = auth.CurrentUser; // 更新user引用 if (user.IsEmailVerified) { yield return new WaitForSeconds(1f); GameManager.instance.ChangeScene(1); } else { StartCoroutine(SendVerificationEmail()); } }
修复后的完整脚本
FirebaseManager脚本
using UnityEngine; using System.Collections; using Firebase; using Firebase.Auth; using TMPro; public class FirebaseManager : MonoBehaviour { public static FirebaseManager instance; [Header("Firebase")] public FirebaseAuth auth; public FirebaseUser user; [Space(5f)] [Header("登录界面引用")] [SerializeField] private TMP_InputField loginEmail; [SerializeField] private TMP_InputField loginPassword; [SerializeField] private TMP_Text loginOutputText; [Space(5f)] [Header("注册界面引用")] [SerializeField] private TMP_InputField registerUsername; [SerializeField] private TMP_InputField registerEmail; [SerializeField] private TMP_InputField registerPassword; [SerializeField] private TMP_InputField registerConfirmPassword; [SerializeField] private TMP_Text registerOutputText; private void Awake() { DontDestroyOnLoad(gameObject); if (instance == null) { instance = this; } else if (instance != this) { Destroy(instance.gameObject); instance = this; } } private void Start() { StartCoroutine(CheckAndFixDependancies()); } private IEnumerator CheckAndFixDependancies() { var checkAndFixDependanciesTask = FirebaseApp.CheckAndFixDependenciesAsync(); yield return new WaitUntil(() => checkAndFixDependanciesTask.IsCompleted); var dependancyResult = checkAndFixDependanciesTask.Result; if (dependancyResult == DependencyStatus.Available) { InitializeFirebase(); } else { Debug.LogError($"无法解析所有Firebase依赖项: {dependancyResult}"); } } private void InitializeFirebase() { auth = FirebaseAuth.DefaultInstance; StartCoroutine(CheckAutoLogin()); auth.StateChanged += AuthStateChanged; AuthStateChanged(this, null); } private IEnumerator CheckAutoLogin() { yield return new WaitForEndOfFrame(); user = auth.CurrentUser; if (user != null) { var reloadUserTask = user.ReloadAsync(); yield return new WaitUntil(() => reloadUserTask.IsCompleted); AutoLogin(); } else { AuthUIManager.instance.LoginScreen(); } } private void AutoLogin() { if (user != null) { if (user.IsEmailVerified) { GameManager.instance.ChangeScene(1); } else { StartCoroutine(SendVerificationEmail()); } } else { AuthUIManager.instance.LoginScreen(); } } private void AuthStateChanged(object sender, System.EventArgs eventArgs) { if (auth.CurrentUser != user) { bool signedIn = user != auth.CurrentUser && auth.CurrentUser != null; if (!signedIn && user != null) { Debug.Log("已登出"); // 在此添加登出相关逻辑 } user = auth.CurrentUser; if (signedIn) { Debug.Log($"已登录: {user.DisplayName}"); } } } public void ClearOutputs() { loginOutputText.text = ""; registerOutputText.text = ""; } public void LoginButton() { StartCoroutine(LoginLogic(loginEmail.text, loginPassword.text)); } public void RegisterButton() { StartCoroutine(RegisterLogic(registerUsername.text, registerEmail.text, registerPassword.text, registerConfirmPassword.text)); } private IEnumerator LoginLogic(string _email, string _password) { Credential credential = EmailAuthProvider.GetCredential(_email, _password); var loginTask = auth.SignInWithCredentialAsync(credential); yield return new WaitUntil(() => loginTask.IsCompleted); if (loginTask.Exception != null) { FirebaseException firebaseException = (FirebaseException)loginTask.Exception.GetBaseException(); AuthError error = (AuthError)firebaseException.ErrorCode; string output = "未知错误,请重试"; switch (error) { case AuthError.MissingEmail: output = "请输入邮箱"; break; case AuthError.MissingPassword: output = "请输入密码"; break; case AuthError.InvalidEmail: output = "无效邮箱"; break; case AuthError.WrongPassword: output = "密码错误"; break; case AuthError.UserNotFound: output = "账号不存在"; break; } loginOutputText.text = output; } else { user = auth.CurrentUser; if (user.IsEmailVerified) { yield return new WaitForSeconds(1f); GameManager.instance.ChangeScene(1); } else { StartCoroutine(SendVerificationEmail()); } } } private IEnumerator RegisterLogic(string _username, string _email, string _password, string _confirmPassword) { if (_username == "") { registerOutputText.text = "请输入用户名"; } else if (_password != _confirmPassword) { registerOutputText.text = "密码不匹配!"; } // else if (_username.ToLower() == "bad word") // { // registerOutputText.text = "该用户名不合适"; // } else { var registerTask = auth.CreateUserWithEmailAndPasswordAsync(_email, _password); yield return new WaitUntil(() => registerTask.IsCompleted); if (registerTask.Exception != null) { FirebaseException firebaseException = (FirebaseException)registerTask.Exception.GetBaseException(); AuthError error = (AuthError)firebaseException.ErrorCode; string output = "未知错误,请重试"; switch (error) { case AuthError.InvalidEmail: output = "无效邮箱"; break; case AuthError.EmailAlreadyInUse: output = "该邮箱已被使用"; break; case AuthError.WeakPassword: output = "密码强度不足,请包含大写字母、数字和特殊符号"; break; case AuthError.MissingEmail: output = "请输入邮箱"; break; case AuthError.MissingPassword: output = "请输入密码"; break; } registerOutputText.text = output; } else { user = auth.CurrentUser; UserProfile profile = new UserProfile { DisplayName = _username, PhotoUrl = new System.Uri("https://t4.ftcdn.net/jpg/02/29/75/83/360_F_229758328_7x8jwCwjtBMmC6rgFzLFhZoEpLobB6L8.jpg") }; var defaultUserTask = user.UpdateUserProfileAsync(profile); yield return new WaitUntil(() => defaultUserTask.IsCompleted); if (defaultUserTask.Exception != null) { user.DeleteAsync(); FirebaseException firebaseException = (FirebaseException)defaultUserTask.Exception.GetBaseException(); AuthError error = (AuthError)firebaseException.ErrorCode; string output = "未知错误,请重试"; switch (error) { case AuthError.Cancelled: output = "更新用户信息已取消"; break; case AuthError.SessionExpired: output = "会话已过期"; break; } registerOutputText.text = output; } else { Debug.Log($"Firebase用户创建成功: {user.DisplayName} ({user.UserId})"); StartCoroutine(SendVerificationEmail()); } } } } private IEnumerator SendVerificationEmail() { if (user != null) { var emailTask = user.SendEmailVerificationAsync(); yield return new WaitUntil(() => emailTask.IsCompleted); if (emailTask.Exception != null) { FirebaseException firebaseException = (FirebaseException)emailTask.Exception.GetBaseException(); AuthError error = (AuthError)firebaseException.ErrorCode; string output = "未知错误,请重试!"; switch (error) { case AuthError.Cancelled: output = "验证邮件发送任务已取消"; break; case AuthError.InvalidRecipientEmail: output = "无效邮箱"; break; case AuthError.TooManyRequests: output = "请求过于频繁"; break; } AuthUIManager.instance.AwaitVerification(false, user.Email, output); } else { AuthUIManager.instance.AwaitVerification(true, user.Email, null); Debug.Log("验证邮件发送成功"); } } } public void UpdateProfilePicture(string _newPfpURL) { StartCoroutine(UpdateProfilePictureLogic(_newPfpURL)); } private IEnumerator UpdateProfilePictureLogic(string _newPfpURL) { if (user != null) { UserProfile profile = new UserProfile(); try { UserProfile _profile = new UserProfile { PhotoUrl = new System.Uri(_newPfpURL), }; profile = _profile; } catch { // LobbyManager.instance.Output("获取图片失败,请确保链接有效!"); yield break; } var pfpTask = user.UpdateProfileAsync(profile); yield return new WaitUntil(() => pfpTask.IsCompleted); if (pfpTask.Exception != null) { Debug.LogError($"更新头像失败: {pfpTask.Exception}"); } else { // LobbyManager.instance.ChangePfpSuccess(); Debug.Log("头像更新成功"); } } } }
AuthUIManager脚本
using TMPro; using UnityEngine; public class AuthUIManager : MonoBehaviour { public static AuthUIManager instance; [Header("UI引用")] [SerializeField] private GameObject checkingForAccountUI; [SerializeField] private GameObject loginUI; [SerializeField] private GameObject registerUI; [SerializeField] private GameObject verifyEmailUI; [SerializeField] private TMP_Text verifyEmailText; private void Awake() { if (instance == null) { instance = this; } else if (instance != this) { Destroy(gameObject); } } private void ClearUI() { loginUI.SetActive(false); registerUI.SetActive(false); verifyEmailUI.SetActive(false); FirebaseManager.instance.ClearOutputs(); checkingForAccountUI.SetActive(false); } public void LoginScreen() { ClearUI(); loginUI.SetActive(true); } public void RegisterScreen() { ClearUI(); registerUI.SetActive(true); } public void AwaitVerification(bool _emailSent, string _email, string _output) { ClearUI(); verifyEmailUI.SetActive(true); if (_emailSent) { verifyEmailText.text = $"邮件已发送!\n请验证邮箱 {_email}"; } else { verifyEmailText.text = $"邮件发送失败: {_output}\n请验证邮箱 {_email}"; } } }
内容的提问来源于stack exchange,提问作者thewebsitelearner
相关产品推荐
相关产品推荐

