【保存版 2018最新】Unity+AdMobでバナー/インタースティシャル広告を表示するスクリプト

UnityでAdMob広告を実装するときには、いつもこちらの記事を参考にしていました。

http://games.genieus.co.jp/unity/admob_unity/

ただこちらの記事で紹介されているスクリプトだと、場合によってインタースティシャルがロードされておらず、表示されないということがありました。

そこで、UnityでAdMobの広告を表示するスクリプトを書き直しました。

AdmobManager.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
public class AdmobManager : MonoBehaviour {
public string ios_Banner1;
public string ios_Banner2;
public string ios_Interstitial;
public string android_Banner1;
public string android_Banner2;
public string android_Interstitial;
private InterstitialAd interstitial;
private AdRequest request;
bool is_close_interstitial = false; 
private int reShowCount;
void Awake () {
reShowCount = 0;
RequestInterstitial ();
RequestBanner ();
}
public void RequestBanner()
{
#if UNITY_ANDROID
string adUnitId1 = android_Banner1;
string adUnitId2 = android_Banner2;
#elif UNITY_IPHONE
string adUnitId1 = ios_Banner1;
string adUnitId2 = ios_Banner2;
#else
string adUnitId = "unexpected_platform";
#endif
BannerView bannerView1 = new BannerView(adUnitId1, AdSize.Banner, AdPosition.Top);
BannerView bannerView2 = new BannerView(adUnitId2, AdSize.Banner, AdPosition.Bottom);
request = new AdRequest.Builder()
.AddTestDevice(AdRequest.TestDeviceSimulator)
.AddTestDevice("自分のiPhoneのUDID")
.Build();
bannerView1.LoadAd(request);
bannerView2.LoadAd(request);
}
public void RequestInterstitial()
{
#if UNITY_ANDROID
string adUnitId = android_Interstitial;
#elif UNITY_IPHONE
string adUnitId = ios_Interstitial;
#else
string adUnitId = "unexpected_platform";
#endif
if (is_close_interstitial == true) {
interstitial.Destroy ();
}
interstitial = new InterstitialAd (adUnitId);
request = new AdRequest.Builder()
.AddTestDevice(AdRequest.TestDeviceSimulator)
.AddTestDevice("自分のiPhoneのUDID")
.Build();
interstitial.LoadAd (request);
interstitial.OnAdClosed += HandleAdClosed;
interstitial.OnAdFailedToLoad += HandleAdReLoad;
is_close_interstitial = false;
}
// インタースティシャル広告を閉じたとき
void HandleAdClosed(object sender, System.EventArgs e)
{
is_close_interstitial = true;
RequestInterstitial();
}
// 広告のロードに失敗したとき
void HandleAdReLoad(object sender, System.EventArgs e)
{
is_close_interstitial = true;
StartCoroutine(_waitConnect());
}
// 次のロードまで30秒待つ
IEnumerator _waitConnect()
{
while (true)
{
yield return new WaitForSeconds(30.0f);
// ネットに接続できるときだけリロード
if (Application.internetReachability != NetworkReachability.NotReachable)
{
RequestInterstitial();
break;
}
}
}
//インタースティシャル広告を表示したいときに呼び出す
public void InterstitialShow()
{
//準備できてたら表示
if (interstitial.IsLoaded ()) {
interstitial.Show ();
reShowCount = 0;
} else {
//準備できてなかったら0.1秒ごとに準備できてるか確認
if (reShowCount < 10) {
Invoke ("InterstitialShow", 0.1f);
reShowCount++;
} else {
//1秒たっても準備できなかったとき
reShowCount = 0;
}
}
}
}

インタースティシャル広告がロードされていなかったときは、0.1秒ごとに10回呼び出しています。

だいたいの場合、0.2秒後にはロードが完了している様子。

これをAdmobManager.csとして保存し、インタースティシャル広告を表示したいときにInterstitialShow()を呼び出せばオッケー。