UnityでAdMobのバナーと動画リワードの同時実装

バナーと動画リワード同時実装
スポンサーリンク

UnityにAdMobを使いバナー広告と動画リワードを同時に実装するサンプルコードをまとめます。(自身の備忘録も兼ねて)

この記事のPOINT

・UnityでAdMobを実装する方法についてまとめます
・バナーと動画リワードの同時実装を行いたい人におすすめです
・バナーの表示非表示の切り替えも行います

環境
・Unity:2019.3.5f1

サンプルプロジェクトを作る

まずはUnityでサンプルプロジェクトを作ります。今回は2Dのプロジェクトでサンプルを作ってみます。Unity Hub などからバージョン「2019.3.5f1」を選びプロジェクト名を何かつけ「作成」を行ってください。

※「2019.4.0f1」はエラー(2020/6月現在)で広告が読み込めなかったので、今回は「2019.3.5f1」を選んでいます。

プロジェクト作成

サンプルプロジェクトを作成したら、「Mobile Ads Unity プラグイン」をダウンロードしましょう。以下の公式サイトのスタートガイドから、ダウンロードページに飛べます。

スタートガイド  |  Unity  |  Google Developers
Unity でアプリを開発している AdMob パブリッシャー向けのモバイル広告用 SDK です。
ダウンロード場所

今回は「v5.0.1」を使うのがおすすめです。ダウンロードのページに入ったら「Tags」に切り替えてバージョン「v5.0.1」を選びます。(今回のサンプルは「v5.0.1」で動作確認を行っています。その他のバージョンでの動作は安定しない可能性があります)

ページを開いたらUnityパッケージを選んでダウンロードを行ってください。

ダウンロード項目

ダウンロード完了後は、一度Unityの設定を行います。

設定

「Build Settings」を開き、iOSなどを選び「Switch Platform」(開いたウィンドウの右下の方にあるボタン)を押してください。プラットフォームの変更が終わったら、そのまま「Prayer Settings」(開いたウィンドウの左下にあるボタン)を開きましょう。

各項目

「Prayer Settings」を押すと上の画像のようになると思います。右側の赤枠部分の項目を設定しましょう。Company Nameは適当で大丈夫ですが、デフォルトの状態からは変えておいた方が良いです。

項目名

次は「Prayer Settings」ウィンドウの「Quality」項目を開きます。そこにある「VSync Count」を「Don’t Sync」にしておきます。これはフレームレートをコード上から操作するために必要な設定です。

ここまで完了したら、次の手順に移ります。

Unityパッケージのインストール

パッケージをインストールします。「Import Package」から、先ほどダウンロードしたパッケージを選びましょう。

インストール

インストールが完了したら、次はAndroid側の設定を行います。

「Build Settings」を選び、プラットフォームでAndroidを選んで「Switch Platform」を選んでください。

Android設定

「Switch Platform」が完了したら、以下の項目から「Resolve」を行います。途中でバージョンを上げるか等の質問が出た場合は、それも同時に行ってください。

Resolveの場所

以下の画像のようなダイアログが出たら、完了です。

完了ダイアログ

完了後はテスト用端末IDを設定します。以下の項目を開いてください。

テストID設定場所

項目を開いたら、それぞれ番号を入れます。

Android:「ca-app-pub-3940256099942544~3347511713」
iOS:「ca-app-pub-3940256099942544~1458002511」
※このIDはテスト用に設定されたIDです。本番環境では実際にAdMob契約後の番号に変更してください。

サンプルID設定後

これでパッケージのインストール手順は完了です。次にシーンにサンプルコードを設定していきます。

サンプルコードを設定

まずはassetフォルダにスクリプトをいれるためのフォルダを作ってください。フォルダは右クリックのメニューの「create」から作れます。

スクリプトフォルダ

フォルダができたら、そのスクリプト用フォルダの中に「C#」のスクリプトを作ります。同じく「create」から作ってください。作るのは2個のスクリプトで名前はそれぞれ「FPSCounter」「AdsMNG」としておいてください。

できたらソースコードをエディターで開き以下のコードに書き換えてください。それぞれが逆にならないように注意して貼り付けましょう。

■FPSCounter

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Profiling;

public class FPSCounter : MonoBehaviour
{
    [SerializeField]
    private float m_updateInterval = 0.1f;

    private float m_accum;
    private int m_frames;
    private float m_timeleft;
    private float m_fps;

    private float m = 0;

    private void Start()
    {
        Application.targetFrameRate = 30;
    }

    private void Update()
    {
        m_timeleft -= Time.deltaTime;
        m_accum += Time.timeScale / Time.deltaTime;
        m_frames++;

        if (0 < m_timeleft) return;

        m_fps = m_accum / m_frames;
        m_timeleft = m_updateInterval;
        m_accum = 0;
        m_frames = 0;


        m = (System.GC.GetTotalMemory(false) + Profiler.usedHeapSizeLong) / 1024f;
    }

