myb design

blog

UnityでGoogle Play Game Servicesとmobile backendを導入してハマった話

UnityでGoogle Play Game Servicesを導入済みのプロジェクトにmobile backendを導入した際、Androidビルドでハマったので解決に至るまでをメモとして残します。

環境

  • Unity 5.3.4f1

序章

Google Play Game Services

Google Play Game Services(以下GPGS)のプラグインは、以下のリポジトリから現時点での最新版0.9.32をプロジェクトに導入済みでした。

playgameservices/play-games-plugin-for-unity: Google Play Games plugin for Unity

mobile backendのインポート

プッシュ通知に対応するため、NIFTY Cloudのmobile backendのUnity SDK(2.1.1)を導入しました。

NIFTYCloud-mbaas/ncmb_unity: ニフティクラウド mobile backend Unity SDK

このとき、android-support-v4.jarとgoogle-play-services.jar(と、res/values/version.xmlも)はGPGSのプラグインによりプロジェクトにインポート済みだったので、外しました。

起動、そしてクラッシュ

この時点でビルドしてAndroidの実機上で起動してみると、クラッシュします。OMG!

Android Studioのlogcatを見ると、以下のようなログが出ています。

04-10 00:48:34.984 24899-24988/? E/AndroidRuntime: FATAL EXCEPTION: IntentService[RegIntentService]
                                                   Process: com.mybdesign.mobilebackendexample, PID: 24899
                                                   java.lang.Error: FATAL EXCEPTION [IntentService[RegIntentService]]
                                                   Unity version     : 5.3.4f1
                                                   Device model      : LGE Nexus 4
                                                   Device fingerprint: google/occam/mako:5.1.1/LMY48T/2237560:user/release-keys
04-10 00:48:34.989 567-1033/? W/ActivityManager:   Force finishing activity 1 com.mybdesign.mobilebackendexample/com.nifty.cloud.mb.ncmbgcmplugin.UnityPlayerNativeActivity

どうやらmobile backendのプッシュ通知のデバイス登録をおこなうタイミングでクラッシュしているようでした。

GPGSのダウングレード

経験上、GPGSのインポート、セットアップで追加されるandroid-support-v4とgoogle-play-servicesがほかの広告SDKと競合を起こすことがよくあったので、まずこれを疑ってGPGSのダウングレードを試みました。

プロジェクトにインポート済みのGPGSを一旦削除して(GooglePlayGamesフォルダ、PlayServicesResolverフォルダ、Plugins/Androidのlibsフォルダ、MainLibProjフォルダをまず削除、Unityを再起動してからplay-services-.aarとsupport-.aarを削除)、old-builds/GooglePlayGamesPlugin-0.9.21.unitypackageをインポート、Windowメニュー→「Google Play Games」→「Setup」→「Android setup...」から再度セットアップをしました。

するとConsoleに大量のエラーが出力されます。

Assets/GooglePlayGames/ISocialPlatform/PlayGamesPlatform.cs(94,21): error CS0104: `Logger' is an ambiguous reference between `UnityEngine.Logger' and `GooglePlayGames.OurUtils.Logger'

Unity 5.3以降でUnityEngine.Loggerが定義されたので、こいつが曖昧だということですね。
ここは面倒ですが、GPGSでGooglePlayGames.OurUtils.Loggerクラスを使っているファイル全部に以下を追加して解決してやります。

using Logger = GooglePlayGames.OurUtils.Logger;

これで再度ビルドして実機で実行してみます。

04-10 01:29:21.040 28391-28411/? I/Unity: OnRegistrationSucceeded

(Filename: ./artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 37)

今度はmobile backendのデバイス登録に成功しているようですが...。

今度はGPGSが...

logcatをよく見ると、以下のようなログが出ています。

