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

(:3[kanのメモ帳]

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

プラグインを書かずにGameCenterのランキングとアチーブメントを実装【Unity】【iOS】


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

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


はじめに

今回はUnityで開発したiOSアプリに

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

なお、タイトル通りネイティブプラグインは書きません。


UnityEngine.SocialPlatforms

ネイティブプラグイン書かないで、どうやってネイティブの機能使うの?って話ですが、

実はUnityには標準でランキング周りのAPIが用意されています。



using UnityEngine.SocialPlatforms; を書く事でこれらの機能が使えるようになります。



iOSRankingUtility

ではさっそく、プログラムです!

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



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


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

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


認証

まずは認証ですが、以下のようにAuthenticateを実行するだけです!

これでGameCenterにIDがあればそのままログイン、無ければログイン用のウィンドウが表示されます。

//Action<bool> callBack 
Social.localUser.Authenticate (callBack);


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

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


また、認証の後にShowDefaultAchievementCompletionBannerを使って

アチーブメント獲得時に上から出てくる通知を有効にしています。

//アチーブメント獲得時の通知をONにする
UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform.ShowDefaultAchievementCompletionBanner(true);

f:id:kan_kikuchi:20160411182348j:plain
ニンゲンのチョウサ


ランキング

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

//string leaderboardID, long score, Action<bool> callBack
Social.ReportScore (score, leaderboardID, callBack);


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

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


leaderboardIDはiTCから確認できます。


f:id:kan_kikuchi:20160411135545j:plain


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

Social.ShowLeaderboardUI();


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

iOSRankingUtility.ShowLeaderboardUI();



アチーブメント

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


ランキングの時とは違い、Socialクラスから直接送信するのではなく、

IAchievementというアチーブメントのインスタンスを作成し、

そのインスタンスから送信を行います。

//アチーブメントのインスタンスを作成し、keyと進捗率を設定
IAchievement achievement = Social.CreateAchievement();

achievement.id = achievementKey; //string
achievement.percentCompleted = percent; //float

//送信
achievement.ReportProgress(callBack); //Action<bool> callBack 


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

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


一応、上記のコードでアチーブメントが達成出来る事は確認したのですが、

送信に失敗することが結構あります。

もしかしたら、以下のバグが残っているのかもしれません。



何回か送信するば問題ないっぽいですが、

万全を期す場合はネイティヴプラグインを書きましょう>_('ω' 」)_


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

Social.ShowAchievementsUI();


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

iOSRankingUtility.ShowAchievementsUI();


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

ResetAllAchievementsを使います。

//全アチーブメントを未取得に戻す
UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform.ResetAllAchievements();



おわりに

GameCenterはUnityが対応してるおかげでだいぶ楽に実装できますね。


これに比べてAndroidの方はちょっと……、という事で次回はAndroid編

楽するために有料アセットをつかったので参考になるかは分かりません!!


追記:続編書きました!


Android編


まとめ編


参考