在 Unity 中开始使用 Firebase 身份验证

您可以使用 Firebase 身份验证允许用户通过一种或多种登录方式(包括电子邮件地址和密码登录)以及联合身份提供方服务(如 Google 登录和 Facebook 登录)登录到您的游戏。本教程将向您展示如何向您的游戏添加电子邮件地址和密码登录功能,以开始使用 Firebase Authentication。

准备工作

在使用 Firebase Authentication 之前,您需要先完成以下步骤:

  • 注册 Unity 项目并将其配置为使用 Firebase。

    • 如果您的 Unity 项目已在使用 Firebase,那么该项目已经注册并已配置为使用 Firebase。

    • 如果您没有 Unity 项目,则可以下载示例应用

  • Firebase Unity SDK(具体而言是 FirebaseAuth.unitypackage)添加到您的 Unity 项目中。

请注意,将 Firebase 添加到 Unity 项目需要在 Firebase 控制台中和打开的 Unity 项目中执行若干任务(例如,从控制台下载 Firebase 配置文件,然后将配置文件移动到 Unity 项目中)。

注册新用户

创建一个表单,允许新用户使用他们的电子邮件地址和密码向您的游戏注册。当用户填好该表单后,验证用户提供的电子邮件地址和密码,然后将其传递给 CreateUserWithEmailAndPasswordAsync 方法:

auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("CreateUserWithEmailAndPasswordAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("CreateUserWithEmailAndPasswordAsync encountered an error: " + task.Exception);
    return;
  }

  // Firebase user has been created.
  Firebase.Auth.AuthResult result = task.Result;
  Debug.LogFormat("Firebase user created successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});

登录现有用户

创建一个表单,允许现有用户使用自己的电子邮件地址和密码登录。当用户填好该表单后,调用 SignInWithEmailAndPasswordAsync 方法:

auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("SignInWithEmailAndPasswordAsync encountered an error: " + task.Exception);
    return;
  }

  Firebase.Auth.AuthResult result = task.Result;
  Debug.LogFormat("User signed in successfully: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});

设置身份验证状态更改事件处理程序并获取用户数据

要响应帐号登录和退出事件,请将事件处理程序附加到全局身份验证对象。每当用户的登录状态发生变化时,系统都会调用此处理程序。处理程序仅在身份验证对象完全初始化且所有网络调用完成后才运行,因此它是获取登录用户信息的较佳位置。

使用 FirebaseAuth 对象的 StateChanged 字段注册事件处理程序。当用户成功登录时,您可以在事件处理程序中获取用户的相关信息。

最后,当此对象对其调用 Destroy 时,它会自动调用 OnDestroy。清理 OnDestroy 中 Auth 对象的引用。

void InitializeFirebase() {
  auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
  auth.StateChanged += AuthStateChanged;
  AuthStateChanged(this, null);
}

void AuthStateChanged(object sender, System.EventArgs eventArgs) {
  if (auth.CurrentUser != user) {
    bool signedIn = user != auth.CurrentUser && auth.CurrentUser != null
        && auth.CurrentUser.IsValid();
    if (!signedIn && user != null) {
      DebugLog("Signed out " + user.UserId);
    }
    user = auth.CurrentUser;
    if (signedIn) {
      DebugLog("Signed in " + user.UserId);
      displayName = user.DisplayName ?? "";
      emailAddress = user.Email ?? "";
      photoUrl = user.PhotoUrl ?? "";
    }
  }
}

void OnDestroy() {
  auth.StateChanged -= AuthStateChanged;
  auth = null;
}

后续步骤

了解如何添加对其他身份提供方和匿名访客帐号的支持: