Google Play Games サービスを使って、Firebase と Unity で構築した Android ゲームにログインすることができます。Firebase で Google Play Games サービスのログインを使用するには、最初に Google Play Games でプレーヤーをログインさせ、OAuth 2.0 認証コードをリクエストします。次に、認証コードを PlayGamesAuthProvider
に渡して Firebase 認証情報を生成します。この認証情報を Firebase での認証に使用できます。
始める前に
Unity プロジェクトを設定する
Unity プロジェクトに Firebase を追加するの説明に従って、Firebase 構成ファイルと Firebase Unity SDK を Unity プロジェクトに追加します。Android 用の手順に従ってください。
必ず、
FirebaseAuth.unitypackage
をインポートしてください。Unity エディタの [Build Settings] > [Player Settings] > [Other Settings] で、ゲームの Android パッケージ名を設定します。
次に、[Build Settings] > [Player Settings] > [Publishing Settings] で、Android パッケージへの署名に使用するキーストアとキーを選択するか作成します。Play ゲームのログインが正常に動作するためには、APK に署名する必要があります。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] セクションを開きます。
プロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを生成して取得します。
[Sign-in method] タブで、[Google] ログイン プロバイダを有効にします。
ウェブサーバーのクライアント ID とシークレットを Google ログイン プロバイダからコピーします。
[Sign-in method] タブで [Play Games] ログイン プロバイダを有効にし、前のステップで取得したプロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを指定します。
Firebase アプリの情報を使用して Play Games services を構成する
Google Play Console で、Google Play アプリを開くか、アプリを作成します。
[Grow] セクションで、Play Games services > [設定と管理] > [設定] をクリックします。
[はい、ゲームで Google API をすでに使用しています] をクリックし、リストから Firebase プロジェクトを選択して [使用する] をクリックします。
Play Games services の設定ページで、[認証情報を追加] をクリックします。
- [ゲームサーバー] のタイプを選択します。
- [OAuth クライアント] フィールドで、プロジェクトのウェブ クライアント ID を選択します。Play Games ログインを有効にしたときに指定したクライアント ID と同じ 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 Games のログインをゲームに統合する
Unity 用の Play ゲーム プラグインの最新リリースをダウンロードして解凍します。
プラグインの Unity パッケージを Unity プロジェクトにインポートします。Unity パッケージは、リリース アーカイブの
current-build
ディレクトリにあります。次のようにして、Play ゲーム プラグインを設定します。
- [Window] > [Google Play Games] > [Setup] > [Android Setup] をクリックして、[Android Configuration] 画面を開きます。
- Play Console から取得した Android リソース スニペットを [Resources Definition] フィールドに貼り付けます。
- ウェブサーバーのクライアント ID、つまり Firebase コンソールで Play ゲームのログインを有効にしたときに指定した ID を [Client ID] フィールドに貼り付けます。
- [Setup] をクリックします。
ゲームのコード内で
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 Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth
変数から取得し、それを使用して、ユーザーがアクセス可能なデータを制御できます。
ユーザーの Play ゲームのプレーヤー情報を取得したり、Play ゲームサービスにアクセスしたりするには、Play ゲーム プラグインで提供されている API を使用します。
ユーザーのログアウトを行うには、SignOut()
を呼び出します。
auth.SignOut();