AdMob アプリ起動時広告を Unity アプリに追加する

1. 概要

この Codelab では、AdMob アプリ起動時広告を Unity アプリに実装します。

作成する内容

この Codelab では、Google Mobile Ads Unity プラグインを使って Unity アプリに AdMob アプリ起動時広告を実装する方法について説明します。

6338548c3f73e7cf.gif

この Codelab で何か問題(コードのバグ、文法的な誤り、不明確な表現など)が見つかりましたら、Codelab の左下にある [誤りを報告] リンクから報告してください。

学習する内容

  • Google Mobile Ads Unity プラグインを設定する方法
  • Unity アプリにアプリ起動時広告を実装する方法

必要なもの

  • Unity 2018.4 以降
  • Xcode 12 以降と CocoaPods(iOS にデプロイする場合)

ご自身の AdMob 使用経験をどのように評価されますか。

初心者 中級者 上級者

2. 開発環境を設定する

コードをダウンロードする

zip ファイルをダウンロードしたら、そのコンテンツを展開すると、admob-appopen-unity-main という名前のフォルダが作成されます。

または、以下のように、コマンドラインから GitHub リポジトリのクローンを作成することもできます。

$ git clone https://github.com/googlecodelabs/admob-appopen-unity

リポジトリには以下の 2 つのフォルダが含まれています。

  • android_studio_folder.png starter: この Codelab で作成する開始コード。
  • android_studio_folder.png complete: この Codelab の最終的なコード。

3. AdMob アプリと広告ユニットを設定する

Unity はマルチプラットフォーム SDK であるため、Android と iOS 両方のアプリと広告ユニットを AdMob に追加する必要があります。

Android 用の設定

Android 用の設定を行うには、Android アプリを追加して広告ユニットを作成します。

Android アプリを追加する

  1. AdMob コンソールで、[アプリ] メニューから [アプリを追加] をクリックします。
  2. プラットフォームとして [Android] を選択します。「アプリはサポートされているアプリストアに登録されていますか?」というメッセージが表示されたら、[いいえ] をクリックします。
  3. アプリ名の欄に「AdMob app open ad」と入力します。
  4. この Codelab の手順を完了するうえで、ユーザーに関する指標を有効にする必要はありませんが、ユーザー行動をより詳しく把握できるため、有効にすることをおすすめします。[追加] をクリックして手順を完了します。

広告ユニットを作成する

  1. AdMob コンソールの [アプリ] メニューから [AdMob アプリ起動時広告] アプリ(Android)を選択します。
  2. [広告ユニット] メニューをクリックします。

  1. [広告ユニットを追加] をクリックします。
  2. フォーマットとして [アプリ起動] を選択します。
  3. [広告ユニット名] 欄に「android-appopen」と入力します。
  4. [広告ユニットの作成] をクリックして手順を完了します。

通常、新しい広告ユニットで広告を配信できるようになるまでには数時間かかります。

広告の動作をすぐにテストする場合は、Android アプリ ID / 広告ユニット ID と iOS アプリ ID / 広告ユニット ID の表に記載されているテストアプリ ID とテスト広告ユニット ID を使用してください。

iOS 用の設定

iOS 用の設定を行うには、iOS アプリを追加して広告ユニットを作成します。

iOS アプリを追加する

  1. AdMob コンソールで、[アプリ] メニューから [アプリを追加] をクリックします。
  2. プラットフォームとして [iOS] を選択します。「アプリはサポートされているアプリストアに登録されていますか?」というメッセージが表示されたら、[いいえ] をクリックします。
  3. アプリ名の欄に「AdMob app open ad」と入力します。
  4. この Codelab の手順を完了するうえで、ユーザーに関する指標を有効にする必要はありませんが、ユーザー行動をより詳しく把握できるため、有効にすることをおすすめします。[追加] をクリックして手順を完了します。

広告ユニットを作成する

  1. AdMob コンソールの [アプリ] メニューから [AdMob インライン広告] アプリ(iOS)を選択します。
  2. [広告ユニット] メニューをクリックします。

  1. [広告ユニットを追加] をクリックします。
  2. フォーマットとして [アプリ起動] を選択します。
  3. [広告ユニット名] 欄に「ios-appopen」と入力します。
  4. [広告ユニットの作成] をクリックして手順を完了します。

通常、新しい広告ユニットで広告を配信できるようになるまでには数時間かかります。

広告の動作をすぐにテストする場合は、次の表に記載されているテストアプリ ID とテスト広告ユニット ID を使用してください。

