
マイケル
どうもみなさんこんばんは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜

マイケル
今日はUnityで作ったゲームに
広告を実装する方法について紹介していくよ!
広告を実装する方法について紹介していくよ!

エレキベア
広告は嫌いクマ〜〜〜〜

マイケル
そうはいっても広告を入れないと
アプリで収益を得られないからね・・・
アプリで収益を得られないからね・・・

エレキベア
避けられない壁ってやつクマか・・・

マイケル
それでも最低限、操作性に影響がでないようにしたり
間違って押させたりしないよう工夫するのが大事だと思っているよ!
間違って押させたりしないよう工夫するのが大事だと思っているよ!

マイケル
今日紹介するGoogle Admobという広告は実装もそこまで難しくなくて
カスタマイズもしやすいと思うので、いろいろ工夫してみてね!
カスタマイズもしやすいと思うので、いろいろ工夫してみてね!

エレキベア
心得たクマ
Unityで使用できる広告サービスについて

マイケル
実装できる広告は大きなところじゃなければ山ほどあるけど、
よく使われているのが「Google Admob」と「Unity Ads」だね!
よく使われているのが「Google Admob」と「Unity Ads」だね!

エレキベア
なんか名前は聞いたことあるクマ〜〜

マイケル
「Google Admob」は、Googleが提供している広告サービスで、
「Unity Ads」はUnity公式の広告サービスだよ!
「Unity Ads」はUnity公式の広告サービスだよ!

マイケル
「Unity Ads」はUnity公式だから実装が簡単だけど動画広告しかないんだ!
だからとりあえずは情報が多くて種類がある「Google Admob」をおすすめするよ!
だからとりあえずは情報が多くて種類がある「Google Admob」をおすすめするよ!

エレキベア
このブログもGoogleの広告サービスだったクマね

マイケル
そうだね!
このブログも「Google Adsense」という広告サービスを使用していて、
Admobはそのモバイル版というイメージだよ!
このブログも「Google Adsense」という広告サービスを使用していて、
Admobはそのモバイル版というイメージだよ!

エレキベア
なるほどクマ・・・

マイケル
それでは早速「Google Admob」を使用して実装していきます!
広告の種類について

マイケル
まず広告の種類について!
Google Admobで実装できる広告は、大きく下の4種類があるよ!
Google Admobで実装できる広告は、大きく下の4種類があるよ!

・バナー広告
-> 画面上部や下部にある小さめな広告
・インタースティシャル広告
-> ゲームクリア後などに挟む動画広告(スキップ可)
・リワード広告
-> 報酬等と引き換えにユーザ自身の判断で再生する広告(スキップ不可)
・ネイティブアドバンス広告
-> ゲームのコンテンツ内容に合わせてカスタマイズできる広告

エレキベア
どれもみたことがあるクマ〜〜〜!

マイケル
今回は実装が簡単なバナー広告と、
シーン遷移の間に挟むインタースティシャル広告の実装について紹介するよ!
シーン遷移の間に挟むインタースティシャル広告の実装について紹介するよ!

エレキベア
がんばるクマ〜〜〜!
広告IDの取得

マイケル
実装に入る前に、まずはGoogle Admobに自身のアプリを登録して
広告IDを作成する必要があります!
広告IDを作成する必要があります!

マイケル
下記公式サイトからアカウントを作成しましょう!


マイケル
アカウントを作成したら左側の「アプリ」メニューから
「アプリを追加」ボタンを押します!
「アプリを追加」ボタンを押します!


マイケル
すると下記の画面が出てくるので、自身のアプリケーション名を入力して、
プラットフォームを選択しましょう!
プラットフォームを選択しましょう!

マイケル
ちなみに異なるプラットフォームでゲームを出したい場合には
アプリIDをその数だけ作らなければならないので注意です。
アプリIDをその数だけ作らなければならないので注意です。


マイケル
アプリIDを入力したら次は広告の作成です!
冒頭で説明した広告4種類が選べますので、ここでは「バナー広告」を選択します!
冒頭で説明した広告4種類が選べますので、ここでは「バナー広告」を選択します!



マイケル
任意の広告ユニット名を入力して作成すると、
アプリIDとユニットID(広告ID)が表示されます!
アプリIDとユニットID(広告ID)が表示されます!


マイケル
こちらのIDは実装時に使用するので、メモをしておきましょう!

マイケル
バナー広告IDを取得できたら、同様の手順で
iOS インタースティシャル広告
Android バナー広告
Android インタースティシャル広告
も作成しておきましょう!
iOS インタースティシャル広告
Android バナー広告
Android インタースティシャル広告
も作成しておきましょう!

