問題点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 (); }
これでようやく、タイムラグをできるだけ解消しつつ、ゲームの邪魔をしない広告ができたと思う。