アプリ起動広告を実装するUnity+Admob

いつからかAdMobに追加されていたアプリ起動時広告。わざわざ追加されたということは、ニーズがあるということかしら。ただアプリを2回目以降に立ち上げたという点では、案外効果あるのかも?

目次

実装に関する注意など

今回はドキュメント通りの実装になります。このままだと使いづらい点がいくつかあるのでその部分に関しては各アプリごとにカスタマイズが必要かも

アプリ起動広告の実装ポリシー

今回実装する広告ですが、あまり聞いたことない方もいるのではないでしょうか?公式ドキュメント的にはアプリがバックグラウンドから戻ってきたときや、場面の切り替えのときにどうぞ!という感じで紹介されていました。サンプルではバックグラウンドから戻ってきた時しか表示タイミング無いですが、ゲーム内のシーン切り替えなどで実装するのは悪く無いのかも。

また、ユーザーの快適性のために4時間ぐらいは間をあけるように書かれていました。

  • 表示タイミング
    • アプリがバックグラウンドから戻った時
    • ゲーム内での場面の切り替え時
  • 表示間隔
    • 推奨4時間以上は間隔をとる!

ドキュメント日本語ないのか・・・

Youtubeの配信をしているときに、アプリ起動広告の記事をせっつかれてました。んで調べてみたところなんと日本語のドキュメントないんですね。

英語の方のページはあったので、自分は困らないけどこういうところ、ディベロッパーの快適性完全に無視されてるのほんと改善してほしいところ。

アプリ起動広告のテストID

今回のテスト広告IDは以下

プラットフォームテストID
Androidca-app-pub-3940256099942544/9257395921
iOSca-app-pub-3940256099942544/5575463023

実装しますよ!

流れとしてはいつもどおり

  • スクリプト作成
  • GameObjectに貼り付ける
  • インスペクターに広告IDをつける
  • テスト!

コードの方針

今回いままでの実装と変わる部分があります。

  • アプリがバックグラウンドから戻って来ることを検出するイベント・メソッドを追加
    • 今回はOnApplicationPauseを利用
    • 公式ページと違わないか?と思ったあなた!良い目をしておられる。気になったら試して見るがよい!公式通りにやると端末やバージョンによっては動かないから!!
  • 4時間のインターバルを計測する

このあたりが大きく違いますのでご注意ください。ただしテスト中は4時間も待っていられないのでRemote Configを使って秒数を指定できるようにしましょう。

Remote Configの設定を行う

今回は起動広告に加え、起動広告のインターバル(秒)もセットできるようにします。下図の下部3項目が対象になります。(Remote Configについてはこちらの記事をご確認ください。)

更新後は必ずPushボタンを押すのを忘れずに!!

スライム

Remote Configは、実機絡みのデバッグにも使えて大変便利です!

ソースコード

Remote Configを使うかどうかの判定を、子どものクラスでも利用するためAdmobUnitBaseクラスに変更が入っています。お手数ですが更新をお願いします!(一応コメントでも補足してます・・・)

using UnityEngine;
using GoogleMobileAds.Api;
using System;
using GoogleMobileAds.Common;
using Unity.Services.RemoteConfig;

public class AdmobUnitOpen : AdmobUnitBase
{
    private DateTime expireTime;
    private AppOpenAd appOpenAd;
    [SerializeField] private string KEY_IntervalSeconds = "openad_interval_seconds";
    private int intervalSeconds = 60 * 60 * 4;  // 4時間

    public bool IsAdAvailable
    {
        get
        {
            return appOpenAd != null
                   && appOpenAd.CanShowAd()
                   && DateTime.Now < expireTime;
        }
    }

    protected override void Initialize()
    {
        // ここでエラーが出る場合は、AdmobUnitBase.csのUseRemoteConfigプロパティを追加してください
        // public bool UseRemoteConfig => useRemoteConfig;
        if (UseRemoteConfig)
        {
            intervalSeconds = RemoteConfigService.Instance.appConfig.GetInt(KEY_IntervalSeconds);
        }
        LoadAppOpenAd();
    }

    public void LoadAppOpenAd()
    {
        if (appOpenAd != null)
        {
            appOpenAd.Destroy();
            appOpenAd = null;
        }

        var adRequest = new AdRequest();

        AppOpenAd.Load(UnitID, adRequest,
            (AppOpenAd ad, LoadAdError error) =>
            {
                if (error != null || ad == null)
                {
                    Debug.LogError("app open ad failed to load an ad " +
                                   "with error : " + error);
                    return;
                }
                Debug.Log("App open ad loaded with response : "
                          + ad.GetResponseInfo());
                // 今からintervalSeconds秒後にexpireTimeを設定(これ以降なら広告を表示してもいいよ)
                expireTime = DateTime.Now + TimeSpan.FromSeconds(intervalSeconds);

                appOpenAd = ad;
                RegisterEventHandlers(ad);
            });
    }

    private void RegisterEventHandlers(AppOpenAd ad)
    {
        // Raised when the ad is estimated to have earned money.
        ad.OnAdPaid += (AdValue adValue) =>
        {
            Debug.Log(String.Format("App open ad paid {0} {1}.",
                adValue.Value,
                adValue.CurrencyCode));
        };
        // Raised when an impression is recorded for an ad.
        ad.OnAdImpressionRecorded += () =>
        {
            Debug.Log("App open ad recorded an impression.");
        };
        // Raised when a click is recorded for an ad.
        ad.OnAdClicked += () =>
        {
            Debug.Log("App open ad was clicked.");
        };
        // Raised when an ad opened full screen content.
        ad.OnAdFullScreenContentOpened += () =>
        {
            Debug.Log("App open ad full screen content opened.");
        };
        // Raised when the ad closed full screen content.
        ad.OnAdFullScreenContentClosed += () =>
        {
            Debug.Log("App open ad full screen content closed.");
            LoadAppOpenAd();
        };
        // Raised when the ad failed to open full screen content.
        ad.OnAdFullScreenContentFailed += (AdError error) =>
        {
            Debug.LogError("App open ad failed to open full screen content " +
                           "with error : " + error);
            LoadAppOpenAd();
        };
    }

    public void ShowOpenAd()
    {
        if (IsAdAvailable)
        {
            appOpenAd.Show();
        }
        else
        {
            Debug.Log("App open ad is not ready yet.");
        }
    }

    private void OnApplicationPause(bool pauseStatus)
    {
        if (!pauseStatus)
        {
            ShowOpenAd();
        }
    }
}

上にも書きましたが、Baseクラスを修正する必要があります!

テスト

準備できたらアプリをビルドして実機で確認してみてください。起動してから10秒は間を空けないとだめですよ

  • アプリを起動する
  • バックグランドに落とす
    • タスクキルではない
  • 10秒ぐらい経過したらアプリを再び立ち上げると表示されたら成功!
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次