省略可: AdMob のテストアプリとテスト広告ユニットを使用する

新しいアプリや広告ユニットを独自に作成せずにこの Codelab の手順を行う場合は、次の表に記載されているテスト用の AdMob アプリ ID と広告ユニット ID を使用できます。

Android アプリ ID / 広告ユニット ID

項目

アプリ ID / 広告ユニット ID

AdMob アプリ ID

ca-app-pub-3940256099942544~3347511713

広告ユニット ID

ca-app-pub-3940256099942544/3419835294

iOS アプリ ID / 広告ユニット ID

項目

アプリ ID / 広告ユニット ID

AdMob アプリ ID

ca-app-pub-3940256099942544~1458002511

広告ユニット ID

ca-app-pub-3940256099942544/5662855259

テスト広告について詳しくは、Android テスト広告iOS テスト広告に関するデベロッパー向けドキュメントをご覧ください。

4. Google Mobile Ads Unity プラグインを追加する

AdMob 広告を表示して収益を得るための第一歩は、Google Mobile Ads Unity プラグインの追加です。

Mobile Ads Unity プラグインをダウンロードする

Google Mobile Ads Unity プラグインを使うと、Unity デベロッパーは Android アプリや iOS アプリで Google モバイル広告を簡単に配信できます。このプラグインにより、Unity プロジェクトの C# スクリプトで使用される、広告をリクエストするための C# インターフェースが利用可能になります。

下記のリンクから、プラグインの Unity パッケージをダウンロードしてください。

starter プロジェクトを開く

  1. Unity Hub を起動します。
  2. [Projects](プロジェクト)タブで、[ADD](追加)ボタンをクリックします。
  3. 「開発環境を設定する」の手順で、ダウンロードしたコードを抽出したフォルダに移動します。
  4. starter フォルダを開きます。
  5. プロジェクト リストに starter プロジェクトが表示されます。プロジェクトをクリックして Unity Editor で開きます。

Mobile Ads Unity プラグインをインポートする

  1. Unity Editor で、メニューから [Assets](アセット)> [Import Package](インポート パッケージ)> [Custom Package](カスタム パッケージ)を選択します。
  2. 前の手順でダウンロードした GoogleMobileAds-{VERSION}.unitypackage を選択します。
  3. すべてのファイルのチェックボックスがオンになっていることを確認して、[Import](インポート)をクリックします。

AdMob アプリ ID を設定する

  1. Unity Editor で、メニューから [Assets](アセット)> [Google Mobile Ads](Google モバイル広告)> [Settings](設定)を選択します。
  2. 各フィールドに Android と iOS の AdMob アプリ ID を入力します。新しいアプリや広告ユニットを独自に作成せずにこの Codelab の手順を行う場合は、テスト用の AdMob アプリ ID を次のように入力します。

8890521e199b1090.png

5. ユーティリティ クラスを作成する

Scripts フォルダ内に AppOpenAdManager という名前の新しいクラスを作成します。このクラスにより、読み込まれた広告と、各プラットフォームの広告ユニット ID をトラッキングするためのインスタンス変数が管理されます。

AppOpenAdManager.cs

using System;
using GoogleMobileAds.Api;
using UnityEngine;

public class AppOpenAdManager
{
#if UNITY_ANDROID
    // Test ad unit ID: ca-app-pub-3940256099942544/3419835294
    private const string AD_UNIT_ID = "<YOUR_ANDROID_APPOPEN_AD_UNIT_ID>";
#elif UNITY_IOS
    // Test ad unit ID: ca-app-pub-3940256099942544/5662855259
    private const string AD_UNIT_ID = "<YOUR_IOS_APPOPEN_AD_UNIT_ID>";
#else
    private const string AD_UNIT_ID = "unexpected_platform";
#endif

    private static AppOpenAdManager instance;

    private AppOpenAd ad;

    private bool isShowingAd = false;

    public static AppOpenAdManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new AppOpenAdManager();
            }

            return instance;
        }
    }

    private bool IsAdAvailable
    {
        get
        {
            return ad != null;
        }
    }

    public void LoadAd()
    {
        // TODO: Load an app open ad.
    }
}

広告を読み込む

広告の読み込みは、静的 AppOpenAd.LoadAd() メソッドを使って行います。読み込みメソッドには、広告ユニット ID、ScreenOrientation モード、AdRequest オブジェクトのほか、広告の読み込みの成功時または失敗時に呼び出される完了ハンドラが必要です。