    private void OnGUI()
    {
        GUILayout.Label("FPS: " + m_fps.ToString("f2") + "\n" + "MEMORY:" + m / 1024f);
    }
}


■AdsMNG

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using GoogleMobileAds.Api;

public class AdsMNG : MonoBehaviour
{
    private RewardedAd rewardedAd;
    private BannerView bannerView;

    // -------広告系
    // 広告IDの切替
    private int DEVE_NOW = 0;       // 開発中は0 リリース時に1に変更
    // リワード取得可能状態フラグ
    private bool reward_flg = false;
    // ムービー読み込み管理フラグ
    private bool MV_flg = true;

//-------------------------------------------------//

    private void Start()
    {
        // 初期化 Google Mobile Ads SDK.
        MobileAds.Initialize(initStatus => { });
        // バナーリクエスト
        this.RequestBanner();
    }

    private void Update()
    {

    }

    // バナーの初期化
    private void RequestBanner()
    {
        // 広告IDの設定 開発中は仮IDを使用
        string banner_adUnitId = "";

        // 開発中の広告ID
        if (DEVE_NOW == 0)
        {
#if UNITY_ANDROID
        banner_adUnitId = "ca-app-pub-3940256099942544/6300978111";
#elif UNITY_IOS
        banner_adUnitId = "ca-app-pub-3940256099942544/2934735716";
#else
        banner_adUnitId = "unexpected_platform";
#endif
        }
        // リリース時ID
        else
        {
#if UNITY_ANDROID
        banner_adUnitId = "";
#elif UNITY_IOS
        banner_adUnitId = "";
#else
        banner_adUnitId = "unexpected_platform";
#endif
        }

        if (bannerView != null)
        {
            bannerView.Destroy();
        }

        // Create a 320x50 banner at the top of the screen.
        this.bannerView = new BannerView(banner_adUnitId, AdSize.Banner, AdPosition.Top);

        // ロード成功時の追加処理
        this.bannerView.OnAdLoaded += this.HandleOnAdLoaded;

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();

        // Load the banner with the request.
        this.bannerView.LoadAd(request);
    }

    // バナーロード成功時の追加処理
    public void HandleOnAdLoaded(object sender, EventArgs args)
    {
        bannerView.Hide();
    }

    // バナー表示処理
    public void ShowBN()
    {
        bannerView.Show();
    }

    // バナーの非表示処理
    public void HideBN()
    {
        bannerView.Hide();
    }

    // 動画の初期化
    public void AdsMngInitialize_Org()
    {
        // 広告IDの設定 開発中は仮IDを使用
        string adUnitId = "";

        // 開発中の広告ID
        if (DEVE_NOW == 0)
        {
#if UNITY_ANDROID
            adUnitId = "ca-app-pub-3940256099942544/5224354917";
#elif UNITY_IOS
            adUnitId = "ca-app-pub-3940256099942544/1712485313";
#endif
        }
        // リリース時の広告ID
        else
        {
#if UNITY_ANDROID
            adUnitId = "";
#elif UNITY_IOS
            adUnitId = "";
#endif
        }

        this.rewardedAd = new RewardedAd(adUnitId);
        
        // 広告リクエストが正常に読み込まれたときに呼び出されます
        this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        // 広告要求が読み込めなかったときに呼び出されます
        this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
        // 広告が表示されたときに呼び出されます
        this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
        // 広告要求が表示されなかったときに呼び出されます
        this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
        // 広告が閉じたときに呼び出されます
        this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;
        // ユーザーが広告とやり取りしたことに対して報酬が与えられるべきときに呼び出されます
        this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;

        AdRequest request = new AdRequest.Builder().Build();
        this.rewardedAd.LoadAd(request);
        Debug.Log("Load開始");
    }

    // 動画の再生
    public void ShowMV()
    {
#if UNITY_EDITOR
        HandleUserEarnedReward(null, null);
        HandleRewardedAdClosed(null, null);
#endif
        // ムービー再生
        if (rewardedAd != null && rewardedAd.IsLoaded())
        {
            rewardedAd.Show();
        }
        else
        {
            if (MV_flg)
            {
                // ムービーの在庫切れの時にロード開始
                AdsMngInitialize_Org();
                MV_flg = false;
            }
        }
    }

    // 広告リクエストが正常に読み込まれたときに呼び出されます
    public void HandleRewardedAdLoaded(object sender, System.EventArgs args)
    {
        Debug.Log("Load成功");
        MV_flg = true;
        rewardedAd.Show();
    }

