ココのコイン落とし(以下コココイン)もいよいよ最後のパートになりました。AdMobの動画広告の導入です。
コココインでは、コイン落としゲームパートからホーム画面パートに移動する際に動画広告を挟むのと、紫魂石を獲得する為に動画リワードを利用しようと思っています。UnityAdsは単価が低いそうなので安定のAdmobを使ってみようと思います。
Mobile Ads Unityプラグインを導入する
まず https://developers.google.com/admob/unity/start ここを参考に、https://github.com/googleads/googleads-mobile-plugins/releases/latestここからUnityのアセットをダウンロードし、Unity側で[Assets] > [Import Package] > [Custom Package] してインポートします。
ここで何やら「Resolving Android Dependencies…」というダイアログが出ます。依存関係の問題のようですのでとりあえずenableを選択。後から変更できるようです。
依存関係のトラブルは本当に怖いので祈りながら自動で依存性解決が処理されていくのを眺めます。
Mobile Ads SDKについて
今導入したGoogle Mobile Ads UnityプラグインはUnity Play Services Resolverライブラリと一緒に配布されており、このライブラリはAAR等のAndroid固有ライブラリや、iOS CocoaPodにアクセスするUnityプラグインで使用するそうです。
さきほどのUnityプラグインには依存関係を宣言する機能があり、これを使うと依存関係は自動的に解決されUnityプロジェクトにコピーされるとの事。
Switch PlatformでAndroidにスイッチして、
[Assets] > [Play Services Resolver] > [Android Resolver] > [Resolve] を選択。「Resolution Succeeded」と出ました。
Assets/Plugins/Androidを見て*aar、*jarファイルが追加されている事を確認します。
iOSは追加の手順なし。(Unity5.6以上を使用する場合は依存関係ライブラリを含むxcworkspaceが生成される為、標準のXcodeプロジェクトの代わりにこちらを使うとの事)
アプリIDの設定
AdMobの「すべてのアプリ」画面のアプリタイトルの下にあるアプリIDをコピーして、Unityの[Assets] > [Google Mobile Ads ] > [Settings]の画面を開きます。
[Google AdMob]セクションの[Enabled]をオンにして、Android、iOSそれぞれの欄にこのアプリのAdMobアプリIDをペーストします。
(とありますが、実際には下記ソース)
私の場合は違いましたが、アプリでAdMobでなくアドマネージャーというものを使用しているならば[Google Ad Manager]セクションのEnabledをチェックして有効にする必要があるそうです。
※私のUnityのバージョンでは必要ないですが、Unity4を使っている場合はAndroidManifext.xmlの設定およびXCodeプロジェクトのビルド設定が必要なようです(
https://developers.google.com/admob/unity/start [Unity4との互換性]を参照)。
Unityプロジェクトへの実装
プロジェクトの中で一度は必ずMobileAds.Initialize()を呼び出す必要があります。最新のドキュメントでは以下のような実装が紹介されています。
MobileAds.Initialize(initStatus => { });
これは上記の [Assets] > [Google Mobile Ads ] > [Settings] でアプリIDを設定した場合に使えるやり方なのかもしれません。 下記ソースのように直接Initialize()にアプリIDを指定するやり方でも問題なさそうです。
ドキュメントにはInitialize()の呼び出しは起動時が理想的だとありますが、私の製作アプリはタイトル画面シーンとゲーム画面シーンとがありゲーム画面でしか広告は使わないので、ゲーム画面シーン内のGameObjectにアタッチした広告用クラスのStart()内で呼び出しています。
AdMobが各広告の具体的な実装例を示しているものがこちら。
また、同様に示されている、インタースティシャル広告のみの最低限の実装については以下のようになります。それぞれ比較してみてください。
using GoogleMobileAds.Api; … private InterstitialAd interstitial; private void RequestInterstitial() { #if UNITY_ANDROID string adUnitId = "ca-app-pub-3940256099942544/1033173712"; #elif UNITY_IPHONE string adUnitId = "ca-app-pub-3940256099942544/4411468910"; #else string adUnitId = "unexpected_platform"; #endif // Initialize an InterstitialAd. this.interstitial = new InterstitialAd(adUnitId); // Called when an ad request has successfully loaded. this.interstitial.OnAdLoaded += HandleOnAdLoaded; // Called when an ad request failed to load. this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad; // Called when an ad is shown. this.interstitial.OnAdOpening += HandleOnAdOpened; // Called when the ad is closed. this.interstitial.OnAdClosed += HandleOnAdClosed; // Called when the ad click caused the user to leave the application. this.interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication; // Create an empty ad request. AdRequest request = new AdRequest.Builder().Build(); // Load the interstitial with the request. this.interstitial.LoadAd(request); public void HandleOnAdLoaded(object sender, EventArgs args) { MonoBehaviour.print("HandleAdLoaded event received"); } public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) { MonoBehaviour.print("HandleFailedToReceiveAd event received with message: " + args.Message); } public void HandleOnAdOpened(object sender, EventArgs args) { MonoBehaviour.print("HandleAdOpened event received"); } public void HandleOnAdClosed(object sender, EventArgs args) { MonoBehaviour.print("HandleAdClosed event received"); } public void HandleOnAdLeavingApplication(object sender, EventArgs args) { MonoBehaviour.print("HandleAdLeavingApplication event received"); } private void GameOver() { if (this.interstitial.IsLoaded()) { this.interstitial.Show();//広告表示 } } }
ソース内の広告IDはサンプルなのでテスト用にそのまま使えますが、AdMobのアプリIDは自分のものに書き換えておきます。
基本的にはこの通りで問題ありませんが、いくつか注意があります。
Unity Editorでは広告が表示されない
Unityのゲーム画面では広告が表示されない(?)ようなので、AdMobのイベントハンドラなどに広告終了後などの処理を色々記述していると、InterstitialAd.IsLoaded()は真なのに広告は表示されないという状態になり、ゲーム状態も復帰できずUnity上のテストでは処理が止まってしまいました。
なので念の為、プラットフォーム依存コンパイルの機能を使ってUnity Editorでの広告処理をスキップするような処理を入れてしまいます。
#if UNITY_EDITOR //Unityエディタの場合の処理。広告スキップなど #elif UNITY_ANDROID //Androidの場合の処理。Android用広告IDの準備など #elif UNITY_IOS //UNITY_IPHONEは非推奨。iOSの場合の処理 #else //その他のプラットフォームでの処理 #endif
注意すべき事は、「UNITY_EDITORはUNITY_ANDROIDやUNITY_IOSを包含している」という点です。
UnityをAndroidにスイッチしてる時にテスト実行する場合、UNITY_EDITORもUNITY_ANDROIDも真になってしまうので、UNITY_EDITORを下に記述してしまうとそのブロックに処理が届きません。
広告テストの流れ
AdMob広告はたとえ開発中のテスト動作のつもりであっても、それを明示的に示さずに表示してしまうとペナルティがあるそうです。
なので以下の手順で広告をチェックできるようにします。
1.まずAdMobのテスト広告IDを使って表示する
AdMobが用意しているテスト広告ユニットIDであれば何度表示しても問題ありません。サンプルコードに書かれているのでそのまま利用してビルドし実機でバッグし、動画の表示ができるか確認します。
※Unity EditorではAdMobを表示できないので注意
2.自分のテスト用デバイスIDを取得する
するとAdRequest.Builder()を呼び出す際に、実機デバッグをしているとコンソール(AndroidならAndroid SDKのmonitor.batなどを使う(参考))にAndroid「I/Ads: Use AdRequest.Builder.addTestDevice(“33BE2250B43518CCDA7DE426D04EE232”) to get test ads on this device.」や「 To get test ads on this device, call:
request.testDevices = @[ “2077ef9a63d2b398840261c8221a0c9b” ];」というようなメッセージが出てくるので、それをフィルタリングして見つけます。
テストに使う端末分、この作業を繰り返します。
3.AddTestDevice()で自分のテストデバイスを登録する
AdRequest.Builder()を呼び出す際にAddTestDevice()を以下のように追加します。
AdRequest request = new AdRequest.Builder() .AddTestDevice("テストデバイスID") .Build();
.AddTestDevice()の行は追加するテストデバイスの分だけ追加します。
これで再度ビルドして実機デバッグすると画面上に「テスト広告」というラベルが表示されるようになります。
4.テスト用広告IDを実際の広告IDに差し替える
現在使っているデバイスはテスト用デバイスとして登録された事が確認できたので、テスト用広告IDは実際の広告IDに差し替えて実際の広告を確認する事ができます。この広告はクリックしてもカウントされないので問題ありません。
ただし、たまたまテストデバイスとして登録していない別の端末でテストしてしまった、というような事が無いように気をつける必要があります。
5.AddTestDevice()のコードを削除してリリース
リリースビルドする前にはAddTestDevice()の各行を削除しておきます。
コメント
[…] 先日の記事でAdMobの動画リワードおよびインタースティシャルを実装したのですが、リリースビルドでテスト用端末で実機テスト(本番広告ユニットを使いAddTestDevice()でテスト広告表示)し […]