Google 致力于为黑人社区推动种族平等。查看具体举措

使用 Google Play 游戏服务在 Unity 中进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以使用 Google Play 游戏服务让玩家登录基于 Firebase 和 Unity 构建的 Android 游戏。要使用通过 Firebase 登录的 Google Play Games 服务,请先使用 Google Play Games 登录播放器,然后在执行此操作时请求 OAuth 2.0 身份验证代码。然后,将身份验证代码传递给PlayGamesAuthProvider以生成 Firebase 凭据,您可以使用该凭据向 Firebase 进行身份验证。

在你开始之前

设置您的 Unity 项目

  1. 将 Firebase 配置文件和 Firebase Unity SDK 添加到您的 Unity 项目中,如将 Firebase 添加到您的 Unity 项目中所述。按照 Android 的说明进行操作。

    请务必导入FirebaseAuth.unitypackage

  2. 在 Unity 编辑器中,在Build Settings > Player Settings > Other Settings下设置游戏的 Android 包名称。

  3. 然后,在Build Settings > Player Settings > Publishing Settings下,选择或创建一个密钥库和密钥,它们将用于签署您的 Android 包。必须为您的 APK 签名才能登录 Play 游戏 - 此要求不仅适用于发布,还适用于您的游戏开发期间。

设置您的 Firebase 项目

  1. Firebase 控制台中,转到您在其中注册 Unity 项目的 Firebase 项目。

  2. 使用您在 Unity 中设置的密钥,从 Firebase 控制台的设置页面设置游戏的 SHA-1 指纹。

    您可以使用keytool命令获取密钥的 SHA-1 指纹:

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

    或者,您可以使用 gradle signingReport命令获取签名证书的 SHA 哈希:

    gradlew signingReport

    您的 APK 必须使用此密钥进行签名,包括在开发期间。

  3. 启用 Google Play Games 作为登录提供商:

    1. 查找项目的 Web 服务器客户端 ID 和客户端密码。 Web 服务器客户端 ID 向 Google Play 身份验证服务器标识您的 Firebase 项目。

      要找到这些值:

      1. Google API 控制台凭据页面中打开您的 Firebase 项目。
      2. OAuth 2.0 客户端 ID部分中,打开Web 客户端(由 Google 服务自动创建)详细信息页面。此页面列出了您的 Web 服务器客户端 ID 和密码。
    2. 然后,在Firebase 控制台中,打开身份验证部分。

    3. 登录方法选项卡上,启用Play Games登录提供程序。您需要指定您从 API 控制台获得的项目的 Web 服务器客户端 ID 和客户端密码。

使用您的 Firebase 应用信息配置 Play 游戏服务

  1. Google Play Console中,打开您的 Google Play 应用程序或创建一个。

  2. 在“发展”部分中,单击Play 游戏服务 > 设置和管理 > 配置

  3. 点击是,我的游戏已经使用 Google API ,从列表中选择您的 Firebase 项目,然后点击使用

  4. 在 Play 游戏服务配置页面上,单击添加凭据

    1. 选择游戏服务器类型。
    2. OAuth 客户端字段中,选择您项目的 Web 客户端 ID。请确保这与您在启用 Play 游戏登录时指定的客户端 ID 相同。
    3. 保存您的更改。
  5. 仍在 Play 游戏服务配置页面上,再次单击添加凭据

    1. 选择安卓类型。
    2. OAuth 客户端字段中,选择您项目的 Android 客户端 ID。 (如果您没有看到您的 Android 客户端 ID,请确保您在 Firebase 控制台中设置了游戏的 SHA-1 指纹。)
    3. 保存您的更改。
  6. EventsAchievementsLeaderboards页面上,创建您想在游戏中使用的任何 Play 游戏资源(如果您不想立即使用任何资源,可以创建一个占位符条目)。然后,在任何事件成就排行榜页面上,单击获取资源并将 Android 资源片段复制到方便的位置。您将需要该代码段来设置 Google Play 游戏服务插件。

    资源片段类似于以下示例:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    Google Play game services IDs.
    Save this file as res/values/games-ids.xml in your project.
    -->
    <resources>
      <!-- app_id -->
      <string name="app_id" translatable="false">123456789000</string>
      <!-- package_name -->
      <string name="package_name" translatable="false">com.example.game</string>
      <!-- event Wiped Raid -->
      <string name="event_wiped_raid" translatable="false">CgkIpKjv1a4PEAIYBA</string>
    </resources>
    
  7. 在“测试人员”页面上,添加需要能够在您的游戏发布到 Play 商店之前登录到您的游戏的任何用户的电子邮件地址。

将 Play 游戏登录功能集成到您的游戏中

  1. 下载适用于 Unity 的 Play Games 插件的最新版本并解压。

  2. 将插件的 Unity 包导入您的 Unity 项目。您可以在发布存档的current-build目录中找到 Unity 包。

  3. 设置 Play 游戏插件:

    1. 单击窗口 > Google Play 游戏 > 设置 > Android 设置以打开Android 配置屏幕。
    2. 将从 Play 控制台获取的 Android 资源片段粘贴到Resources Definition字段中。
    3. 将您在 Firebase 控制台中启用 Play Games 登录时提供的网络服务器客户端 ID 粘贴到客户端 ID字段中。
    4. 单击设置
  4. 在您的游戏中,配置一个启用了RequestServerAuthCode设置的 Play Games 客户端:

    using GooglePlayGames;
    using GooglePlayGames.BasicApi;
    using UnityEngine.SocialPlatforms;
    using System.Threading.Tasks;
    
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        .RequestServerAuthCode(false /* Don't force refresh */)
        .Build();
    
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    
  5. 然后,当玩家选择使用 Play 游戏登录时,调用Social.localUser.Authenticate()

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

使用 Firebase 进行身份验证

将 Play Games 登录添加到您的游戏后,您可以使用 Play Games 服务中的身份验证代码向 Firebase 进行身份验证。

  1. 玩家使用 Play 游戏成功登录后,在登录继续处理程序中,获取玩家帐户的验证码:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. 然后,将 Play Games 服务中的身份验证代码交换为 Firebase 凭据,并使用 Firebase 凭据对玩家进行身份验证:

    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    Firebase.Auth.Credential credential =
        Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

下一步

用户首次登录后,系统会创建一个新用户帐户并将其关联到他们的 Play 游戏 ID。这个新帐户存储为 Firebase 项目的一部分,可用于在项目中的每个应用中识别用户。

在您的游戏中,您可以从Firebase.Auth.FirebaseUser对象获取用户的 Firebase UID:

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null) {
  string playerName = user.DisplayName;

  // The user's Id, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server, if you
  // have one; use User.TokenAsync() instead.
  string uid = user.UserId;
}

在您的 Firebase 实时数据库和云存储安全规则中,您可以从auth变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。

要获取用户的 Play Games 玩家信息或访问 Play Games 服务,请使用 Play Games 插件提供的 API。

要注销用户,请调用SignOut()

auth.SignOut();