[2023.01.27] Unityを始めてみる(16) - AdMobに再挑戦
Unityいじりを続けている。
以前の日記で【AdMob】に苦戦して挫折した様子を書いたが、エラー内容がサッパリわからんので広告実装はしばらく放置していた。
作成中のゲームを進めていたのだが、当たり判定やRayに四苦八苦したりTortouseGitとGitHubを導入するもリポジトリ作成に手こずったり、こっちはこっちで苦労していた。
その息抜き?気分転換?で、「ベースとなるプロジェクトを作っておくか…」と思い、「そうするとAdMobも入れておくべきだな…」となり、仕方なくAdMob実装に再トライすることにした。
新規プロジェクトにAdMobを入れたら、案外すんなりいくかもしれない。
…なんて淡い期待を抱きながら。
ちなみにUnityのバージョンは2022.3.16f。
※ 手っ取り早く結論を知りたければ【解決策まとめ】までジャンプ推奨
【奮闘記】
- ビルドエラー解消を目指す
サックリとベースを作り、いざAdMobの実装へ。
数多あるサイトや公式リファレンスを参考に実装し、Unity上での動作確認は終了。
そしてビルド。
…
…
…
はいエラー。
以前と状況が変わらなくてゲンナリしたが、まぁ挫折するのはまだ早い。
以前と同じラインに立っただけだ。
「Unity AdMob ビルドできない」やエラーメッセージそのものでググってみて、片っ端からチェックしていく。
「Gradle」やら「Resolve」やら「proguard」やら、謎のワードが次々と出てくるが、いろいろ試してもうまくいかない。
それまでざっとチェックしていた数多くのサイトにもう一度目を通していると、あるサイトで目が止まった。
詳しく読んでいくと、Gradle と APIレベル には依存関係があるらしく、使っているGradleのバージョンに対応するAPIレベルに設定する必要があるらしい。
自分の設定を見てみると、ターゲットAPIレベルは『Automatic(highest indtalled)』となっていた。
試しにこれを『API level 34』に変えてビルドしてみる。
すると、「APIレベルに対応するSDKをインストールするか?」的なメッセージが表示されるので許可する。
お、これは何かが進んだ感じがするぞ?
そして…
…
…
…
ビルドが通った!
通った!通ったよ!
APIレベルだかSDKのバージョンだか知らんけど、そこが原因だったのか…
たぶん2日ぐらいかかった。
- 実機での広告表示を目指す
ビルドが通ったので意気揚々と実機テストをしてみる。
エミュレータとして使っている NoxPlayer に apk をドラッグしてインストールし、アプリを起動。
…
…
…
広告が表示されない。
一応実機でも試してみたが、同様に広告は表示されない。
ひとまずコードにデバッグ出力を埋め込んで調査してみると、どうやら下記の行で止まっているようだ。
bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
しかしここからどうしたらものか。
「BannerView エラー」で検索してもクリティカルな情報が出てくるとは思えないので、「Unity AdMob 実機 表示されない」で検索して調べまくる。
再び「Gradle」やら「Resolve」やら「proguard」やらの謎のワードに翻弄されるが、どれを試してもうまくいかない。
自分のアプリIDや広告IDもチェックしたが、設定方法が間違っているわけでもなさそう。
この状態のまま、まる1日かかっていろいろやってみるが解決せず。
GitHub に AdMob のサンプルプログラムを上げてくれてる人がいたので、それも使ってみたが解決せず。
挫折しそうになる。
正直、AdMobを諦めて【Unity Ads】で妥協することも考えた。
しかし、やはり15秒のビデオ広告しか出せないのは使い勝手が悪い。バナー広告は欲しい。
※ …と思っていたのだが、どうやら【Unity Ads】でもバナー広告やリワード広告を出せるらしい。どうやら古い(or間違った)情報を見ていたようだ
また、AdMob実装が簡単になるアセットを使うことも考えた。
しかし、無料アセットは数年間更新されていないようで今は使えなさそう。
有料アセットは数千円するうえ、それを買ってうまくいく保証もない。
…やっぱり自力でAdMobを入れるしかないか。
ビルドは通せたんだから、実機での表示もきっとできる。
というか、ここで諦めたら一生AdMobを使う気が起こらなくなる気がする。
調査中に目にしつつ、「そこまでやらなくても解決するだろう」と考えてスルーしていた“実機ログを確認するツール”を使ってみることにした。
(「最初から使っとけよ」という声が聞こえてきそうだが、難しそうなことは避けたいじゃんね)
まずは『Android Logcat』を入れてみる。
これで実機ログを確認してみるが…膨大なログが出てきてゲンナリ。
どう見ればいいのかもよくわからんし、どこから手を付けたらいいのかもサッパリ。
うん、Logcatは一旦置いとこう。
もう一つ実機ログを確認する方法があったので、そちらも試してみる。
『Lunar Mobile Console』という無料アセットだ。
これでログを見てみると、エラーはたったの2つしか出てこない。
…お、これならイケるかも?
UnityEngine._AndroidJNIHelper:InvokeJavaProxyMethod(AndroidJavaProxy, IntPtr, IntPtr)
さっそく片方のエラーメッセージ(↑)で検索。
海外のフォーラムも見まくり、Gradleやらproguardやら謎の設定を繰り返した結果…
…
…
…
表示されない!
表示されないじゃん!
途方に暮れたまま半日以上経過したが、下記サイトにちょっと気になる記載を見つけた。
へー、こんなのがあるのかー。
自分の設定を確認してみると、『最低』に設定されていた。
(Unityのバージョンが上がっているため、上記サイトのように『無効』にはできなくなっているっぽい)
でも『無効』じゃないなら何かしら削除されてるのか?と思い、とりあえず AdMob のプラグインを再インポートを試してみことにした。
すると、インポート画面でところどころに“NEW”の表示が。
………?
なんで?最初に全部インポートしたよね?
まさかコレが原因なのか…?
ドキドキ…
インポートを進める。
ビルドする。
できたapkをNoxPlayerにインストールする。
アプリを起動する。
…
…
…
…
…
出たああぁああぁぁあああああぁあああ!!!
わああああああああああ!!!
念のため実機でも確認。
出たああぁああぁぁあああああぁあああ!!!
わああああああああああ!!!
…ふぅ。
結局のところ、
『Google Mobile Ads Unity Plugin』のファイルが最適化等で削除されてた?
もしくは最初のインポートでちゃんと入ってなかった?
わかるかこんなもん!
エラーも出てなかったじゃん!
何にせよ、5日間ぐらい悩んでようやく AdMob を使えるようになった。(バナーだけだけど)
【解決策まとめ(※自分のケース)】
- ビルド時にエラーが出る
ターゲットAPIレベルを上げる。
(というか、「Gradleのバージョンに合ったAPIレベルにする」って感じなのかな?)
- 実機で広告が表示されない
『Google Mobile Ads Unity Plugin』を再度インポートする。
(あと多分 Gradle やら proguard やらの設定も必要だけど、こっちはググればすぐ出てくる)
【あとがき】
最初から【Unity Ads】にしておけば(=「15秒の全画面広告しか出せない」と勘違いしていなければ)、こんなに苦労しなかったのかもしれない。
いずれ【Unity Ads】を実装する日も来るのかな。
その時はこんなに苦労せず実装できることを願うばかり。