04-10 01:29:16.432 28391-28411/? D/GamesUnitySDK: Performing Android initialization of the GPG SDK
04-10 01:29:16.447 28391-28411/? E/GamesNativeSDK: Can't register class com/google/android/gms/appstate/AppStateManager: an exception occurred.
04-10 01:29:16.515 28391-28411/? E/GamesNativeSDK: Could not register one or more required Java classes.
04-10 01:29:16.688 28391-28411/? I/Unity: InvalidOperationException: There was an error creating a GameServices object. Check for log errors from GamesNativeSDK
                                            at GooglePlayGames.Native.PInvoke.GameServicesBuilder.Build (GooglePlayGames.Native.PInvoke.PlatformConfiguration configRef) [0x00000] in <filename unknown>:0 
                                            at GooglePlayGames.Native.NativeClient.InitializeGameServices () [0x00000] in <filename unknown>:0 
                                            at GooglePlayGames.Native.NativeClient.Authenticate (System.Action`1 callback, Boolean silent) [0x00000] in <filename unknown>:0 
                                            at GooglePlayGames.PlayGamesPlatform.Authenticate (System.Action`1 callback, Boolean silent) [0x00000] in <filename unknown>:0 
                                            at GooglePlayGames.PlayGamesPlatform.Authenticate (System.Action`1 callback) [0x00000] in <filename unknown>:0 
                                            at GooglePlayGames.PlayGamesLocalUser.Authenticate (System.Action`1 callback) [0x00000] in <filename unknown>:0 
                                            at MobileBackendExample.Start () [0x00000] in <filename unknown>:0 

(Filename: Line: -1)

どうやらGPGSが機能していないようです。そういえばGPGSのログイン画面が出なかったような...。

エラーの内容を見てみると、AppStateManagerクラスが登録できない様子。ググってみると、あるバージョンのgoogle-play-servicesからAppStateManagerクラスがなくなっているらしいことがわかりました。

Error Creating a GameServices object. ? Issue #884 ? playgameservices/play-games-plugin-for-unity

とりあえず旧バージョンのgoogle-play-servicesが入手できないか探してみます。するとStack Overflowにまんま直球の質問が。

java - How to download older google play services? - Stack Overflow

ここからひとつずつダウンロードしてAppStateManagerクラスが含まれているバージョンのgoogle-play-servicesを探します。
jarの中身を確認するのにはJava Decompilerを使いました。GUIもあって便利です。

r26のgoogle-play-servicesにはAppStateManagerクラスがあったので、これをプロジェクトにインポート済みのものと差し替えます1

Finally it works!

再度ビルドして動作を確認すると、GPGSのログイン画面も表示され実績やリーダーボードも機能していました。mobile backendの方も、正常にプッシュ通知が機能していました。

ライブラリのソースコードを書き換えたり、古いバージョンを使ったりしているので正直おすすめはできませんが、同様にハマった人の参考になればと思います。

オマケ

実はあと2つほどハマったポイントがあります。

  • Player SettingsのStripping LevelをDisabledにしておかないとmobile backendのデバイス登録が機能しなかった。
  • 使っているAndroidプラグインが多すぎて、ビルド時にToo many method referencesが発生→不要なjarを削除。


  1. ここで再度GPGSのセットアップをおこなうと、google-play-servicesを元に戻されてしまうので注意。 ?




from mybdesignの投稿 - Qiita

書評をいただきました! - 『uGUIではじめるUnity UIデザインの教科書』

Unity UIについて解説した書籍『uGUIではじめるUnity UIデザインの教科書』が世に出て3週間あまり、色々な方から書評をいただきましたのでご紹介したいと思います。

【書評】uGUIではじめるUnity UIデザインの教科書 - hotmiyacchiの休日

AppBank Gamesの社長でもあった宮川さん(@hotmiyacchi)による書評です。僕自身開発に関わったタイトル「ダンジョンズ&ゴルフ」や「トキノラビリンス」ではお世話になりました!相変わらずアツい文章で推していただいています。
ご本人も書かれていますが、共に仕事をしたのがUnity 3.5〜4.5時代なので、まだuGUIを使用して共に仕事をできていないのが残念ですね〜。

uGUIの使い方が分かる本「uGUIではじめるUnity UIデザインの教科書」 - 卵は世界である

続いて、派手髪開発者・ブロガーの@akio0911さんによる書評です。本書の各章について的確にご紹介いただいています。
普段はiOSアプリを開発されていたり、各地でiOSアプリの開発講座を開催されていたりする@akio0911さんならではの視点で書かれています。

Unity初心者は3時間でどこまでGUIを作れるのか? -- Unity UIデザインの教科書 - ここぽんのーと

