Google Mobile Ads Unity Plugin の更新 Vol.2 (2023年11月版)後編

  • 2023年11月21日
  • 2023年12月15日
  • Unity

こんにちは。ちでソフトです。
本記事では、Google Mobile Ads Unity プラグイン の更新作業について紹介しています。
こちらは後編になります

本記事の概要(バージョンにご注意)

前編
・Google Mobile Ads Unity Plugin v7.0.1をv8.6.0へ更新します。
・バナー広告の実装の仕方をコード付きで紹介します。
後編
・リワード広告の実装の仕方をコード付きで紹介します。
・ビルド時のエラー対応を紹介します。

共通
・Unityエディタは2021.3.24fを使用しています。

 

スクリプトの編集

 
レモちゃん
さて、お待ちかねのリワード広告です。
 
かなえ
その前に、皆さまへお伝えしておきたい注意事項を箇条書きでリストアップしております。
前編の内容を再掲させていただきます。
・本記事では、以下コードが紹介されておりますが、一部公式サイトとは異なる内容になっています。プラグイン付属のサンプルも参考にしています。

・最低限こんな具合に記述していけば、各広告が表示されるようになるはずですよ、といったレベルの内容です。また、すでにGoogle Mobile Ads Unity Pluginを導入されたことがある方には不必要な説明も含まれているかと存じます。

・一部のメソッドの実行方法(ボタンと組み合わせて手動実行にするか、または void Start() で自動実行にするかなど)につきましては、具体的な実装は各自にお任せさせていただいております(つまり丸ごとコピペしただけでは広告は表示されないです)。

・実際には広告を最適に表示させる手段が存在していたり、各状況に応じた細かいカスタマイズが必要になる可能性がありますが、それらの説明は割愛させていただきます。

・プラグインのバージョンごとに記述が異なってくる可能性も孕んでいるはずなのでご注意ください(実際、流用できたりできなかったりします)。

・つきましてはご参考にするしないは各自のご判断にお任せさせていただきます。実装に関連するご質問は受け付けておりませんのでご了承ください。

 
レモちゃん
大切なことですので、ご理解お願いいたします。
 
 
かなえ
また、当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください


リワード広告

 
かなえ
リワード広告につきましては、バナー広告以上に解説が必要になりそうですね。

このクラスには、4つのメソッドが存在します。それぞれの役割をおおざっぱに説明しますと、

1   LoadAd          広告を読み込む
2   RegisterEventHandlers  広告の処理を定義する
3   ShowAd        広告を表示させて、さらに一定時間視聴後に報酬を与える
4   DestroyAd  広告を破棄する

・・・となっていまして、コードを記述する際は数字の順に各メソッドが行われるようにします。
なお後述しますが、処理の順序はスマホ実機と開発環境(Unityエディタ)とでは一部が異なるので注意が必要です。

まず考慮するべき事は、スマホ実機においては、広告を読み込む処理に時間がかかるという点です。
(Unityエディタ上ではテスト広告がすぐに表示されるため、初学者は見落としやすいかもです)
通信環境にもよりますが、最低でも数秒はかかると見込んでおいたほうがいいでしょう。

よって、LoadAdメソッドが終了しないうちにShowAdメソッドが実行された場合に、プレイする側からしたら不自然な挙動にならないような工夫が必要になります。
たとえば、リワード報酬をもらうボタンがゲームシーン上にはじめから表示されていると、「アレ押しても何ももらえないじゃん?」という期間がわずかながらも発生します。
Updateメソッドを活用してローディングメッセージを表示させたり、LaodAdメソッドが終了するまではShowAdメソッドを行うボタンは表示させない、みたいな処理を追加したほうがよいでしょうか?

また、通信環境は常に安定しているとは限りません。
ユーザーが電車に乗ってプレイしている最中に通信が遮断された間は、リワード報酬はもらえないようにするべきなのか?またその旨や原因を通知する仕組みも必要なのかどうかも判断が必要になるでしょう(ここは記述やルールが甘すぎると、抜け道を見つけたとばかりにわざとスマホ本体の通信機能を常時オフにしてプレイするユーザーも出現するかもしれませんね)。

そもそもリワード広告を、ゲームにおけるどの位置に配置するべきか?またどういう報酬をどのように与えるのか?という課題もありますが、公式による定義を熟読することもおすすめします。

 
レモちゃん
う~ん。さすがにややこしいわね。
 
かなえ
ここでは全ての対処の仕方はご案内できないけれど、公式に載っていない注意点なども説明するので、参考にしていただければと思うわ。
 
かなえ
まず※①の箇所だけど、通信の切断などによる広告の読み込みの失敗は、ここで検知されるようなので、それに応じた処理をその下のif文の中に記述してね。
 
