UnityでAdMobをGDPR対応させる(その3)

AdMob for GDPR Unityプログラミング

このシリーズの最終的なゴールはGDPRに対応させたAdMobのテスト広告を実機(またはシミュレータ)で表示することです。前回はAdMobManagerというAdMobを初期化するだけのクラスを作りました。今回はバナーを表示するBannerManagerクラスを作りましょう。アプリ開発会社のプロのプログラマーではないので、我流でガラパゴス化している方法かもしれませんが、大目に見てください。バナーの表示についてはGoogleの公式サイトを見て理解できるのであれば、それに越したことはありません。理解できないのであれば、この記事が参考になるでしょう。

使用するバージョン

Unity2022.3.29f1
Google Mobile Ads Unity Plugin v9.2.0

バナーを管理するクラスの大枠をつくろう

バナーを管理するクラスを作りましょう。クラスがわからない人は、C#の初心者向けの書籍を一読してください。とはいえ例えるならば、クラスは魔法世界の魔法陣のようなものです。あらかじめ魔法陣を作成しておけば、そこに魔力を流すだけで簡単に同じ魔法が何発でも発生させられるといった感じの便利な仕組みがクラスなのです。今からバナーを発生させる魔法陣を作りましょう。AdMobManagerと同じフォルダにBannerManagerという名前のクラスのファイルを作りましょう。

では、ファイルを開いて、以下のように大枠を作りましょう。BannerManagerクラスもシングルトンにします。(2024.8.31修正)

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);
        }
    }
}

バナーをロードするメソッドをつくろう

さて、次にBannerManagerクラスの中に以下のフィールド(=変数のこと)とメソッドを追加しましょう。Adがバナーのインスタンスが入る大切な大切なフィールドです。そして、getやsetを使ってプロパティ化しています。プロパティがわからない人は、C#の初心者向けの書籍を一読してください。LoadAd_LockはLoadAdメソッドが二重実行されないことを保証するためのインターロックです。インターロックとは「一つが起動していたら他を起動させない仕組み」のことです。では、LoadAd()の中身を上から順に解説していきます

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

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

        DestroyBannerAd();// このあと作成する

        Ad = new BannerView(AdMobManager.DRO_BANNER, AdSize.Banner, AdPosition.Bottom);
        Ad.OnBannerAdLoaded += OnLoaded;    // 中身はこのあと作成する
        Ad.OnBannerAdLoadFailed += OnFailed;  // 中身はこのあと作成する
        Ad.LoadAd(new AdRequest());
    }

最初のif文で二重実行を防止しています。LoadAd_LockがTrueならばLoadAd()が実行中で、Falseなら実行中でないという意味です。なので、Trueのときはreturnで中断します。Falseのときは次の行まで進んで、LoadAd_LockにTrueを入れます。これにより実行状態であることを示せます。

DestroyBannerAd()ですが、バナーのインスタンスをきっちり破棄することが大事ですので、二重にロードしないようにロード前にとにかく破棄しています。

new BannerView()のところでは、作成したバナーのインスタンスをAdに入れています。AdMobManager.DRO_BANNERは前回の記事で作成した広告IDのStringです。AdSize.Bannerは普通のサイズのバナーという意味です。AdPosition.Bottomは端末の画面の下側にバナーを配置するという意味です。これらの条件でバナーのインスタンスを作成して、Adに入れているということです。

Ad.OnBannerAdLoadedはバナーのロードが完了したタイミングで実行され、Ad.OnBannerAdLoadFailedはバナーのロードが失敗したタイミングで実行されます。Ad.OnBannerAdLoadedとAd.OnBannerAdLoadFailedはデリゲートと言われるものです。デリゲートはメソッドの変数です。Stringやintだけではなく、メソッドも変数にできます。それがデリゲートです。Ad.OnBannerAdLoadedとAd.OnBannerAdLoadFailedに好きなメソッドを代入できるということです。すごいですよね!デリゲートを使えば、状況に応じてメソッドを差し替えたりできるということです。今回は残念ながら今回は差し替えはしませんが。『+=』の右辺のOnLoadedやOnFailedが追加するメソッドです。追加するメソッドの引数はデリゲートと一致しなければならない点に注意が必要です。

各メソッドの中身をつくろう

さて、メソッドの中身を作りましょう。まず、DestroyBannerAd()です。以下のように作ります。Ad?.Destroy()の『?.』null条件演算子といわれるもので、AdがもしnullでなければそのDestroyメソッドを実行するというものです。AdがnullなのにDestroyを実行しようとするとエラーになりますので、それを防止できるわけです。最後にAd に念の為、nullを入れています。

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

次にOnLoaded()です。これはバナーのロードが完了したタイミングで実行されます。完了時にLoadAd()のインターロックを解除したいのでLoadAd_LockにFalseを入れます。

    void OnLoaded()
    {
        LoadAd_Lock = false;
    }

最後にOnFailed()です。これはバナーのロードが失敗したタイミングで実行されます。失敗した時もLoadAd()のインターロックを解除したいのでLoadAd_LockにFalseを入れます。また、失敗したのでバナーのインスタンスを破棄しています。OnFailed()は引数を取りますが、これはデリゲートがそうなっているのでそれに合わせているということです。

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

コードの全体

コードの全体は以下の通りです。

using GoogleMobileAds.Api;

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

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

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

        DestroyBannerAd();

        Ad = new BannerView(AdMobManager.DRO_BANNER, AdSize.Banner, AdPosition.Bottom);
        Ad.OnBannerAdLoaded += OnLoaded;
        Ad.OnBannerAdLoadFailed += OnFailed;
        Ad.LoadAd(new AdRequest());
    }


    void OnLoaded()
    {
        LoadAd_Lock = false;
    }

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

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

終わりに

今回はバナーを表示するためのクラスについて説明しました。次回はGDPRの同意取得の詳細フローについて説明します。

このシリーズの記事

コメント