使用 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();