【Unity】CloudOnceでリーダーボードを実装する

Unityで作ったiOS/Android向けのゲームにリーダーボードを実装したい。

  • 費用を気にせず完全無料で!
  • 時間をかけずにサックリと!

この条件で実装するアプローチは、私の知る限り1つしかありません。
それはiOSならGameCenter、AndroidならGooglePlayGameServicesを使うことです。
今回、CloudOnceというナイスなUnityプラグインを使ってみました。
意外と日本語の情報が少なかったので、プラグインの使い方とハマった点を紹介します。

CloudOnceとは

CloudOnceはGitHubでオープンソースとしてまるごと公開されています。
昔はUnityのAssetStoreで有料アセットとして販売されていたこともあるようです。

何ができるの?

GameCenter、GooglePlayGameServicesに特化した軽量なプラグインです。
ゲームサービスとクラウドサービスの機能を共通のAPIでクロスプラットに実装できます。

CloudOnce
CloudOnce - Unified Game Services API

AssetStoreじゃないの?

AssetStoreにも「Cross Platform Native Plugins」というアセットがあります。

Cross Platform Native Plugins - Ultra Pack - Asset Store
Cross Platform Native Plugins a true cross platform tool for Unity which provides unique and unified way to access native functionality on mobile platforms....

有料アセットですが、CloudOnceで出来ることは一通り出来ます。
他にも電話帳アクセスやSNS連携など、ネイティブ実装の様々な機能をUnityから呼び出せます。
使いたい機能がマッチする人には非常にオススメなのですが、ゲームサービスだけを使いたい人にはあまりオススメできません。アセットのサイズが大きく、実際には利用しない他のSDKへの依存度も高くなってしまうので、余計なトラブルが起きやすいです。

私はコレを導入したアプリのAndroidターゲットバージョンを26に上げた時に問題が発生しました。
最新版では分からないですが、調査が面倒で放置中です…。(CloudOnceに置き換えるかも)

シンプルイズベスト!

ゲームサービスのみをコンパクトに実装するならCloudOnceがオススメです。
元有料アセットということもあって、実装も洗練されていますし、ライセンスもMITなので安心して使えます。少しハマったところもありましたが、実装がコンパクトなので調査は楽でした。

Cross Platform Native Pluginsも決して悪くはないですが、時にはAssetStoreの外に目を向けると、実は素晴らしいものがあったりするのです!

準備

GitHubからCloudOnceのunitypackageをダウンロードしてください。
https://github.com/jizc/CloudOnce/releases

執筆時のCloudOnceのバージョンは2.6.1、Unityは2018.2.0f2を使用しました。

1. CloudOnceをインポートする

CloudOnceのunitypackageをUnityにインポートする。
Assets→Import Package→Custom Package…→CloudOnce-v2.6.1.unitypackage

CloudOnceはExtensionsフォルダの直下に置かれるようインポートされます。
スクリプトにExtensionsフォルダへのパスが書かれている箇所があるので、インポート時のフォルダ構造を変えると一部の処理が動かなくなってしまいます。どうしてもフォルダ構造を変えたい場合、スクリプトの該当箇所を変更したパスに書き換えれば問題なさそうでしたが、ちゃんと検証したわけではないので変えない方が無難かと思います。

ハマりポイント1: フォルダは移動しない方がいい
外部からインポートした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アプリにするしかなさそうです。

ハマりポイント2: Androidアプリの64bit対応は出来ない
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

マジか!?と思うかもしれませんが、これを修正しないと動きません(笑)

ハマりポイント3: AndroidManifestのテンプレートに不具合がある
この問題は見つけるのに少々苦労しました…;
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. リーダーボードにスコアを送信する

ハイスコアを更新するとき、以下のスクリプトでスコアを送信します。

以上です!

まとめ

うまく実装できたでしょうか?

Unity側の対応はサックリと30分程度で終わると思います。
GameCenterだけで良ければ、もっと早いかもしれません。
ビルドして動作確認する時間の方が長いかもしれませんね。

※この記事の内容は、個人制作のアプリで実践したものです。

PuzzCubic
シンプルでクールなパズルゲームです。 Cubeをスライドして同じ色を3つ以上つなげると消えます。 連鎖とボムで制限時間を回復しながらハイスコアを狙おう! 高得点になるほどエキサイティングな展開があなたを待っています! ※このアプリは完全無料で遊べます。一部広告が表示されるのでご了承ください。 Gam...