您可以使用 Google Play 游戏服务,使玩家能够登录在 Firebase 和 Unity 基础上构建的 Android 游戏。要搭配 Firebase 使用 Google Play 游戏服务的登录机制,请首先让玩家登录 Google Play 游戏,并同时申请一个 OAuth 2.0 身份验证代码。然后,将此身份验证代码传递给 PlayGamesAuthProvider
以生成一个 Firebase 凭据,您可以使用该凭据进行 Firebase 身份验证。
准备工作
设置您的 Unity 项目
将 Firebase 配置文件和 Firebase Unity SDK 添加到 Unity 项目中(如将 Firebase 添加到 Unity 项目中所述)。按照适用于 Android 的说明操作。
请务必导入
FirebaseAuth.unitypackage
。在 Unity Editor 中,在 Build Settings(构建设置)> Player Settings(玩家设置)> Other Settings (其他设置) 下,设置游戏的 Android 软件包名称。
然后,在 Build Settings(构建设置)> Player Settings(玩家设置)> Publishing Settings(发布设置) 下,选择或创建一个密钥库和密钥,它们将用于签署您的 Android 软件包。要让 Play 游戏登录机制正常发挥作用,必须签署 APK。此要求不仅适用于游戏发布阶段,也适用于游戏开发阶段。
设置您的 Firebase 项目
在 Firebase 控制台中,前往您在其中注册了 Unity 项目的 Firebase 项目。
使用您在 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(开发期间也是如此)。
启用 Google Play Games 作为登录提供方:
在 Firebase 控制台中,打开 Authentication 部分。
生成并获取您项目的 Web 服务器客户端 ID 和客户端密钥:
在登录方法标签页中,启用 Google 登录提供方。
从 Google 登录提供方复制 Web 服务器客户端 ID 和密钥。
在登录方法标签页中,启用 Play Games 登录提供方,然后指定您项目的 Web 服务器客户端 ID 和客户端密钥(即您在上一步复制的内容)。
根据 Firebase 应用信息配置 Play Games services
在 Google Play 控制台中,打开您的 Google Play 应用或创建一个应用。
在“拓展”部分中,依次点击 Play Games services > 设置和管理 > 配置。
点击是,我的游戏已经使用了 Google API,从列表中选择您的 Firebase 项目,然后点击使用。
在 Play Games services配置页面上,点击添加凭据。
- 选择游戏服务器类型。
- 在 OAuth 客户端字段中,选择您的项目的 Web 客户端 ID。请确保此 ID 就是您在启用 Play Games 登录时指定的客户端 ID。
- 保存更改。
仍然是在 Play Games services配置页面上,再次点击添加凭据。
- 选择 Android 类型。
- 在 OAuth 客户端字段中,选择项目的 Android 客户端 ID。(如果您没有看到自己的 Android 客户端 ID,请务必在 Firebase 控制台中设置游戏的 SHA-1 指纹。)
- 保存更改。
在活动、成就和排行榜页面上,创建您想要在游戏中使用的任何 Play Games 资源(如果您不想立即使用任何资源,可以先创建一个占位条目)。然后,在任意活动、成就或排行榜页面上,点击获取资源并将 Android 资源片段复制到合适的位置。您在设置 Google Play Games services插件时需要用到该片段。
资源代码段类似于以下示例:
<?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>
在测试人员页面上,添加所有需要能够登录该游戏的用户的电子邮件地址,然后再将游戏发布到 Play Store。
将 Play 游戏登录服务集成到您的游戏中
下载最新版适用于 Unity 的 Play 游戏插件并将其解压。
将插件的 Unity 软件包导入您的 Unity 项目。您可以在压缩包的
current-build
目录中找到 Unity 软件包。设置 Play 游戏插件:
- 依次点击 Window(窗口)> Google Play Games(Google Play 游戏)> Setup(设置)> Android Setup (Android 设置),打开 Android Configuration(Android 配置)界面。
- 将来自 Play 管理中心的 Android 资源代码段粘贴到 Resources Definition(资源定义)字段中。
- 将 Web 服务器客户端 ID(您在 Firebase 控制台中启用 Play Games 登录时提供的 ID)粘贴到客户端 ID 字段中。
- 点击设置。
在您的游戏中,配置一个启用了
RequestServerAuthCode
设置的 Play 游戏客户端: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();
然后,当玩家选择使用 Play 游戏服务登录时,调用
Social.localUser.Authenticate()
:Social.localUser.Authenticate((bool success) => { // handle success or failure });
进行 Firebase 身份验证
将 Play 游戏登录服务添加到您的游戏后,您可以使用 Play 游戏服务提供的身份验证代码进行 Firebase 身份验证。
玩家使用 Play 游戏成功登录后,在登录接续处理程序中,为该玩家的账号获取一个身份验证代码:
Social.localUser.Authenticate((bool success) => { if (success) { authCode = PlayGamesPlatform.Instance.GetServerAuthCode(); } });
然后,用 Play 游戏服务提供的身份验证代码换取一个 Firebase 凭据,并使用该 Firebase 凭据来对该玩家进行身份验证:
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance; Firebase.Auth.Credential credential = Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode); auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { if (task.IsCanceled) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync 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); });
后续步骤
用户首次登录后,系统会创建一个新的用户账号,并将该账号与其 Play 游戏 ID 关联。这个新账号归属于您的 Firebase 项目,可用于在该项目中的每个应用中标识用户。
在您的游戏中,您可以从 Firebase.Auth.FirebaseUser
对象获取用户的 Firebase UID:
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null && user.IsValid()) {
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 实时数据库和 Cloud Storage 安全规则中,您可以从 auth
变量获取已登录用户的唯一用户 ID,然后用其控制用户可以访问哪些数据。
要获取用户的 Play 游戏玩家信息或访问 Play 游戏服务,请使用 Play 游戏插件提供的 API。
如需让用户退出登录,请调用 SignOut()
:
auth.SignOut();