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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:24:21