🦕

GooglePlayGameServicesを使ったリーダーボードの実装

2022/07/05に公開約3,500字

はじめに

AndroidアプリでGooglePlayGameServices v2を使ったリーダーボードを実装したので、手順を投稿します。関連する筆者の記事に記載した三部構成になっています。
GooglePlayConsoleを使ってAndroidアプリをリリースしているレベルの読者を想定しています。

関連する筆者の記事

  1. GooglePlayGameServicesのセットアップ
  2. AndroidGamesへのサインインの実装
  3. GooglePlayGameServicesを使ったリーダーボードの実装(本記事)

参考資料

本記事に関連するAndroidDevelopersのガイドは以下です。

https://developers.google.com/games/services/android/leaderboards

リーダーボード実装前の筆者の状態

  1. GooglePlayにアプリをリリース済み
  2. アプリはプロダクトフレーバーを使って有料版と無料版をリリースしている
  3. 有料版アプリと無料版アプリで共通のリーダーボードを使いたい
  4. GooglePlayGamesServicesのセットアップはしていない
  5. GoogleAPI(Firebase)などは使用していない

1. GooglePlayConsoleでリーダーボードを作成して公開する

1.1. リーダーボードを作成する

まず、GooglePlayConsoleでリーダーボードを作成します。筆者の場合、クリアタイムを競うゲームであるため、形式は数値、小数点以下の桁数は3桁で、並べ替え順を小さい順にしています。並べ替え順は得点を競う場合には大きい順、タイムを競う場合には小さい順となります。スコアに範囲がある場合、例えば最大100点満点などの場合にはスコアの許容上限値/下限値を設定しておくと良いでしょう。

1.2. リーダーボードを公開する

次に、GooglePlayConsoleでリーダーボードを公開します。これでGooglePlayConsoleの作業は完了です。

2. リーダーボードを実装する

2.1 文字列リソースにリーダーボードIDを定義する

AndroidDevelopersのガイドではstrings.xmlと記載がありますが、GooglePlayConsoleからリソースを取得するとgames-ids.xmlが取得できるため、この記事ではres/values/games-ids.xmlに定義を行っています。どちらの場合もビルド時にR.stringリソースとしてマージされるため、問題ありません。
筆者のアプリの場合、1つのゲームプロジェクトに3つのリーダーボードがあるため、リーダーボードIDも3つ定義します。

res/values/games-ids.xml
<resources>
    <string name="leaderboard_id_taps_4" translatable="false">■■■■■■■■■</string>
    <string name="leaderboard_id_taps_9" translatable="false">■■■■■■■■■</string>
    <string name="leaderboard_id_taps_pi" translatable="false">■■■■■■■■■</string>
</resources>

リーダーボードIDの値は、GooglePlayConsoleで各リーダーボードのID列に記載されています。また、認証情報セクションのリソースを取得ボタンをクリックすることでgames-ids.xmlとして取得することもできます。

2.2. プレイヤーのスコアを更新する

以下の実装で、サインイン中のプレイヤーのリーダーボードのスコアを更新することができます。thisはActivity、R.string.leaderboard_id_taps_piはリーダーボードID、scoreはスコアです。GooglePlayConsoleでリーダーボードを作成した際に、小数点以下の桁数を3桁としてあるため、scoreの値が12345の場合、リーダーボードの値は12.345となります。

import com.google.android.gms.games.PlayGamesSdk;

...

PlayGames.getLeaderboardsClient(this).submitScore(getString(R.string.leaderboard_id_taps_pi), score)

2.3 リーダーボードを表示する

リーダーボードインテントを取得し、startActivityForResult()を呼び出すことで、デフォルトのリーダーボードを表示することができます。RC_LEADERBOARD_UIは、はリクエストコードの任意の整数であるため、筆者はAndroidDevelopersのガイドにある9004を指定しました。
こちらで紹介した方法の他に、独自のリーダーボードUIを実装して表示することも可能です。

import com.google.android.gms.games.PlayGamesSdk;

...

private static final int RC_LEADERBOARD_UI = 9004;

private void showLeaderboard() {
    PlayGames.getLeaderboardsClient(this)
        .getLeaderboardIntent(getString(R.string.leaderboard_id_taps_pi))
        .addOnSuccessListener(new OnSuccessListener<Intent>() {
            @Override
            public void onSuccess(Intent intent) {
                startActivityForResult(intent, RC_LEADERBOARD_UI);
            }
        });
}

お疲れ様でした。以上でリーダーボードの実装は完了です。

筆者のアプリ

テンキーで円周率を入力する速さを競うAndroidアプリを開発しました。こちらの記事にあるGooglePlayGameServicesの機能であるリーダーボードが搭載されていますので、興味を持って頂けた方は是非リーダーボードの上位ランクインを目指してみてください。

https://play.google.com/store/apps/details?id=zozooizozzoizioiiiooi.taps.free

https://youtu.be/G2MZCDSBgMk

Discussion

ログインするとコメントできます