UnityでAdMobの折りたたみ可能バナー広告を実装する

AdMob Unityプログラミング

「折りたたみ可能バナー広告」の実装方法について説明します。この広告はまだベータ版ですので、急に仕様変更になったりするかもしれません。記事に間違いがある場合は、ご指摘いただければ幸いです。

折りたたみ可能バナー広告とは

「折りたたみ可能バナー広告」とは、ロードされ初回表示される時にバイ〜ンと大きく表示されて、ボタンを押したらキュキュと小さなサイズになるバナー広告のことです。広告の中で唯一、コンテンツに被ることが許されています。一方で、以下のように制約が多いことが特徴です。

制約
  • 縦画面でしか使用できない
  • 位置はTopかBottomのみ
  • 動的な画面では使用できない
  • 画面に1度しか表示できない(再表示には画面遷移必須という意味か?)
  • 確実に「折りたたみ可能バナー広告」が表示されるというわけではない

まず公式サイトから学ぼう

まずは公式サイトを見てください。公式のコードを見ますと、もうほとんど普通のバナーの実装と変わらないことがわかります。唯一違うのは、adRequestのExtrasにちょっとした情報をAddしていることですね。簡単ですよね。

ところが、公式サイトの方法をそのまま実装するとリフレッシュ(=ロード)される度に大きくなる可能性があります。バナー広告のリフレッシュの頻度は普通はAdMobの管理画面の自動更新で設定されていると思いますが、リフレッシュの仕組みを使って「適切なタイミング」を実現するのであれば、手動リフレッシュが必要だと思います。でも、面倒くさいですよね。なので、実用的には別の方法で行うのがよいと思われます。

実用的な実装方法

公式サイトの方法をそのまま実装すると、思ってもいないタイミングでバナーが大きくなる可能性があります。これだと誤タップが発生しまくるのではないかと不安になります。なので、自動リフレッシュでかつ、アプリの1回の起動につき1回だけ「一回こっきり」バイ〜ンと大きくさせる実装方法を紹介します。なお、バナーの基本的な実装方法がわからない方は、以前の記事をまずはご参照ください。

「一回こっきり」を実現するためにはExtrasにUUIDをAddします。UUIDというのは他の人と被らない(正確には被る可能性が極めて低い)唯一無二の識別番号のことです。UUIDには、ランダムに生成されたものを使い捨てで利用します。個人情報に関係するUUIDは使用しないようご注意ください。生成されたUUID(UUID_for_Collapsible)を以下のようにExtrasへAddすれば「一回こっきり」を実現できます。

    public static BannerView Ad { get; private set; } = null;

    public void LoadAd()
    {
        // iOSのテスト広告IDは     "ca-app-pub-3940256099942544/8388050270"
        // Androidのテスト広告IDは "ca-app-pub-3940256099942544/2014213617"

        Ad = new BannerView("--ここに広告ID--", AdSize.Banner, AdPosition.Bottom);

        var adRequest = new AdRequest();
        adRequest.Extras.Add("collapsible", "bottom");
        adRequest.Extras.Add("collapsible_request_id", UUID_for_Collapsible.ToString());

        Ad.LoadAd(adRequest);
    }

じゃあ、UUID_for_Collapsibleの中身をどのように生成すればよいのでしょうか。以下のようにStartメソッドの中でGUIDを「一回こっきり」生成すればよいものと思います。このようにすればUUID_for_Collapsibleはアプリが再起動されるまでは同じ値を保持し続けます。

注意

MicrosoftではUUIDのことをGUIDと呼びます。GUIDとUUIDは同じもので、呼び名が違うだけです。

    private static Guid? UUID_for_Collapsible = null;

    private void Start()
    {
        if(UUID_for_Collapsible == null)  UUID_for_Collapsible = Guid.NewGuid();
    }

最後に以下にコードの全体を掲載します。

using System;
using GoogleMobileAds.Api;
using UnityEngine;

public class BannerManager: MonoBehaviour
{
    public static BannerManager Instance;
    
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }


    private static Guid? UUID_for_Collapsible = null;

    private void Start()
    {
        if(UUID_for_Collapsible == null)  UUID_for_Collapsible = Guid.NewGuid();
    }


    public static BannerView Ad { get; private set; } = null;

    bool LoadAd_Lock  = false;
    public void LoadAd()
    {
        if (LoadAd_Lock) return;
        LoadAd_Lock = true;

        DestroyBannerAd();

        // iOSのテスト広告IDは     "ca-app-pub-3940256099942544/8388050270"
        // Androidのテスト広告IDは "ca-app-pub-3940256099942544/2014213617"

        Ad = new BannerView("--ここに広告ID--", AdSize.Banner, AdPosition.Bottom);
        Ad.OnBannerAdLoaded += OnLoaded;
        Ad.OnBannerAdLoadFailed += OnFailed;

        var adRequest = new AdRequest();
        adRequest.Extras.Add("collapsible", "bottom");
        adRequest.Extras.Add("collapsible_request_id", UUID_for_Collapsible.ToString());

        Ad.LoadAd(adRequest);
    }


    void OnLoaded()
    {
        LoadAd_Lock = false;
    }

    void OnFailed(LoadAdError error)
    {
        DestroyBannerAd();
        LoadAd_Lock = false;
    }

    public void DestroyBannerAd()
    {
        Ad?.Destroy();
        Ad = null;
    }
}

使用時の所感

普通サイズのバナーよりもアダプティブバナーの方が「折りたたみ可能広告」が表示される確率が高い気がしました。

UMPのGDPR同意フォームと同時に使用する場合は工夫が必要かもしれません。というのも、プレーヤーがGDPR同意フォームへ同意した後に「折りたたみ可能広告」のロードを開始するので、プレーヤーがちょこちょこ操作しているときにバナーが大きくなる可能性が高いからです。GDPR同意フォームへ同意直後は「折りたたみ可能広告」を出さないといったような対策が必要でしょう。

コメント