そして最後に、@cocoponさんによる書評です。そろそろUnityを使ってみたいというオーラを出していたので、無理矢理本書をお渡ししました。
まったくのUnity初心者が、本書を読んで3時間でどこまでできるかということを実践していただいています。さすが!
この調子でどんどんUnityの世界にはまっていってもらいたいです。

お三方には書評をいただき、ありがとうございました!
『uGUIではじめるUnity UIデザインの教科書』のご購入を考えている方はぜひ、ご参考にしてみてください。


uGUIではじめるUnity UIデザインの教科書-Unity5対応

ポップの掲示をお願いしに書店へ行ってきました。 - 『uGUIではじめるUnity UIデザインの教科書』

『uGUIではじめるUnity UIデザインの教科書』が発売され多くの書店にも並んだということで、表紙のアイロンビーズを制作・撮影してくれたヌンちゃんとポップを作り、去る9月3日都内の書店さんに掲示をお願いしに行ってきました。


pop2.jpg

この日、都内の10の書店さんに伺いました(※版元さんを通じて事前に書店さんの了承を得た上で伺っています):
紀伊國屋書店 新宿南店様、紀伊國屋書店 新宿本店様、ジュンク堂書店 池袋本店様、ジュンク堂書店 吉祥寺店様、有隣堂 ヨドバシAKIBA店様、書泉ブックタワー様、八重洲ブックセンター 本店様、丸善 丸の内本店様、啓文堂書店 渋谷店様、ジュンク堂書店 渋谷店

朝から蒸し暑く1店目からいきなり汗だくになっていましたが、どの書店さんにも快く対応していただきました。ありがとうございました!
ポップは僕がすべて手書きしたものと、ヌンちゃんに書いてもらったものに署名したものの2種類があります(さらにキャッチコピーも2種類あります)。
もしかすると東京から遠く離れた地にもあるかもしれません。ぜひ探してみてください。

Amazonでのご購入はこちら:

【Amazon.co.jp限定】uGUIではじめるUnity UIデザインの教科書-Unity5対応 特典PDF付き

Amazonでの早期購入でAppendixを再編集した特典PDFがダウンロードできます。
特典PDFのお申し込みはこちら(2015年9月14日(月)23:59まで):
https://book.mynavi.jp/blog/pc/2015/08/12/811/

『uGUIではじめるUnity UIデザインの教科書』が発売されました!

IMG_0798.JPG

『uGUIではじめるUnity UIデザインの教科書』が発売され、書店にも並び始めました。著書が書店で平積みされているのを見ると、また感慨もひとしおです(感慨の余り写真がぶれている...)。

最近Unity関連の書籍がいくつか出版されたこともあり、Unityコーナーのできている書店も多く、ますますUnityの人気ぶりを知ることとなりました。
本書では主にUnityの新UIシステムについて取り扱っていますが、これからUnityを始めようとしている開発者の方向けのチュートリアルも収録していますので、ぜひご活用ください!

Amazonでのご購入はこちら:

【Amazon.co.jp限定】uGUIではじめるUnity UIデザインの教科書-Unity5対応 特典PDF付き

Amazonでの早期購入でAppendixを再編集した特典PDFがダウンロードできます。
特典PDFのお申し込みはこちら(2015年9月14日(月)23:59まで):
https://book.mynavi.jp/blog/pc/2015/08/12/811/

『uGUIではじめるUnity UIデザインの教科書』の見本誌が届きました。

IMG_0785.JPG

『uGUIではじめるUnity UIデザインの教科書』が紙の本になって手元に届きました!
今回初めて書籍を執筆しましたが、印刷されて実物になりこうしてインクのにおいをかぐと、感慨深いものがあります。

本書では400ページに渡りUnity UI(uGUI)を解説していますが、驚くことにそのほとんどのページがカラー(一部2色刷)で印刷されています。
これでサンプルコードもがっつり載っていて2,980円(税別)は、なかなかリーズナブルなのではないかと思います。

『uGUIではじめるUnity UIデザインの教科書』は9月1日発売です。
Amazonでは絶賛予約受付中で、Amazon限定の特典PDFもあります。
特典PDFのお申し込みはこちらから。
https://book.mynavi.jp/blog/pc/2015/08/12/811/

是非ともよろしくお願いします。


【Amazon.co.jp限定】uGUIではじめるUnity UIデザインの教科書-Unity5対応 特典PDF付き