はじめに
この記事はUnityのアセット Easy Mobile Pro を利用してAdmobの広告導入を解説する記事です。
Easy Mobile Pro とは
Easy Mobile Proは広告、アプリ内購入、通知、共有などのモバイルゲームに必須とも呼ばれる機能を開発サポートを行ってくれるアセットです。
Easy Mobile Pro 導入の記事はこちら
環境
- Unity
- 2021.3.16f1
- EASY MOBILE Pro
- v2.19.0
- Google Mobile Ads Unity Plugin
- v7.3.1
準備
広告機能を有効にする
Easy Mobile Pro パッケージ導入済みであればEasy Mobile の管理画面を起動できます。
管理画面の ADVERTISING をONにすることで広告機能が有効になります。
Auto Init がONであれば自動でアプリ起動時に自動で初期化されます。初期化を手動で制御したい場合はチェックを外し、下記コードを良きタイミングで呼んであげれば初期化できます。
var adMobClient = Advertising.AdMobClient; if (!adMobClient.IsInitialized) { adMobClient.Init(); // 初期化完了待ち while (!adMobClient.IsInitialized) { await UniTask.Yield(); } // 初期化完了 }
利用する広告機能を有効にします。この記事ではAdmobを利用するのでAdmobをONにします。
Admobパッケージの導入とセットアップ
導入
Admobのパッケージは Google のGitHub上でunitypackageとして公開されています。Download Google Mobile Ads Plugin を押すことで対象のページをブラウザで開いてくれます。
unitypackageをダウンロードして、
インポートしましょう。
セットアップ
次に Setup Google Mobile Ads を押すことでセットアップ用のScriptableObjectが作成されます。
Assets/GoogleMobileAds/Resources/GoogleMobileAdsSettings
と言うパスでアセットが生成されるので確認します。
ここにAdmobで生成された App ID を設定することになります。(※ここではテスト用のApp IDを設定しています)
最後に 広告ユニットID をEasy Mobileの管理画面に入力してセットアップ完了です。こちらもリリース時であればAdmobで発行する必要がありますが、開発中であればテスト用の広告ユニットIDがあるのでそれを利用しましょう。
テスト広告ユニット
この記事の執筆時点ではテスト用広告IDは下記ページに記載されています。
広告の表示
初期化
上述しましたが、Auto Init にチェックが入っている場合初期化用のコードは必要ありません。チェックを外して自分で初期化タイミングを制御する場合、良きところに下記のようなプログラムを仕込みましょう
var adMobClient = Advertising.AdMobClient; if (!adMobClient.IsInitialized) { adMobClient.Init(); // 初期化待ち while (!adMobClient.IsInitialized) { await UniTask.Yield(); } // 初期化完了 // ここから広告のロードとか可能になる }
広告のロード
バナー広告を除く広告はロード用のメソッドがあるのでロードしておきます。ロード完了とロード失敗のコールバックがあるのでこれらを使ってロード状態を管理することができます。
// ロード処理開始 // コールバックはロードメソッドを呼ぶ前に登録しましょう var adMobClient = Advertising.AdMobClient; // リワード広告ロード完了 adMobClient.OnRewardedAdLoaded += (sender, args) => { Debug.Log($"Admob OnRewardedAdLoaded"); }; // リワード広告ロード失敗 adMobClient.OnRewardedAdFailedToLoad += (sender, args) => { Debug.LogError($"Admob OnRewardedAdFailedToLoad"); }; // インタースティシャル広告ロード完了 adMobClient.OnInterstitialAdLoaded += (sender, args) => { Debug.Log($"Admob OnInterstitialAdLoaded"); }; // インタースティシャル広告ロード失敗 adMobClient.OnInterstitialAdFailedToLoad += (sender, args) => { Debug.LogError($"Admob OnInterstitialAdFailedToLoad"); }; // リワードインタースティシャル広告ロード完了 adMobClient.OnInterstitialRewardedAdLoaded += (sender, args) => { Debug.Log($"Admob OnInterstitialRewardedAdLoaded"); }; // リワードインタースティシャル広告ロード失敗 adMobClient.OnInterstitialRewardedAdFailedToLoad += (sender, args) => { Debug.LogError($"Admob OnInterstitialRewardedAdFailedToLoad"); }; // リワード広告ロード Advertising.LoadRewardedAd(); // インターステンシル広告ロード Advertising.LoadInterstitialAd(); // リワードインターステンシル広告ロード Advertising.LoadRewardedInterstitialAd();
広告の表示
バナー広告表示
バナー広告の表示は Advertising.ShowBannerAd
を呼ぶだけです。BannerAdPosition
でバナーを出す位置を指定することができます。
Advertising.ShowBannerAd(BannerAdPosition.Bottom);
バナー表示・表示失敗時のコールバックもあるので、上記のメソッドを呼ぶ前に登録しておくことで良きタイミングで処理を挟むことができます。
var adMobClient = Advertising.AdMobClient; // バナーが表示されたコールバック adMobClient.OnBannerAdOpening += (sender, args) => { if (sender is BannerView bannerView) { Debug.Log($"Admob OnBannerAdOpening ({bannerView.GetWidthInPixels()}, {bannerView.GetHeightInPixels()})"); } else { Debug.Log($"Admob OnBannerAdOpening"); } }; // バナー表示に失敗した時のコールバック adMobClient.OnBannerAdFailedToLoad += (sender, args) => { Debug.LogError($"Admob OnBannerAdFailedToLoad"); };
インタースティシャル広告表示
インタースティシャル広告表示も Advertising.ShowInterstitialAd
を呼ぶだけです。
Advertising.ShowInterstitialAd();
広告表示の準備完了をチェックするメソッドも存在するので、実際に利用する場合はそちらもチェックするのが良いと思います。サンプルコードを挙げておきます。
// 広告準備タイムアウト時間 var timeOutDuration = 3.0f; // trueになるまで待つ while (!Advertising.IsInterstitialAdReady()) { await UniTask.Yield(); timeOutDuration -= Time.deltaTime; // タイムアウトしたら表示しないで戻る if (timeOutDuration <= 0.0f) { Debug.LogError($"Interstitial Ad Failed IsInterstitialAdReady"); return; } } Debug.Log($"Interstitial Ad Completed IsInterstitialAdReady"); // 広告表示 Advertising.ShowInterstitialAd();
また広告の表示完了用コールバックもあるので必要であればこちらも使うとよさそうです。
private void Awake() { // インタースティシャル広告表示完了コールバック登録 Advertising.InterstitialAdCompleted += OnInternalInterstitialAdCompleted; } /// <summary> /// インタースティシャル広告完了通知 /// </summary> private void OnInternalInterstitialAdCompleted(InterstitialAdNetwork client, AdPlacement placement) { // 表示完了時にやりたいこと }
リワード広告表示
リワード広告も表示まではインタースティシャル広告と同じようにできますが、リワード広告の特性上「広告視聴を完了したかどうか」を検出する必要があります。 広告視聴を完了したかまたはスキップしたかは専用のコールバック関数があるのでそれを用いて検出することができます。
private void Awake() { // リワード広告コールバック登録 Advertising.RewardedAdSkipped += OnRewardedAdSkipped; Advertising.RewardedAdCompleted += OnRewardedAdCompleted; } /// <summary> /// リワード広告スキップ通知 /// </summary> private void OnRewardedAdSkipped(RewardedAdNetwork client, AdPlacement placement) { // リワード広告スキップ時の処理 } /// <summary> /// リワード広告完了通知 /// </summary> private void OnRewardedAdCompleted(RewardedAdNetwork client, AdPlacement placement) { // リワード広告完了時の処理 }
広告表示の処理は下記のようになります。広告表示後は上記のコールバックを利用して完了かスキップを待ちましょう。
// 広告の準備完了を待つ処理 var readyWaitTime = (float)ReadyAdTimeOutDuration; while (!Advertising.IsRewardedAdReady()) { await UniTask.Yield(); token.ThrowIfCancellationRequested(); readyWaitTime -= Time.deltaTime; if (readyWaitTime <= 0.0f) { // タイムアウトしたら何もしない Debug.Log($"RewardAd Failed IsRewardedAdReady"); return false; } } Debug.Log($"RewardAd Completed IsRewardedAdReady"); // 広告表示処理 Advertising.ShowRewardedAd(); // TODO: ここで完了 or スキップを待つと良いかも (結果を true or false で返すと使いやすそう)
広告表示に関する注意点
Unity上でチェックするにはAndroidかiOSへswitch platformする
UIも含めて本来の広告とは完全に別物にはなりますが、広告表示のテストはUnityEditorでも可能です。しかしその場合 iOS か Android にswitch platform していないとできません。この点は注意が必要です。
実機ビルドができるかチェックする
Admobのプラグインを入れると(というかGoogle製のプラグインを入れると)かなりの確率でビルドエラーが発生します。エラーの原因は様々なので基本的にはエラーメッセージをひたすらググるしか最終的な対処法はありません。ですが最初にチェックする項目は、
- 余計なファイルが Pluginsフォルダに残っていないか
- UnityのバージョンとAdmobのバージョンの組み合わせ
あたりかと思います。余計なファイルのせいでビルドに失敗するのはあるあるです。Admobのパッケージを再度入れ直す場合、以前unitypackageで導入したファイルの全てを削除しましょう。またUnityとAdmobのバージョンが合わずにビルドに失敗するのもあるあるです。Admobの最新のパッケージ + Unityの最新のLTSバージョン であればうまく行く確率はかなり高まるのでエラーが出てしまった場合はこのあたりをチェックしましょう。
Easy Mobile Pro を利用するメリット
もちろんですが Easy Mobile Proを利用せずともAdmobの広告表示は可能です。自分の場合は広告以外にもSNS連携やローカルプッシュ通知、GDPR対応のサポート機能も利用したかったのでこのアセットを使わせていただきました。いずれそちらの機能の記事も各予定です。
よろしければ使ってみてください!