読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

プラグインを書かずにGoogle Play Game Servicesのランキングとアチーブメントを実装【Unity】【Android】【アセット】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.2.2f1 Personal


はじめに

前回、Unityで開発したiOSアプリにGameCenterのランキングとアチーブメントを実装しました。



なので今回はUnityで開発したAndroidアプリに

ランキングとアチーブメント(実績)機能を実装する方法のご紹介です。

なお、タイトル通りネイティブプラグインは(自力では)書きませんが、有料アセットは使います!!


play-games-plugin-for-unity

有料プラグインの前に、無料でやる方法です。


iOSと違い、Androidの場合は標準でランキングが使えません

しかし、iOSの時とほぼ同じ感じでランキングを実装出来るプラグインが無料で公開されています!ヤッタネ!



実際これを使ってみたところ、確かに実装は出来たんですが、

絶対パスで色々指定していたり、Plugin/Android内のファイルを勝手に弄ったり

(これのせいで広告が出なくなっていた)と、正直使い難い……。


という訳で有料アセットを使ってみることにしました。


Android Native Plugin

今回使ったのは、Android Native Plugin($35)というもの。

名前が分かり易過ぎて、逆に分かり難いですが、Androidの色々な機能を使えるプラグインです。


f:id:kan_kikuchi:20160411190933p:plain
Android Native Plugin


今回はランキングのみの実装に使っていますが、課金やらシェアやらも簡単に出来るとかなんとか。


Android Native Pluginの設定

では、Android Native Pluginの設定方法の説明です。

なお、以下がドキュメントです。英語ですが、スクショとプログラムがあるので結構分かり易いです。



まず、アセットをインポート、その後

Window-Stan's Assets-Android Native-Edit Settingsを押します。


f:id:kan_kikuchi:20160411203801p:plain


次に、Inspectorに表示されたInstall Pluginを実行します。

この時、必要のないLibはチェックを外しましょう。


f:id:kan_kikuchi:20160420064229j:plain


その後、Plugins-Android-An_Res-res-values-idsにidを設定します。


f:id:kan_kikuchi:20160411204258p:plain


設定するidはGoogle Play Developer Consoleの"リソースを取得"で取得できます。


f:id:kan_kikuchi:20160411204423j:plain


これで設定完了です。以下のようになっていればOK。


f:id:kan_kikuchi:20160411204854j:plain


AndroidRankingUtility

お次はプログラムです!先ほどのAndroid Native Pluginを使って

ランキング周りの処理を行う便利クラス、AndroidRankingUtilityを作ってみたでこれのご紹介!



これを使えば、認証からスコア&アチーブメントの送信から確認まで出来ちゃいます!


続いて、コードの内容と使い方のご説明をば。

GooglePlayManagerがAndroid Native Pluginのクラスで、これを介して処理を行います。

なお、GooglePlayManager.Instanceみたいな形でInstanceが出てきますが、

このInstanceは初回アクセス時に自動で生成されるので、特に意識する必要はありません。


使うだけならAndroidRankingUtilityが書いてある方だけ読めば大丈夫なはずです(:3っ)∋〜


認証

まずは認証ですが、以下のようにGooglePlayConnection.Instance.Connect()を実行するだけです!

これでログイン用のウィンドウが表示されます。

//認証
GooglePlayConnection.Instance.Connect();


また、認証の前に以下のように各コールバックを登録しています。

//ランキングのスコアを送った後に実行されるメソッドを登録
GooglePlayManager.ActionScoreSubmited += ReportScoreCallBack;

//アチーブメントを送った後に実行されるメソッドを登録
GooglePlayManager.ActionAchievementUpdated += ReportProgressCallBack;

//認証を行った後に実行されるメソッドを登録
GooglePlayConnection.ActionConnectionResultReceived += (result) =>{
  callBack(result.IsSuccess);
};


AndroidRankingUtilityを使う時は以下の通り、

//コールバックなし
AndroidRankingUtility.Auth();
//コールバックがある場合(Action<bool> callBack )
AndroidRankingUtility.Auth(callBack); 


AndroidRankingUtility内ではコールバックでresult.IsSucceededだけを使い、

処理が成功したかどうかしか見ていませんが、

result.codeなどでエラーメッセージを見ることも可能です。

GooglePlayConnection.ActionConnectionResultReceived += ActionConnectionResultReceived;
GooglePlayConnection.Instance.Connect ();;

private void ActionConnectionResultReceived(GooglePlayConnectionResult result) {
	if(result.IsSuccess) {
		Debug.Log("Connected!");
	} else {
		Debug.Log("Cnnection failed with code: " + result.code.ToString());
	}
}



ランキング

次にランキングにスコアを送信する時はSubmitScoreByIdを使います。

//string leaderboardID, long score
GooglePlayManager.Instance.SubmitScoreById (leaderboardID, score);


leaderboardIDはGoogle Play Developer Consoleで確認できます。


f:id:kan_kikuchi:20160411212126j:plain


AndroidRankingUtilityを使う時は以下の通り、

//コールバックなし
AndroidRankingUtility.ReportScore(leaderboardID, score);
//コールバックがある場合(Action<bool> callBack )
AndroidRankingUtility.ReportScore(leaderboardID, score, callBack);


また、ランキング一覧(リーダボード)を表示する時はShowLeaderBoardsUIを使います。

GooglePlayManager.Instance.ShowLeaderBoardsUI ();


AndroidRankingUtilityを使う時は以下の通り、

AndroidRankingUtility.ShowLeaderboardUI();



アチーブメント

最後にアチーブメントを送信する時はUnlockAchievementById を使います。

iOSの時とは違い、何%達成みたいなのはないので、送信した時点でアチーブメントは達成されます。

------追記(2016.05.24)

勘違いでした!増分実績にすればAndroidでも何%達成という形式に出来るそうです。

どのみち達成率を送信するiOSとは仕様が違うので、

今回のAndroidRankingUtilityには実装していないのあしからず。


ちなみに、増分実績のアチーブメントにポイントを送信する場合は

IncrementAchievementByIdを使います。

------追記終わり(2016.05.24)

//増分実績でない場合、送信した時点で達成。
GooglePlayManager.Instance.UnlockAchievementById(achievementKey);

/* 追記(2016.05.24) */
//増分実績の場合、送信したポイントが設定した値に到達したら達成。
//GooglePlayManager.Instance.IncrementAchievementById (achievementKey, 1);


AndroidRankingUtilityを使う時は以下の通り、

//コールバックなし
AndroidRankingUtility.ReportProgress(achievementKey);
//コールバックがある場合(Action<bool> callBack )
AndroidRankingUtility.ReportProgress(achievementKey, callBack);


また、アチーブメント一覧を表示する時はShowAchievementsUI を使います。

GooglePlayManager.Instance.ShowAchievementsUI ();


AndroidRankingUtilityを使う時は以下の通り、

AndroidRankingUtility.ShowAchievementsUI();


今回のAndroidRankingUtility内にはありませんが、獲得したアチーブメントをリセットする時は

ResetAllAchievementsを使います。

//全アチーブメントを未取得に戻す
GooglePlayManager.Instance.ResetAllAchievements();



おわりに

記事を見ての通り、設定も実装もかなり簡単でした。アセットさまさま。


これで前回の記事と合わせて、

iOS、Android共にランキングとアチーブメントが実装出来ました。


しかし、これらの機能を使おうとする度にiOSとAndroidで分岐を書くのは面倒ですよね?

ということで次回、ランキング編完結!ただマネージャクラス作るだけだよ編です!!


追記:続編書きました!