ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】Google Mobile Ads Unity Plugin を試す

今回は Google Mobile Ads SDK Unity プラグインを使った動画リワード広告を試してみました。

リワード広告とは

ユーザーが広告を操作・視聴するのと引き換えに、アプリ内で報酬を獲得できるものです。スマホのアプリでよくある、ここから先は動画広告を見たら遊べる的なやつです。

Google AdMob

まずは Google AdMob でAdMobアカウント、アプリ情報、広告ユニットの作成をします。すでにある方は読み飛ばしてOKです。  

AdMobアカウント作成
  1. こちらの Google AdMob にアクセス、アカウントが無ければ以下のような表示になります。

  2. 必要な情報を入力してAdSence 利用規約を確認してチェックを入れたら「ADMOBアカウントを作成」をクリック
    ちなみに私は以下の情報で作成
    国または地域:日本
    タイムゾーン:(UTC+09:00) 東京
    お支払い通貨:(JPY¥)

  3. 最後にPINコードの入力をします。
    電話番号の前に国番号(日本は+81)を付けるのを忘れないでください。

  4. 以下のような管理画面が表示されたら完了です。

アプリ情報を作成

アプリ固有のアプリIDを取得するためにアプリ情報を作成してAdMobに追加します。

  1. サイドバーの「アプリ」から「アプリを登録して利用を開始」をクリック

  2. アプリを公開済みなら「はい」を選択して自身のアプリを設定します。

  3. アプリ名の入力とプラットフォームの指定を行い「追加」をクリック

  4. アプリ情報が追加されアプリIDが発行されました。

広告ユニットを作成

アプリ用の広告ユニットを作成します。

  1. 対象アプリを選択して「アプリの概要」から「広告ユニットを追加」をクリック

  2. 広告フォーマットを選ぶ画面になるので、今回はリワード広告を選択します。

  3. 次に広告ユニット名、報酬の数、報酬アイテムを入力して「広告ユニットを作成」をクリック

  4. 広告ユニットが作成され、広告ユニットIDが発行されました。

Google Mobile Ads Unity Plugin
パッケージのインストール
  1. こちらGitHubから GoogleMobileAds-v[バージョン].unitypackage をダウンロードします。

  2. 適当なUnityプロジェクトを作成して Assets > Import Package > Custom Package からダウンロードした .unitypackage をインポートします。

  3. インポート中に Package Manager Resolver ウインドウが表示され、Game Package Registry by GoogleレジストリをPackage Managerに追加して良いかと聞かれるので 「Add Selected Registries」をクリックします。

  4. 次に Assets > Google Mobile Ads > Settings を選択
    f:id:aki517:20200906210940p:plain

  5. GoogleMobileAdsSettings.assetが生成されます。
    f:id:aki517:20211119061908p:plain

  6. Google AdMob の Enabled をチェック
    Google AdMobで作成したアプリIDを設定します。

  7. 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 に配置されます。

  8. 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 を選択

  9. これで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
XCodeView > 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にアップしておきました。

f:id:aki517:20200911082415g:plain

参考

スタートガイド  |  Unity  |  Google Developers
[Xcode]Mac OS Catalinaにアップデートしたらpodコマンドが通らなくなった