レモちゃん
一番起こりやすいエラーかもね。
 
かなえ
※②は、どのような場合に起こるのか不明だけど、※①と同じ処理を記述するかどうかは各自にお任せね。
 
レモちゃん
バグを発見して報告したら、表彰されたりするのかな?
 
かなえ
※③ RegisterEventHandlersメソッドの実行は、このように記述して良いみたいね。
 
レモちゃん
ライブラリ付属のサンプルコードでは、そうなっているのよね。

ShowAdメソッドもここに追加したら動きそうだけど・・・?

 
かなえ
ええ。試してみたらスマホ実機(テストデバイスとして登録済み)でもテスト広告の表示が確認できたわ。
だけど、あたし達はそのメソッドは別に取り扱うことにしましょう。
 
レモちゃん
なら少し工夫が必要そうね。
_rewardedAd != null && _rewardedAd.CanShowAd() になるまで 繰り返し監視を続けるみたいな 処理を別途自作すればいいかな・・・。
 
 
かなえ
※④ の付近には、LoadAdメソッドによる広告の読み込みが終わり、広告が表示できる状態になった際の処理を記述してね。
 
レモちゃん
別途自作したローディングメッセージを消したり、ボタンを表示させたりすればいいのね?
 
かなえ
※⑤では、広告を最後まで視聴してもらった後に与える報酬を記述してね。
 
レモちゃん
じゃあ、bool型の変数 IsEarnReward が true になるという報酬にしておくね。
 
 
かなえ
ええ、ひとまずそれでいいわ。次の※⑥に関連した説明したいことがあるので。
 
ふう。五月雨式になっていて読みにくいわよね。
もう少しだけ付き合ってね
 
かなえ
※⑥ RegisterEventHandlersメソッドは、設定できる項目がいくつかあるけれど、今回はad.OnAdFullScreenContentClosed のみ説明しておきたい注意点があるの。
 
レモちゃん
「広告が全画面コンテンツを閉じたときに発生します」といった機能ね。どういう注意なの?
 
かなえ
簡単に言うと、実行される順序が、スマホ実機とUnityエディタでは異なるのよ。
 
レモちゃん
え?どういうこと!?

例えば、ユーザーがリワード広告を閉じた直後に、ShowAdメソッドに指定した、※⑤の報酬を受け取ったかどうか(広告を最後まで視聴したかどうか)を確認したいとします。
IsEarnReward変数がtrueになったかどうかをチェックして、内容に応じてシーンの遷移先を分岐するChkEarnRewardメソッドを用意してみました(リワード広告の本来の性質や実装ルールをここでは考えずに、あくまでも説明のためのコードとします)。

このChkEarnRewardメソッドは、OnAdFullScreenContentClosedに追加しています。つまり広告が閉じられたら実行されるわけですね。

そして、Unityエディタおよびスマホ実機(ビルド済み)にて、それぞれ挙動を確認してみたところ・・・。

 
レモちゃん
あれ?シーンの遷移先が異なるんだけど!?
 
かなえ
スマホだときちんと報酬を得られているようだけど、Unityエディタではそうでないということのようね。

検証してみたところ、スマホ実機では広告を最後まで視聴した時点でShowAdメソッド内の報酬をもらえる処理(※⑤におけるIsEarnReward変数がtrueになる処理)が実施されるのですが、Unityエディタでは、テスト広告上の【Close Ad】ボタンを押せる段階になった後、押した際にOnAdFullScreenContentClosedが実施され、その直後に報酬をもらえる処理が動く仕様になっていました。

よって、今回の例でいえばUnityエディタ上ではChkEarnRewardメソッドによるチェックが行われる際にはIsEarnReward変数がfalseのままになっているため、結果としてこのような違いが生じてしまうのでした(以前のAdsでは見られなかった現象のはずですが・・・)。

処理の流れを要約すると、こうなります。

【スマホ実機】   【エディタ】
   広告の表示            広告の表示
           ↓                             ↓
   広告の視聴            広告の視聴
           ↓                             ↓
   報酬の獲得            広告を閉じる
           ↓                             ↓
   広告を閉じる        報酬の獲得

実際にコードを記述される際は留意しておいていただければと存じます。

 
レモちゃん
ひとまず、バナー広告とリワード広告は表示できるようになったわね。
 
かなえ
ヒントとしてはもの足りなかったかもしれないけれど、皆さんの環境に応じて手を加えながら取り入れてもらえればいいわね。

ビルドの注意点

Android

 
かなえ
前編でご紹介した内容になりますが、【Project Settings】にて【Build】の設定を忘れずに行っておいてくださいね。
 
レモちゃん
うん。そこは確認済み。ではさっそくビルド実行っと・・・