エレキベア
できたクマ〜〜〜〜

マイケル
これで準備完了だね!
Google Mobile Ads Unityプラグインのインポート

マイケル
続いてUnity側でAdmobを実装するためのパッケージをインポートします!

マイケル
下記、Googleのスタードガイドで提供されているパッケージ、
GoogleMobileAds-v5.2.0.unitypackage
をダウンロードしましょう!
GoogleMobileAds-v5.2.0.unitypackage
をダウンロードしましょう!

マイケル
ダウンロードが完了したら
Assets -> Import Package
より、パッケージの内容を全てインポートします!
Assets -> Import Package
より、パッケージの内容を全てインポートします!


エレキベア
インポートまで完了したクマ〜!
いよいよ実装クマか?
いよいよ実装クマか?

マイケル
実装まではあともう一歩!
Assets -> Google Mobile Ads -> Setting
より開いた画面で、先ほど入手したアプリIDを入力しましょう!
Assets -> Google Mobile Ads -> Setting
より開いた画面で、先ほど入手したアプリIDを入力しましょう!


マイケル
そしてAndroidで広告を出したい場合、
iOSで広告を出したい場合でそれぞれ下記の設定を行います!
iOSで広告を出したい場合でそれぞれ下記の設定を行います!
Androidの場合:Assets -> External Dependency Manager -> Android Resolver -> Resolve をクリック

iOSの場合:Assets -> iOSResolver -> Setting より、下記項目を選択


マイケル
ここまでくればあとは実装していくだけです!

エレキベア
長かったクマ〜〜〜〜〜
バナー広告の実装

マイケル
それではまずは一番簡単なバナー広告を実装していきます!

マイケル
基本的には上記、Google Admobのサイトで書かれている
手順で実装していけば大丈夫です!
手順で実装していけば大丈夫です!

マイケル
「シーンでずっと表示し続けて、シーン遷移の際に破棄する」場合には、
下記のようなスクリプトを作成して、空のGameObjectに貼り付けます!
下記のようなスクリプトを作成して、空のGameObjectに貼り付けます!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
public class GoogleAdmobBanner : MonoBehaviour
{
BannerView bannerView;
void Start()
{
// ★リリース時に自分のIDに変更する
#if UNITY_ANDROID
string appId = "ca-app-pub-3940256099942544~3347511713";
#elif UNITY_IPHONE
string appId = "ca-app-pub-3940256099942544~1458002511";
#else
string appId = "unexpected_platform";
#endif
// Initialize the Google Mobile Ads SDK.
MobileAds.Initialize(appId);
RequestBanner();
}
private void RequestBanner()
{
// ★リリース時に自分のIDに変更する
#if UNITY_ANDROID
string adUnitId = "ca-app-pub-3940256099942544/6300978111";
#elif UNITY_IPHONE
string adUnitId = "ca-app-pub-3940256099942544/2934735716";
#else
string adUnitId = "unexpected_platform";
#endif
// Create a 320x50 banner at the top of the screen.
bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the banner with the request.
bannerView.LoadAd(request);
}
private void OnDestroy()
{
bannerView.Destroy();
}
}

マイケル
ちなみにここで書かれているIDはテスト用のものなので、
リリースする際には準備段階で取得した自身のアプリID・広告IDに書き換えましょう!
リリースする際には準備段階で取得した自身のアプリID・広告IDに書き換えましょう!

マイケル
「bannerView.Destroy()」を忘れると
ずっと表示されたままになってしまうのも注意してください
ずっと表示されたままになってしまうのも注意してください

エレキベア
これだけで表示されるクマ???

マイケル
これだけでOKだよ!
広告表示を確認するにはビルドして動かさないといけないから、
ビルドして実機で確認してみます!
広告表示を確認するにはビルドして動かさないといけないから、
ビルドして実機で確認してみます!


マイケル
上の図のように表示されれば成功です!

エレキベア
できたクマ〜〜〜!!
インタースティシャル広告の実装

マイケル
そしてもう一つ、インタースティシャル広告も実装してみましょう!

マイケル
こちらもGoogle Admobのサイトで書かれている
手順通りで大丈夫ですが、バナー広告よりも少し難易度が上がります。
手順通りで大丈夫ですが、バナー広告よりも少し難易度が上がります。