    // 広告要求が読み込めなかったときに呼び出されます
    public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
    {
        Debug.Log("Load失敗");
        MV_flg = true;
    }

    // 広告が表示されたときに呼び出されます
    public void HandleRewardedAdOpening(object sender, System.EventArgs args)
    {
        Debug.Log("広告開始");
    }

    // 広告要求が表示されなかったときに呼び出されます
    public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
    {
        Debug.Log("広告失敗");
        MV_flg = true;
    }

    // 広告が閉じたときに呼び出されます
    public void HandleRewardedAdClosed(object sender, System.EventArgs args)
    {
        Debug.Log("広告終了");

        if (reward_flg)
        {
            Reward_Exe();
            reward_flg = false;
        }
    }

    // ユーザーが広告とやり取りしたことに対して報酬が与えられるべきときに呼び出されます
    public void HandleUserEarnedReward(object sender, Reward args)
    {
        reward_flg = true;
    }

    // リワードの取得
    private void Reward_Exe()
    {

    }

}

それぞれを貼り付けたら、必ず保存を行い上書きを完了させてください。

シーン上に設置

コードのコピーが完了したらシーンにオブジェクトを配置します。今回は空のオブジェクトを2個と、ボタンを3個使うのでそれぞれ設置してください。

空のオブジェクトは「Create Empty」で作れます。ボタンは「UI」の項目の中にあります。

Create Emptyの場所

設定後はHierarchyが以下のようになっていると思います。

Hierarchy

このうち「GameObject」「GameObject(1)」にそれぞれ先ほどのスクリプトを設定します。どちらがどちらでも大丈夫です。

設定方法はスクリプトファイルをドラッグ&ドロップでHierarchyの「GameObject」に持っていきます。

また、GameObjectの名前は自由に設定できるので、変更しても問題はありません。こちらのサンプルシーンではわかりやすいように「FPS」「Ads」と名前を変えています。

オブジェクトにスクリプト設定ができていると、オブジェクトを選択した際のインスペクターに以下の画像のようにスクリプトの名前が表示されます。

インスペークターの例

ボタンの設定

次にボタンに動画リワードの再生と、バナーの表示と非表示の設定を行っていきます。ボタンをHierarchyで選んだらインスペクター上にある「OnClick()」の項目で「+」を押してください。

設定できる場所ができると思うので、そこに「AdsMNG」を設定したGameObjectをドラッグ&ドロップで持っていきます。

Unityでボタンにスクリプト設定

設定完了後はOn Click()の「AdsMNG」の項目から「ShowMV()」を選びます。また、他の2つのボタンも同様に「AdsMNG」の設定を行い、それぞれ「ShowBN()」と「HideBN()」を選びます。

設定が完了したら、ボタンが押しやすいように配置や大きさを調整しましょう。場所が決まれば完成です。

ビルドを行い実機で表示テストを行ってください。それぞれのボタンを押すと反応すると思います。

完成イメージ

スクリプトの補足説明

【リリース時IDの設定】
リリース時IDの項目はAdMob契約後に実際のIDを入れてください。※テスト中は必ずテストIDを使うようにしてください。

AdMobの契約が完了し、リリースを行うときは「リリース時ID」の部分にIDを設定をしましょう。(バナーと動画リワードの2カ所です)

アプリの開発が終了しリリースするタイミングになったら「private int DEVE_NOW = 0;」を1にすることでリリース時IDが読み込まれます。

リリースIDの場所

またAdMobで広告を設定するときは、以下のように1つの端末IDに対してバナーとリワードの広告ユニットを設定してください。

ID設定

【ロード完了時バナー非表示】
今回はバナーロード完了時にバナーを一時非表示にする設定を入れています。必要のない場合は以下の85行目を消してください。

バナー非表示設定の場所

【動画の読み込みタイミング】
動画の読み込みタイミングについては、動画の再生ボタンが押されたタイミングにしているので、押してから再生までラグを感じるかと思います。

その場合162行目と163行目をStart()のバナーリクエスト(27行目)の下付近に入れると、再生までの間にロードが完了すると思います。
※現状の設定では173行目「rewardedAd.Show();」で、広告のロード完了時にムービーを再生するようにしているので、動画読み込みタイミングを「Start()」で行う場合はこの173行目をコメントアウトしてください。

動画読み込み

また、2回目以降の動画再生も早くしたい場合は197行目の「HandleRewardedAdClosed」イベントに同じく「162行目と163行目」をいれることで実現できるかと思います。

【動画リワードの報酬処理】
ムービー再生完了後のリワード報酬ですが、全て217行目に書いてください。ムービーが流れ、取得条件を満たしているときに再生画面を閉じると、215行目の処理が走るようになっています。

リワード処理の場所

その他おすすめ記事!