使用 Google Play 遊戲服務在 Unity 中驗證

您可以使用 Google Play 遊戲服務,讓玩家登入在 Firebase 和 Unity 上建構的 Android 遊戲。如要透過 Firebase 使用 Google Play 遊戲服務登入功能,請先透過 Google Play 遊戲登入玩家,然後再要求 OAuth 2.0 驗證碼。接著,將驗證碼傳遞至 PlayGamesAuthProvider 以產生 Firebase 憑證,供您用於 Firebase 驗證。

事前準備

設定 Unity 專案

  1. 按照「將 Firebase 新增至 Unity 專案」中的說明,將 Firebase 設定檔和 Firebase Unity SDK 新增至您的 Unity 專案。按照 Android 適用的操作說明進行。

    請務必匯入 FirebaseAuth.unitypackage

  2. 在 Unity 編輯器中,於「Build Settings」>「Player Settings」>「Other Settings」下方設定遊戲的 Android 套件名稱。

  3. 接著,在「Build Settings」>「Player Settings」>「Publish Settings」下方,選取或建立用於簽署 Android 套件的 KeyStore 和金鑰。您的 APK 必須登入 Play 遊戲才能運作,這項規定不僅適用於發布,也在遊戲開發期間。

設定 Firebase 專案

  1. Firebase 主控台中,前往您註冊 Unity 專案的 Firebase 專案。

  2. 在 Firebase 控制台的「設定」頁面,使用您在 Unity 中設定的金鑰,設定遊戲的 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 遊戲做為登入提供者:

    1. 在 Firebase 控制台中,開啟「Authentication」專區

    2. 產生並取得專案的網路伺服器用戶端 ID 和用戶端密鑰:

      1. 在「Sign in method」分頁中,啟用「Google」登入提供者。

      2. 複製 Google 登入供應商的網路伺服器用戶端 ID 和密鑰。

    3. 在「Sign in method」分頁中,啟用「Play Games」登入供應商,並指定專案的網路伺服器用戶端 ID 和用戶端密鑰 (您在上一個步驟中取得)。

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

  1. Google Play 管理中心開啟您的 Google Play 應用程式或建立一個應用程式。

  2. 在「Grow」部分中,依序按一下「Play Games services」>「Setup & Management」>「Configuration」

  3. 按一下「是,我的遊戲已在使用 Google API」,從清單中選取您的 Firebase 專案,然後按一下「使用」

  4. 在 Play 遊戲服務設定頁面上,按一下「新增憑證」

    1. 選取「遊戲伺服器」類型。
    2. 在「OAuth 用戶端」欄位中,選取專案的網路用戶端 ID。請確認這組用戶端 ID 與您啟用 Play 遊戲登入功能時指定的用戶端 ID 相同。
    3. 儲存變更。
  5. 同樣在 Play 遊戲服務設定頁面,再按一下「Add Credential」

    1. 選取「Android」類型。
    2. 在「OAuth client」(OAuth 用戶端) 欄位中,選取專案的 Android 用戶端 ID。(如果沒有看到您的 Android 用戶端 ID,請務必在 Firebase 控制台中設定遊戲的 SHA-1 指紋)。
    3. 儲存變更。
  6. 在「事件」、「成就」和「排行榜」頁面上,建立所有要搭配遊戲使用的 Play 遊戲資源 (如果您不想立即使用任何 Play 遊戲資源,可以建立預留位置項目)。然後在任何「Events」、「Achievements」或「Leaderboards」 頁面上,按一下「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. 依序點選「Window」>「Google Play Games」>「Setup」>「Android Setup」,開啟「Android Configuration」畫面。
    2. 將從 Play 管理中心取得的 Android 資源程式碼片段貼到「Resources Definition」欄位。
    3. 將您在 Firebase 控制台啟用 Play 遊戲登入功能時提供的網路伺服器用戶端 ID,貼到「Client ID」欄位中。
    4. 按一下 [設定]。
  4. 在遊戲中設定啟用 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();
    
  5. 當玩家選擇使用 Play 遊戲登入時,呼叫 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 遊戲服務交換驗證碼來取得 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,並使用該 ID 控制使用者可以存取哪些資料。

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

如要將使用者登出,請呼叫 SignOut()

auth.SignOut();