Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

Unity で Google Play ゲームサービスを使用して認証する

Google Play ゲームサービスを使って、Firebase と Unity で構築した Android ゲームにログインすることができます。Firebase で Google Play ゲームサービスのログインを使用するには、最初に Google Play ゲームでプレーヤーをログインさせ、OAuth 2.0 認証コードをリクエストします。次に、認証コードを PlayGamesAuthProvider に渡して Firebase 認証情報を生成します。この認証情報を Firebase での認証に使用できます。

始める前に

Unity を設定する

  1. Unity プロジェクトに Firebase を追加するの説明に従って、Firebase 構成ファイルと Firebase Unity SDK を Unity プロジェクトに追加します。Android 用の手順に従ってください。

    必ず、FirebaseAuth.unitypackage をインポートしてください。

  2. Unity エディタの [Build Settings] > [Player Settings] > [Other Settings] で、ゲームの Android パッケージ名を設定します。

  3. 次に、[Build Settings] > [Player Settings] > [Publishing Settings] で、Android パッケージへの署名に使用するキーストアとキーを選択するか作成します。Play ゲームのログインが正常に動作するためには、APK に署名する必要があります。APK への署名は、ゲームの公開時だけでなく、ゲームの開発時にも必要です。

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 ゲームをログイン プロバイダとして有効にします。

    1. プロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを見つけます。ウェブサーバーのクライアント ID は、Google Play の認証サーバーでの Firebase プロジェクトの識別に使用されます。

      これらの値は次の手順で確認できます。

      1. Google API Console の認証情報ページで Firebase プロジェクトを開きます。
      2. [OAuth 2.0 クライアント ID] セクションで、ウェブ クライアント(Google サービスで自動作成)の詳細ページを開きます。このページに、ウェブサーバーのクライアント ID とクライアント シークレットが記載されています。
    2. 次に、Firebase コンソールで [Authentication] セクションを開きます。

    3. [ログイン方法] タブで、[Play ゲーム] ログイン プロバイダを有効にします。API Console で取得した、プロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを指定する必要があります。

  1. Google Play Console でアプリを開くか、アプリを作成します。

  2. [成長] セクションで、[Play ゲームサービス] > [設定と管理] > [設定] をクリックします。

  3. [はい、ゲームで Google API をすでに使用しています] をクリックし、リストから Firebase プロジェクトの名前を選択して [使用する] をクリックします。

  4. Play ゲームサービスの設定ページで [認証情報を追加] をクリックします。

    1. [ゲームサーバー] のタイプを選択します。
    2. [OAuth クライアント] フィールドで、プロジェクトのウェブ クライアント ID を選択します。Play ゲームのログインを有効にしたときに指定したクライアント ID と同じ ID を選択してください。
    3. 変更を保存します。
  5. 引き続き Play ゲームサービスの設定ページで、もう一度 [認証情報を追加] をクリックします。

    1. [Android] のタイプを選択します。
    2. [OAuth クライアント] フィールドで、プロジェクトの Android クライアント ID を選択します(目的の Android クライアント ID が表示されない場合は、Firebase コンソールでゲームの SHA-1 フィンガープリントが設定されていることを確認してください)。
    3. 変更を保存します。
  6. [イベント]、[実績]、[リーダーボード] のページで、ゲームで使用したい 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 ゲーム プラグインの最新リリースをダウンロードして解凍します。

  2. プラグインの Unity パッケージを Unity プロジェクトにインポートします。Unity パッケージは、リリース アーカイブの current-build ディレクトリにあります。

  3. 次のようにして、Play ゲーム プラグインを設定します。

    1. [Window] > [Google Play Games] > [Setup] > [Android Setup] をクリックして、[Android Configuration] 画面を開きます。
    2. Play Console から取得した Android リソース スニペットを [Resources Definition] フィールドに貼り付けます。
    3. ウェブサーバーのクライアント ID、つまり Firebase コンソールで Play ゲームのログインを有効にしたときに指定した ID を [Client ID] フィールドに貼り付けます。
    4. [Setup] をクリックします。
  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.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 Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth 変数から取得し、それを使用して、ユーザーがアクセス可能なデータを制御できます。

ユーザーの Play ゲームのプレーヤー情報を取得したり、Play ゲームサービスにアクセスしたりするには、Play ゲーム プラグインで提供されている API を使用します。

ユーザーのログアウトを行うには、SignOut() を呼び出します。

auth.SignOut();