マイケル
シーンとシーンの間に広告シーンを挟み込みたい場合には、
バナー広告と同様、下記のようにスクリプトを作成してゲームオブジェクトに貼り付ければOKです!
バナー広告と同様、下記のようにスクリプトを作成してゲームオブジェクトに貼り付ければOKです!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using GoogleMobileAds.Api;
using System;
using UniRx;
public class GoogleAdmobInterstitial : MonoBehaviour
{
/** 変数 */
private InterstitialAd interstitial;
private bool showing;
public string loadEventParam; // 読込イベント名(遷移元で渡されるゴロ)
void Start()
{
showing = false;
// 広告読み込み
RequestInterstitial();
}
void Update()
{
// 広告表示
if (interstitial.IsLoaded() && !showing)
{
interstitial.Show();
showing = true;
}
}
// 広告読み込み処理
private void RequestInterstitial()
{
// ★リリース時に自分のIDに変更する
#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.
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.
interstitial.LoadAd(request);
}
// シーン遷移処理
private void LoadNextScene()
{
SceneManager.LoadScene(【遷移先シーン名】);
}
private void OnDestroy()
{
// オブジェクトの破棄
interstitial.Destroy();
}
// ---以下、イベントハンドラー
// 広告の読み込み完了時
public void HandleOnAdLoaded(object sender, EventArgs args)
{
}
// 広告の読み込み失敗時
public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
// 次のシーンに遷移
LoadNextScene();
}
// 広告がデバイスの画面いっぱいに表示されたとき
public void HandleOnAdOpened(object sender, EventArgs args)
{
}
// 広告を閉じたとき
public void HandleOnAdClosed(object sender, EventArgs args)
{
// 次のシーンに遷移
LoadNextScene();
}
// 別のアプリ(Google Play ストアなど)を起動した時
public void HandleOnAdLeavingApplication(object sender, EventArgs args)
{
}
}

マイケル
基本的にはバナー広告と実装方法は同じなのですが、
インタースティシャル広告は全画面に表示される動画のため、
広告が始まった時や広告が閉じられた時の処理を記述しなければなりません。
インタースティシャル広告は全画面に表示される動画のため、
広告が始まった時や広告が閉じられた時の処理を記述しなければなりません。

マイケル
そのため、用意されている下記のイベントハンドラーを
オーバーライドして使用することで、各イベントの処理を実現します!
オーバーライドして使用することで、各イベントの処理を実現します!
・・・略・・・
public class GoogleAdmobInterstitial : MonoBehaviour
{
・・・略・・・
// 広告読み込み処理
private void RequestInterstitial()
{
・・・略・・・
// 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;
・・・略・・・
}
・・・略・・・
// ---以下、イベントハンドラー
// 広告の読み込み完了時
public void HandleOnAdLoaded(object sender, EventArgs args)
{
}
// 広告の読み込み失敗時
public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
// 次のシーンに遷移
LoadNextScene();
}
// 広告がデバイスの画面いっぱいに表示されたとき
public void HandleOnAdOpened(object sender, EventArgs args)
{
}
// 広告を閉じたとき
public void HandleOnAdClosed(object sender, EventArgs args)
{
// 次のシーンに遷移
LoadNextScene();
}
// 別のアプリ(Google Play ストアなど)を起動した時
public void HandleOnAdLeavingApplication(object sender, EventArgs args)
{
}
}

マイケル
これでインタースティシャル広告の実装は完了です!
あとはこの広告シーンを一定確率に一回だけ遷移する、
などという処理にすると広告の表示率も調整できそうですね!
あとはこの広告シーンを一定確率に一回だけ遷移する、
などという処理にすると広告の表示率も調整できそうですね!


マイケル
バナー広告と同様、ビルド・実行して、上の図のような広告が表示されたら成功です!

エレキベア
なんとかできたクマ〜〜〜〜

マイケル
おめでとう!
こちらもテスト用の広告IDなので、
リリース時には自分のIDに書き換えてくださいね!
こちらもテスト用の広告IDなので、
リリース時には自分のIDに書き換えてくださいね!
おわりに

マイケル
というわけで今回は広告の実装でした!
どうだったでしょうか!
どうだったでしょうか!

エレキベア
なんとなく使い方は分かった気がするクマ〜〜〜

マイケル
それならよかった!
アプリへの広告実装は面倒くさそうに見えるけど、
意外と簡単にできるから是非やってみてね!
アプリへの広告実装は面倒くさそうに見えるけど、
意外と簡単にできるから是非やってみてね!

エレキベア
おもったより楽勝だったクマ

マイケル
それでは今日はこの辺で!
アデュー!
アデュー!

