読者です 読者をやめる 読者になる 読者になる

Roba Memo - Unity , Blender

素人のUnity覚書と奮闘記

インタースティシャル広告のリクエストと表示のタイミングについて

問題点1:読み込みを待って表示したい

例えば、AwakeやStartでリクエストしてすぐに表示しては、まだ読み込めて居ないので表示されない。
しかも、以下のような書き方だと、一度しか実行されないので困る。

public void viewInterstitial ()
{
    if (interstitialAd.IsLoaded ()) {
        show = false;
        interstitialAd.Show ();
    }
}

対処方法

それならば、OnGUIで実行すれば読み込まれたら表示されるようになるはず!
ということで、以下のようにして見た。

public void viewInterstitial ()
{
    show = true;
}

void OnGUI ()
{
    if (show) {
        if (interstitialAd.IsLoaded ()) {
            show = false;
            interstitialAd.Show ();
        }
    }
}

問題点2:読み込み→表示のタイムラグをなんとかしたい

これだと、読み込みを待ってから表示される。
しかし、このクラスをシングルトンにしたため、読み込んでいる時間のタイムラグが発生して、ゲーム中にインタースティシャル広告が割り込んでしまうようになった。

対処方法

ということで、ゲームに移動したら広告を破棄するようにした。

public void DestroyInterstitial ()
{
    show = false;
    interstitialAd.Destroy ();
}

ゲームシーンに配置するItemクラスにて

void Awake ()
{
    AdMobManager.instance.DestroyInterstitial ();
}

問題点3:広告が表示されにくくなった

これで、突然広告が起動することは避けられたが、今度は読み込み完了するまえにゲームシーンへ移動されると広告が表示されないようになった。

対処方法

それならば、事前のシーンで読み込んでおけば、表示される確率があがるのではないか?
タイトルシーンで一度表示したいので、その前のスプラッシュシーンでリクエストをする。
エンドシーンで表示したい場合は、ゲームシーンでリクエストしておけば良い。
それならば、広告を破棄した後にリクエストをすれば良いってことか!

public void DestroyInterstitial ()
{
    show = false;
    interstitialAd.Destroy ();
    RequestInterstitial ();
}

問題点4:広告を閉じた時のイベントをキャッチしたい

シーンの移動で、プログラムから直接DestroyInterstitial()を実行した場合は、うまくいった。
しかし、広告を閉じた時、なぜかDestroyInterstitial()が実行されなかった。
どうやら、下記のような書き方では、呼び出されないらしい。

// インタースティシャル広告を閉じた時に走る
void HandleAdClosed (object sender, System.EventArgs e)
{
    DestroyInterstitial ();
}

対処方法

広告を閉じた時のイベントをキャッチすれば、広告を閉じると破棄されて次のリクエストが開始される。

   public void RequestInterstitial ()
    {
       #if UNITY_ANDROID
        string adUnitId = android_InterstitialID;
       #elif UNITY_IPHONE
        string adUnitId = iOS_InterstitianID;
       #else
        string adUnitId = "unexpected_platform";
       #endif
         
         
        interstitialAd = new InterstitialAd (adUnitId);
        AdRequest request = new AdRequest.Builder ()
                    .AddTestDevice (AdRequest.TestDeviceSimulator)
                    .AddTestDevice (deviceID1)
                    .AddTestDevice (deviceID2)
                    .AddTestDevice (deviceID3)
                    .AddTestDevice (deviceID4)
                    .Build ();
        interstitialAd.OnAdClosed += InterstitialAd_OnAdClosed;
        interstitialAd.LoadAd (request);
    }

    void InterstitialAd_OnAdClosed (object sender, System.EventArgs e)
    {
        DestroyInterstitial ();
    }

    public void DestroyInterstitial ()
    {
        show = false;
        interstitialAd.Destroy ();
        RequestInterstitial ();
    }

これでようやく、タイムラグをできるだけ解消しつつ、ゲームの邪魔をしない広告ができたと思う。