読み込まれた AppOpenAd オブジェクトは、完了ハンドラのパラメータとして提供されます。LoadAd() メソッドを次のように実装します。

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    public void LoadAd()
    {
        AdRequest request = new AdRequest.Builder().Build();

        // Load an app open ad for portrait orientation
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                // Handle the error.
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            // App open ad is loaded.
            ad = appOpenAd;
        }));
    }
}

広告を表示する

広告を表示する前に、イベント ハンドラごとに登録して各広告イベントをリッスンします。

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    public void ShowAdIfAvailable()
    {
        if (!IsAdAvailable || isShowingAd)
        {
            return;
        }

        ad.OnAdDidDismissFullScreenContent += HandleAdDidDismissFullScreenContent;
        ad.OnAdFailedToPresentFullScreenContent += HandleAdFailedToPresentFullScreenContent;
        ad.OnAdDidPresentFullScreenContent += HandleAdDidPresentFullScreenContent;
        ad.OnAdDidRecordImpression += HandleAdDidRecordImpression;
        ad.OnPaidEvent += HandlePaidEvent;

        ad.Show();
    }

    private void HandleAdDidDismissFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Closed app open ad");
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        isShowingAd = false;
        LoadAd();
    }

    private void HandleAdFailedToPresentFullScreenContent(object sender, AdErrorEventArgs args)
    {
        Debug.LogFormat("Failed to present the ad (reason: {0})", args.AdError.GetMessage());
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        LoadAd();
    }

    private void HandleAdDidPresentFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Displayed app open ad");
        isShowingAd = true;
    }

    private void HandleAdDidRecordImpression(object sender, EventArgs args)
    {
        Debug.Log("Recorded ad impression");
    }

    private void HandlePaidEvent(object sender, AdValueEventArgs args)
    {
        Debug.LogFormat("Received paid event. (currency: {0}, value: {1}",
                args.AdValue.CurrencyCode, args.AdValue.Value);
    }
}

広告の有効期限に関する考察

アプリ起動時の広告参照は 4 時間後にタイムアウトします。リクエスト時から 4 時間後以降にレンダリングされた広告は有効ではなくなり、収益化できなくなります。

期限切れの広告を表示しないようにするには、IsAdAvailable プロパティを AppOpenAdManager に変更して、広告の読み込みからの経過時間と、広告の有効性を確認できるようにします。

AppOpenAdManager.cs

public class AppOpenAdManager
{
    ...

    // TODO: Add loadTime field
    private DateTime loadTime;

    private bool IsAdAvailable
    {
        get
        {
            // TODO: Consider ad expiration
            return ad != null && (System.DateTime.UtcNow - loadTime).TotalHours < 4;
        }
    }

    public void LoadAd()
    {
        if (IsAdAvailable)
        {
            return;
        }

        AdRequest request = new AdRequest.Builder().Build();
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            ad = appOpenAd;
            Debug.Log("App open ad loaded");

            // TODO: Keep track of time when the ad is loaded.
            loadTime = DateTime.UtcNow;
        }));
    }
}

6. シーンを更新して、広告を読み込む / 表示する

シーンの開始時にアプリ起動時広告を読み込むように、MainScene クラスの Start() メソッドを更新します。

アプリのフォアグラウンド イベントについて通知を受け取るには、AppStateEventNotifier シングルトンをリッスンすることが推奨されます。AppStateEventNotifier.AppStateChanged デリゲートを実装することにより、アプリ起動イベントとフォアグラウンド イベントに対して通知が行われ、広告を表示できるようになります。

MainScene.cs

using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using UnityEngine;

public class MainScene : MonoBehaviour
{
    public void Start()
    {
        // TODO: Request an app open ad.
        MobileAds.Initialize((initStatus) =>
        {
            AppOpenAdManager.Instance.LoadAd();
            AppStateEventNotifier.AppStateChanged += OnAppStateChanged;
        });
    }

    public void OnAppStateChanged(AppState state)
    {
        if (state == AppState.Foreground)
        {
            // TODO: Show an app open ad if available.
            AppOpenAdManager.Instance.ShowAdIfAvailable();
        }
    }
}

最後に、プロジェクトをビルドし、デバイスまたはエミュレータで実行します。アプリが起動したら、広告が完全に読み込まれるまで数秒お待ちください。

その後、他のアプリやホーム画面からアプリに戻ると、アプリ起動時広告が次のように表示されます。

6338548c3f73e7cf.gif

7. これで完了です。

この Codelab は終了です。この Codelab の最終的なコードは、android_studio_folder.pngcomplete フォルダで確認できます。