Unityで作ったiOS/Android向けのゲームにリーダーボードを実装したい。
- 費用を気にせず完全無料で!
- 時間をかけずにサックリと!
この条件で実装するアプローチは、私の知る限り1つしかありません。
それはiOSならGameCenter、AndroidならGooglePlayGameServicesを使うことです。
今回、CloudOnceというナイスなUnityプラグインを使ってみました。
意外と日本語の情報が少なかったので、プラグインの使い方とハマった点を紹介します。
CloudOnceとは
CloudOnceはGitHubでオープンソースとしてまるごと公開されています。
昔はUnityのAssetStoreで有料アセットとして販売されていたこともあるようです。
何ができるの?
GameCenter、GooglePlayGameServicesに特化した軽量なプラグインです。
ゲームサービスとクラウドサービスの機能を共通のAPIでクロスプラットに実装できます。
AssetStoreじゃないの?
AssetStoreにも「Cross Platform Native Plugins」というアセットがあります。
有料アセットですが、CloudOnceで出来ることは一通り出来ます。
他にも電話帳アクセスやSNS連携など、ネイティブ実装の様々な機能をUnityから呼び出せます。
使いたい機能がマッチする人には非常にオススメなのですが、ゲームサービスだけを使いたい人にはあまりオススメできません。アセットのサイズが大きく、実際には利用しない他のSDKへの依存度も高くなってしまうので、余計なトラブルが起きやすいです。
私はコレを導入したアプリのAndroidターゲットバージョンを26に上げた時に問題が発生しました。
最新版では分からないですが、調査が面倒で放置中です…。(CloudOnceに置き換えるかも)
シンプルイズベスト!
ゲームサービスのみをコンパクトに実装するならCloudOnceがオススメです。
元有料アセットということもあって、実装も洗練されていますし、ライセンスもMITなので安心して使えます。少しハマったところもありましたが、実装がコンパクトなので調査は楽でした。
Cross Platform Native Pluginsも決して悪くはないですが、時にはAssetStoreの外に目を向けると、実は素晴らしいものがあったりするのです!
準備
GitHubからCloudOnceのunitypackageをダウンロードしてください。
https://github.com/jizc/CloudOnce/releases
1. CloudOnceをインポートする
CloudOnceのunitypackageをUnityにインポートする。
Assets→Import Package→Custom Package…→CloudOnce-v2.6.1.unitypackage
CloudOnceはExtensionsフォルダの直下に置かれるようインポートされます。
スクリプトにExtensionsフォルダへのパスが書かれている箇所があるので、インポート時のフォルダ構造を変えると一部の処理が動かなくなってしまいます。どうしてもフォルダ構造を変えたい場合、スクリプトの該当箇所を変更したパスに書き換えれば問題なさそうでしたが、ちゃんと検証したわけではないので変えない方が無難かと思います。
外部からインポートしたAssetをExternalsフォルダ等に移動してまとめてる人はハマる部分なので注意してください。
2. プロジェクト設定を確認する(64bit対応)
iOSは随分前に64bitアプリが義務化されました。
GameCenterはiOSに実装されているサービスなので、32bit/64bitどちらでも動作します。
GameCenterのみに対応する場合、手順3~4は無視して良いので、手順5に進んでください。
Androidは2019年8月以降のアプリに64bit対応が義務化されます。
しかし、CloudOnce v2.6.1 (GPGS 0.9.50)の時点ではSDKが64bit対応されていません。
残念ですが、GooglePlayGameServicesを利用する場合は32bitアプリにするしかなさそうです。
UnityのPlayerSettingsでAndroidのビルド設定に”ARM64″は含めないでください。
アプリ起動時にクラッシュして動かなくなります。
GooglePlayGameServicesの64bit対応を待ちましょう。
3. Androidライブラリの依存関係を解決する
※GooglePlayGameServicesを利用する場合のみ
念のためAndroidライブラリの依存関係を強制解決しておきましょう。
Assets→Play Services Resolver→Android Resolver→Force Resolve
CloudOnceが com.google.games.gpgs-plugin-support-0.9.50.aar を取り込みます。
(取り込まれるGPGSのバージョンは、CloudOnceのバージョンによって変わります。)
本来はインポート時に自動更新されるはずですが、既にPlay Services Resolverがインストールされている場合、ユーザーそれぞれの設定によっては更新されないこともあるためです。
4. AndroidManifestのテンプレートにある不具合を修正する
※GooglePlayGameServicesを利用する場合のみ
テキストエディタ等で以下のファイルを修正してください。
Assets\Extensions\CloudOnce\Internal\Editor\Utils\GooglePlayGamesSetup\template-AndroidManifest.txt
<!-- The space in these forces it to be interpreted as a string vs. int -->
<meta-data android:name="com.google.android.gms.games.APP_ID"
android:value="\ __APP_ID__" />
↑ \の後ろのスペースを削除する
<!-- Keep track of which plugin is being used -->
<meta-data android:name="com.google.android.gms.games.unityVersion"
android:value="\ __PLUGIN_VERSION__" />
↑ \の後ろのスペースを削除する
マジか!?と思うかもしれませんが、これを修正しないと動きません(笑)
この問題は見つけるのに少々苦労しました…;
CloudOnce v2.6.2以降では修正されているようです。
最新バージョンを使用する場合はこの手順はスキップしてください。
5. CloudOnceをセットアップする
CloudOnceのSettingsで利用開始の準備をします。
この手順を進める前に、利用するプラットフォームの準備は済ませておいてください。
Window→Cloud Once→Editor→Settings
利用するプラットフォーム(Supported Platforms)を有効にします。
※GooglePlayGameServicesを利用する場合のみ
Google Application IDにGoogle Play Consoleで作成したゲームサービスのIDを入力して、
“Run setup”を押してください。
手順4で修正した”template-AndroidManifest.txt”から、”AndroidManigest.xml”が生成されます。
6. CloudOnceにリーダーボードIDを設定する
CloudIDsにリーダーボードを作成します。
Window→Cloud Once→Editor→Cloud IDs
Internalはスクリプトからアクセスするための識別子です。
GameCenterとGooglePlayGameServicesには作成したリーダーボードのIDを入れます。
設定したらSave configurationすると、ProjectSettings/CloudOnceSettings.txtが更新されます。
(※変更したり追加した場合もSave configurationしてください!)
実装
CloudOnceの”Quick Start Scripts”を置いていくだけで終わります!
必要であれば自前でスクリプトを書いて制御することも出来ますが、クイックスタートと似たような処理を書くことになりそうなので、ありがたく使わせてもらいましょう。
1. CloudOnceを初期化する
最初のSceneにGameObjectを配置し、InitializeCloudOnce.cs をアタッチします。
使用するのがリーダーボードだけであれば Auto Sign In にチェックが入ってるだけで十分です。
2. リーダーボードを表示する
リーダーボードを表示するためのuGUIのボタンに LeaderboardsButton.cs をアタッチします。
サインインしている場合はリーダーボードを表示し、していない場合にはサインインを試みてくれます。
3. リーダーボードにスコアを送信する
ハイスコアを更新するとき、以下のスクリプトでスコアを送信します。
// リーダーボードにハイスコアを送信する
CloudOnce.Leaderboards.Score.SubmitScore(highScore);
以上です!
まとめ
うまく実装できたでしょうか?
Unity側の対応はサックリと30分程度で終わると思います。
GameCenterだけで良ければ、もっと早いかもしれません。
ビルドして動作確認する時間の方が長いかもしれませんね。