GooglePlayGameServicesを使ったリーダーボードの実装
はじめに
AndroidアプリでGooglePlayGameServices v2を使ったリーダーボードを実装したので、手順を投稿します。関連する筆者の記事に記載した三部構成になっています。
GooglePlayConsoleを使ってAndroidアプリをリリースしているレベルの読者を想定しています。
関連する筆者の記事
参考資料
本記事に関連するAndroidDevelopersのガイドは以下です。
リーダーボード実装前の筆者の状態
- GooglePlayにアプリをリリース済み
- アプリはプロダクトフレーバーを使って有料版と無料版をリリースしている
- 有料版アプリと無料版アプリで共通のリーダーボードを使いたい
- GooglePlayGamesServicesのセットアップはしていない
- 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つ定義します。
<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の機能であるリーダーボードが搭載されていますので、興味を持って頂けた方は是非リーダーボードの上位ランクインを目指してみてください。
Discussion