使用 Google Play 遊戲服務在 Unity 中進行身份驗證

您可以使用 Google Play 遊戲服務讓玩家登入基於 Firebase 和 Unity 建立的 Android 遊戲。若要使用 Google Play 遊戲服務登入 Firebase,請先使用 Google Play 遊戲登入玩家,然後在執行此操作時請求 OAuth 2.0 驗證程式碼。然後,將身份驗證程式碼傳遞給PlayGamesAuthProvider以產生 Firebase 憑證,您可以使用該憑證透過 Firebase 進行身份驗證。

在你開始之前

設定您的 Unity 項目

  1. 將 Firebase 設定檔和 Firebase Unity SDK 新增至您的 Unity 項目,如將 Firebase 新增至您的 Unity 專案中所述。請按照 Android 的說明進行操作。

    請務必導入FirebaseAuth.unitypackage

  2. 在 Unity 編輯器中的「建置設定」>「玩家設定」>「其他設定」下,設定遊戲的 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

    或者,您可以使用signingReport指令來取得簽章憑證的 SHA 雜湊值:

    gradlew signingReport

    您的 APK 必須使用此金鑰進行簽名,包括在開發期間。

  3. 啟用 Google Play 遊戲作為登入提供者:

    1. 在 Firebase 控制台中,開啟「驗證」部分

    2. 產生並取得專案的 Web 伺服器客戶端 ID 和客戶端金鑰:

      1. 「登入方法」標籤中,啟用Google登入提供者。

      2. Google登入提供者複製 Web 伺服器用戶端 ID 和密碼。

    3. 「登入方法」標籤中,啟用Play 遊戲登入提供程序,並指定您在上一個步驟中獲得的項目的 Web 伺服器用戶端 ID 和用戶端金鑰。

使用您的 Firebase 應用程式資訊設定 Play 遊戲服務

  1. Google Play 管理中心中,開啟您的 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. 「活動」「成就」和「排行榜」頁面上,建立您想要在遊戲中使用的任何 Play 遊戲資源(如果您不想立即使用任何資源,可以建立佔位符條目)。然後,在任意EventsAchievementsLeaderboards頁面上,點擊Get resources並將 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 遊戲外掛程式並解壓縮。

  2. 將插件的 Unity 套件匯入到您的 Unity 專案中。您可以在發布存檔的current-build目錄中找到 Unity 套件。

  3. 設定 Play 遊戲外掛:

    1. 點選視窗 > Google Play 遊戲 > 設定 > Android 設定以開啟Android 配置畫面。
    2. 將從 Play 控制台取得的 Android 資源片段貼到資源定義欄位中。
    3. 將您在 Firebase 控制台中啟用 Play 遊戲登入時提供的 Web 伺服器用戶端 ID 貼上到用戶端 ID欄位中。
    4. 點選“設定”
  4. 在您的遊戲中,設定 Play 遊戲用戶端並啟用RequestServerAuthCode設定:

    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 Games 登入時,呼叫Social.localUser.Authenticate()

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

使用 Firebase 進行身份驗證

將 Play 遊戲登入新增至遊戲後,您可以使用 Play 遊戲服務中的驗證程式碼向 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.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 即時資料庫和雲端儲存安全性規則中,您可以從auth變數取得登入使用者的唯一使用者 ID,並使用它來控制使用者可以存取哪些資料。

若要取得使用者的 Play 遊戲玩家資訊或存取 Play 遊戲服務,請使用 Play 遊戲外掛程式提供的 API。

若要登出用戶,請呼叫SignOut()

auth.SignOut();