エレキベア
クマ〜〜〜〜
【Unity】自作ゲームにAdmob広告を実装する(バナー広告・インタースティシャル広告) 〜完〜
コメント
2,3週間悩んでたのが、やっと解決できました~!!!
ほんとにありがとうございます。
詰まると中々抜け出せないですよね…(T_T)
お役に立ててうれしいです!!
こんばんは、マイケルさん
いつもお世話になっています。
bannerView.Destroy();をしないとメモリリークしてしまうとのことですが、
これは別のスクリプト(例えば、シーン遷移を担当するスクリプト)でOnDestroy()を呼び出して破壊するという認識でしょうか?しかし、そうだとするとpublicではなくprivateであることがわかりません…。
もしくはOnDestroyは記述しているだけで良いスクリプトなのでしょうか?
またもう一つ質問があります、もしかするとバージョン違いでわからないかもしれませんが、
GoogleAdmobBanner.csの37行目などに記述している
bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
という書き方をすると
You are trying to create a MonoBehaviour using the ‘new’ keyword. This is not allowed.
という警告文が出てきてしまいます。上の警告+admobだったり+広告などで検索をかけても皆さんそういうエラーが出ないのか解決に至りません。マイケルさんも出なかったでしょうか…?もしかして無視して良かったり…?
GoogleMobileAds-v5.4.0 でもv6.0.0以降でも出てしまいます…。v5.2.0ではわかりませんが…。
再度質問よろしいでしょうか…。
バナー広告を特定シーンのみではなく、全シーンに導入しようと考えています。その場合、
①シーンごとにrequest()とDestroy()をして再度別のシーンでも同様のことをするべきなのか
②初めのシーンでrequest()して消さない場合はdestroyしなければいいのでしょうか?
ちなみに私は今①番の方法を取っていますがシーンが切り替わるたびに一回バナー広告が消えます。これが良い方法なのか規約に違反するような悪い方法なのかはわかりませんが、他の開発者様のアプリではあまり見かけないように思います。
しかし②番ではメモリリークしてしまうのか…。どうにもわかりません。よろしければマイケルさんの考えを聞かせていただけると幸いです。
追記失礼します。
どうやらはじめのシーンで作ってDontDestoryOnLoad(this);で全シーンに表示させれば良いということがわかったのですが、その場合もOnDestroy()は記述する必要があるのですか?
マイケル様のスクリプトではバナー広告の場合もインタースティシャル広告の場合もOnDestroy()は記述してあるもののどこにも使用されていないと思います。かといって他から使用しているのかなと思っても(例えばシーン遷移を管理しているスクリプト)、publicではなくprivateなのでどういう使い方をしているのかわかりません…。
よろしければ教えていただけると幸いです。
コメントありがとうございます!
(いつも見ていただいてありがとうございます!)
既に解決済みであれば申し訳ないですが、下記に回答を載せておきます!
よければ参考にしてくださいm(_ _)m
・OnDestroyの処理について
Unityスクリプトのライフサイクルは下記のようになっていて、
オブジェクトが破棄される直前のフレームのアップデート後に OnDestroy が呼び出される仕様になっています。
そのため自身で呼び出さなくても破棄される時に OnDestroy が実行されます。
https://docs.unity3d.com/ja/2018.4/Manual/ExecutionOrder.html
・バナー広告の警告について
自分の時に出ていたかどうか覚えていないですね・・・。
(出てても無視していたかもしれません・・・)
調べたら同じ質問している方がいたのでリンクを貼っておきます。
newじゃなくGameObject.Findで取得すればエラー回避できるようです。
https://teratail.com/questions/318038
・バナー広告の全シーン導入について
いろは坂さんが調べた通り「DontDestoryOnLoad(this);」という方法で全シーン共通で使用することができます。
(ちなみにこれはシングルトンパターンと呼ばれます。)
その場合「OnDestroy」はゲーム中で呼ばれることはありませんが、
ゲーム終了時にも呼び出されると思うので、記述はしておいた方が良いかと思います。
お返事ありがとうございます!毎回私の情報検索能力が低くてご厚意に甘えてしまいお手数おかけしています…。
OnDestroy()とバナー広告の情報ありがとうございます!!
バナー広告の広告ですが、そのteratailの記事を見かけたのですが、逆に日本語記事をその程度しか見つけられず、え!?みんなそういうエラー起きなかったの!?もっとまとめている人いても良くない!?もしかしてみんな別の手順踏んでたりするのかな…と疑心暗鬼になりすぎてしまったので質問させていただきました。
とりあえず四の五の言わずにとりあえず実装してみます。
今回もどうもありがとうございました!