あ~ん!!エラーが出ちゃったわよ~~!!

 
かなえ
ああ・・・。「 java.lang.UnsupportedOperationException: This feature requires ASM7 」が出てしまうのね。以下のように試してみて!!

手順

Unityエディターの上部メニューより【Edit】→【Project Settings】→【Player】→【Publishing Settings】→「Minify」より以下を選択します。

・「Use R8」
・「Release」

以上

 
レモちゃん
やったわ。ビルドに成功したわ!!
 
かなえ
じゃあ、テスト広告が表示されるか確認してみましょう・・・。
 
レモちゃん
だめだわ!!ゲームは普通にプレイできるけれど、
バナー広告もリワード広告も表示されないわ!!
 
かなえ
う~ん。ログを調査してみましょうか。
パソコンにスマホを接続したら、Unityエディタ上で「Android Logcat」を起動してみて。
 
 
レモちゃん
Android Logcatの詳しい使い方は割愛しますね。
 
かなえ
「AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.AdRequest」って出ているわね。

この事象につきましては、Google Mobile Ads Unity プラグインがダウンロードできるサイト(GitHub) に回避方法らしき情報が掲載されていましたので、そちらを参考にさせていただきました。

手順

1)【Edit】→【Project Settings】→【Player】→【Publishing Settings】→「Build」より以下を選択します。

・Custom Proguard File

2) 以下のテキストファイルを編集します。

Assets\Plugins\Android\proguard-user.txt

以上

PR レモちゃんのスライドランド
 
レモちゃん
やったわ。今度は表示されたわ!!

▼Logcatで取得したスマホ実機のキャプチャーです。これ、こういう時便利ですよね。

 
かなえ
ビルド時など、他にもエラーが出るようであれば、下の補足も読んでみていただけないでしょうか。

iOS

 
レモちゃん
iOSでは、ビルドでつまづくようなことは起こりませんでした。
広告もきちんと表示することができました。
 
かなえ
なお、AppleStore に提出する際のおはなしですが、iOS14以降につきましては、「App Tracking Transparency」に対応させる必要があります。
この記事では詳細は割愛させていただきます。
 

補 足
実は、今回の記事はもともとはGoogle Mobile Ads Unity プラグインの一つ前のバージョンであるv8.5.3を取り扱いながら執筆をしておりました。当方のアプリ「レモちゃんのスライドランド」はv8.5.3を導入して最新版をリリースいたしまして、その際の経験に基づいて執筆していたのですが、ちょうど下書き原稿の終わりかけの頃にv8.6.0がリリースされまして、あわてて調査からやり直した次第です。

プラグイン付属のサンプルのコードをDiffで比較したかぎり、広告表示関連のものにつきましてはv8.5.3と同じでしたので、加工前のコードはそのまま流用しております。また、ここで指摘した注意点など、取り扱い方法についても同じままのようです。

なお、Androidのビルドにつきましては、v8.5.3はjava.lang.UnsupportedOperationExceptionや、java.lang.ClassNotFoundExceptionといった上記のエラーがまったく出なかったため、すんなりと通った印象です。iOSのビルドも同様にスムーズにできました。

環境の違いにも寄るかと思いますが、もしもv8.6.0を導入された方で他のエラーが出てビルドに失敗したり不具合がみられるようであれば、v8.5.3の使用をご検討されてみることもよいのではと思います。

 
かなえ
アプリに広告を実装してリリースする際には、国や地域によりましては、別途対応が必要になるかと存じますので(例・EU向けのGDPR対応)、詳細につきましては公式サイト等のご確認をお願いします。

まとめにかえて

個人的なお話ですが、この記事を公開した背景としまして、前回の記事が思っていた以上にアクセス数があり、しかも内容に心残りがあったため、再びプラグインの導入に挑むことにいたしました。

その途上におきまして、とても驚くような出来事が起こりました。新しいバージョンが出ていた、というのもありますが・・・。深い悲しみに包まれ作業に力が入らなくなったものですが、今一度自分に何ができるのかを問い、あきらめることなく記事の完成に取り組んでみました。ITスクールの恩師からいただいた『一番大切なことは完成させること』という言葉も思い出しながら。

前編・後編併せまして、ようやく最低限必要な情報をお伝えするという使命は果たせたのではと思います。不十分と思われる方がいらっしゃるかもしれませんが、ご容赦くださいね。

皆さまの導入作業も無事に成功できますように!!
最後まで読んでいただきまして、どうもありがとうございました。

最新情報をチェックしよう!

Unityの最新記事4件

>レモちゃんのスライドランド

レモちゃんのスライドランド

ちでソフトがリリースしたスマホ用アクション&パズルゲームです。
AppStore,GooglePlayにて無料でダウンロードできます。
ぜひ、遊んでみてくださいね!

CTR IMG