【Unity】Google Mobile Ads Unity Plugin を試す
今回は Google Mobile Ads SDK Unity プラグインを使った動画リワード広告を試してみました。
リワード広告とは
ユーザーが広告を操作・視聴するのと引き換えに、アプリ内で報酬を獲得できるものです。スマホのアプリでよくある、ここから先は動画広告を見たら遊べる的なやつです。
Google AdMob
まずは Google AdMob でAdMobアカウント、アプリ情報、広告ユニットの作成をします。すでにある方は読み飛ばしてOKです。
AdMobアカウント作成
こちらの Google AdMob にアクセス、アカウントが無ければ以下のような表示になります。
必要な情報を入力してAdSence 利用規約を確認してチェックを入れたら「ADMOBアカウントを作成」をクリック
ちなみに私は以下の情報で作成
国または地域:日本
タイムゾーン:(UTC+09:00) 東京
お支払い通貨:(JPY¥)
アプリ情報を作成
アプリ固有のアプリIDを取得するためにアプリ情報を作成してAdMobに追加します。
広告ユニットを作成
アプリ用の広告ユニットを作成します。
Google Mobile Ads Unity Plugin
パッケージのインストール
こちらのGitHubから GoogleMobileAds-v[バージョン].unitypackage をダウンロードします。
適当なUnityプロジェクトを作成して Assets > Import Package > Custom Package からダウンロードした .unitypackage をインポートします。
インポート中に Package Manager Resolver ウインドウが表示され、Game Package Registry by Google のレジストリをPackage Managerに追加して良いかと聞かれるので 「Add Selected Registries」をクリックします。
次に Assets > Google Mobile Ads > Settings を選択
GoogleMobileAdsSettings.assetが生成されます。
Android用の設定
Assets > External Dependency Manager > Android Resolver > Settings を選択
Enable Auto-Resolution, Enable Resolution On Build のチェックを外しておきます。
最後に Assets > External Dependency Manager > Android Resolver > Resolve を選択すると
Android 固有ライブラリ(AARなど) が Assets/Plugins/Android に配置されます。iOS用の設定
Cocoapods が未インストールの場合は
Assets > External Dependency Manager > iOS Resolver > Install Cocoapods からインストール
次に Assets > External Dependency Manager > iOS Resolver > Settings を選択
Xcode Project - Add Cocoapods to the Xcode project を選択後、OKをクリック
これでUnity Editor上で必要な設定は完了です。
スクリプトの設定
適当なCSファイルを作成して広告表示までの処理を書いていきます。
初期化
アプリ起動時などに MobileAds.Initialize() を一度だけ呼び出して初期化します。
using UnityEngine; using GoogleMobileAds.Api; using GoogleMobileAds.Common; public class SampleAds : MonoBehaviour { void Start() { // 広告を読込前に一度だけ呼び出す. MobileAds.Initialize( OnInitCompleted ); } void OnInitCompleted( InitializationStatus initStatus ){ } }
広告オブジェクトの作成と読込
広告ユニットIDを設定してリワード広告オブジェクトの作成と読込を行います。
RewardedAd m_rewardedAd; void CreateAndLoadRewardedAd() { // プラットフォームに応じた広告ユニットIDを設定. string adUnitId = "unexpected_platform"; #if UNITY_ANDROID adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx"; #elif UNITY_IPHONE adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx"; #endif // リワード広告オブジェクトを作成. m_rewardedAd = new RewardedAd( adUnitId ); // リワード広告を読込. AdRequest request = new AdRequest.Builder().Build(); m_rewardedAd.LoadAd( request ); }
広告の表示
リワード広告の表示は RewardedAd.Show() を呼ぶだけです。ただし、広告を1回表示するとそのRewaredAdオブジェクトは破棄されるので、このオブジェクトを使い回して以降の広告を読込/表示はできません。
void Show() { if( m_rewardedAd.IsLoaded()){ m_rewardedAd.Show(); } }
イベントの設定
以下のようにRewardedAdに広告用イベントを設定できます。
m_rewardedAd.OnAdLoaded += OnAdLoaded; // 広告読込完了時に呼び出される. m_rewardedAd.OnAdClosed += OnAdClosed; // 広告を閉じた時に呼び出される.
設定できるイベントは以下です。
イベント | 説明 |
---|---|
OnAdLoaded | 広告読込完了時に呼び出される。 |
OnAdFailedToLoad | 広告の読込失敗時に呼び出される |
OnAdOpening | 広告が表示されると呼び出される。用途は必要に応じてアプリの音声やゲームループを停止する等 |
OnAdFailedToShow | 広告の表示が失敗時に呼び出される |
OnAdClosed | ユーザが「閉じる」アイコンまたは「戻る」ボタンをタップして広告を閉じると呼び出される。用途は必要に応じてアプリの音声やゲームループを再開する等 |
OnUserEarnedReward | 動画広告を視聴したユーザへのリワード付与時(動画を最後まで視聴した時)に呼び出される。引数のRewardには広告ユニットに設定した報酬アイテム(Type)報酬の数(Amount)が入る |
<注意>上記イベントはUnityのメインスレッドとは別スレッドで実行されるので、設定したイベント内でUnityのAPIを呼びたい場合は以下のように MobileAdsEventExecutor.ExecuteInUpdate() を使って例外を回避する必要があります。
[SerializeField] UnityEvent m_onLoadedAd; void OnAdLoaded( object sender, EventArgs args ) { MobileAdsEventExecutor.ExecuteInUpdate( ()=>{ m_onLoadedAd.Invoke(); }); }
イベントをキューイングしてUpdate()で実行してるだけなので同様の処理を自前で書いても良いです。
開発中の動作検証について
開発中にテスト広告を使わずに何度もリリース用の広告を呼び出すと不正な操作と検出されてAdMobアカウントをBANないしは利用制限が掛かる可能性があります。
テスト広告ユニットID
遷移やイベントの検知確認などのアプリをリリースする前のチェックであればこちらにテスト広告ユニットIDが用意されているのでこれらを使用してください。
テストデバイス追加
テスト広告ユニットではなく自分の作成した広告ユニットで確認したい場合、対象端末のテストデバイスIDを追加すれば確認できます。
テストデバイスIDの確認と設定方法は以下です。
1.まずは先程のスクリプトの公告ユニットIDを設定するところをテスト広告ユニットIDに変更します。
void CreateAndLoadRewardedAd() { // 動画リワードのテスト広告ユニットIDを設定. string adUnitId = "unexpected_platform"; #if UNITY_ANDROID adUnitId = "ca-app-pub-3940256099942544/5224354917"; #elif UNITY_IPHONE adUnitId = "ca-app-pub-3940256099942544/1712485313"; #endif m_rewardedAd = new RewardedAd( adUnitId ); AdRequest request = new AdRequest.Builder().Build(); m_rewardedAd.LoadAd( request ); }
2.上記スクリプトが含まれる確認用アプリを作成して起動後のログからテストデバイスIDを取得します。
Android
adb logcat | grep I/Ads から確認できます。
I/Ads (12708): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("ここにテストデバイスIDが入る") to get test ads on this device.
iOS
・XCode の View > Debug Area > Active Console から確認できます。
<Google> To get test ads on this device, set: GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"ここにテストデバイスIDが入る" ];
以下のエラーが出る場合、iOS端末の 設定 > プライバシー > 広告 > 追跡型広告の制限をオフにしてアプリを再起動してください。
<Google> Limit Ad Tracking may be enabled. To get test ads on this device, disable Limit AdTracking.
3.確認したテストデバイスIDを AdRequest.AddTestDevice() に設定します。
<注意>リリース版ではAddTestDevice()が含まれないようにしてください
// リワード広告を読込. AdRequest request = new AdRequest.Builder() .AddTestDevice( AdRequest.TestDeviceSimulator ) #if UNITY_ANDROID .AddTestDevice( "テストデバイスID for Android" ) #elif UNITY_IPHONE .AddTestDevice( "テストデバイスID for iOS" ) #endif .Build();
これで準備が完了です!自分の作成した広告ユニットを使いテストデバイスによる確認ができます。長かった・・・^_^;
まとめ
最後に簡単なミニゲームとリワード広告を連携させたサンプルをこちらのGitHubにアップしておきました。
参考
・始める | Unity | Google for Developers
・[Xcode]Mac OS Catalinaにアップデートしたらpodコマンドが通らなくなった