広告実装の基本であるバナーの実装を行います。内容としては前回のAdmobの基礎と変わらない部分が多いですが、便利にするための処理がいくつか含まれます。C#の実装についても少しずつ理解を深めましょう。
バナー広告を実装する上での注意点
画面の幅にいい感じに合わせてくれるアダプティブバナーは少しだけ変更点があります。またアプリ終了時やシーン切り替え時などにバナーが不要になるタイミングで削除する必要があります。
設定が出来ること、アダプティブバナー
バナー広告では次のようなものを設定することが出来ます。とは言っても使われるものは限られてくると思います。
- Type
- Standard
- SmartBanner
- AnchoredAdaptive
- Position
- Top
- Bottom
- TopLeft
- TopRight
- BottomLeft
- BottomRight
- Center
今回はこの中でもアダプティブバナーを利用するための設定とUnitIDをインスペクターでセットする処理を実装します。
バナー広告の終了処理
前回のバージョンでは一度表示した広告がずっと出続けてしまいます。意図的にバナーを非表示にしたり、シーンが変わった時などに、バナーを非表示にしたいことがあります。
ここではバナー表示を行っているオブジェクトが消された場合にバナーを削除する方法をご紹介します。
アダプティブバナーに変更する
まずはアダプティブバナーへの切り替えを行います。
スクリプト変更
変更するスクリプトは「AdmobUnitBanner.cs」変更するメソッドはShowBannerメソッドを数行変更します。
public void ShowBanner()
{
if (bannerView != null)
{
Debug.Log("Destroying banner view.");
bannerView.Destroy();
bannerView = null;
}
// AdSizeを新たに作成
AdSize adaptiveSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);
// 作成したAdSizeを引数に指定する
bannerView = new BannerView(
bannerUnitId,
adaptiveSize,
AdPosition.Bottom);
// ---------以下略---------
}
動かして確認
スクリプトが変更できたらゲームを動かして見てください。画面の横幅に応じてバナーのサイズが切り替わってくれたと思います。
広告実装をさらに便利にする
広告の変更自体は以上で終了ですが、今後の開発を便利にするための処理を加えたいと思います。
広告IDをインスペクターでセット出来るようにする
まずは広告IDをインスペクターでセット出来るように変更します。これは便利にしつつ、再利用性もアップさせることが出来ます。
AdmobUnitBase
Admobの広告はAndroidとIOSの広告IDいずれかをセットする必要があります。また、1つのアプリ内でも表示する場所やシーンによってIDを変更することがあります。そのため各ユニットのインスペクターでそれぞれのIDを設定出来ると大変便利です。スクリプトを直す必要もありませんし。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
public abstract class AdmobUnitBase : MonoBehaviour
{
[SerializeField] private string unitIDAndroid;
[SerializeField] private string unitIDIOS;
protected string UnitID
{
get
{
#if UNITY_ANDROID
return unitIDAndroid;
#elif UNITY_IOS
return unitIDIOS;
#else
return "";
#endif
}
}
private void OnAppStateChangedBase(AppState state)
{
Debug.Log("App State changed to : " + state);
OnAppStateChanged(state);
}
private IEnumerator Start()
{
while (AdmobManager.Instance.IsReady == false)
{
yield return 0;
}
Initialize();
}
protected virtual void Initialize()
{
// AdsManagerの初期化が終わったあとに呼ばれる
}
protected virtual void OnAppStateChanged(AppState state)
{
}
}
AdmobUnitBanner
Baseクラスで追加したプロパティを利用して、コードをスッキリさせます。こちらのコードはすべて記載しますので、エラーが出る場合はBaseクラスなどで実装漏れがないか確認してみてください。
using UnityEngine;
using GoogleMobileAds.Api;
public class AdmobUnitBanner : AdmobUnitBase
{
private BannerView bannerView;
protected override void Initialize()
{
ShowBanner();
}
public void ShowBanner()
{
if (bannerView != null)
{
Debug.Log("Destroying banner view.");
bannerView.Destroy();
bannerView = null;
}
// AdSizeを新たに作成
AdSize adaptiveSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);
// 作成したAdSizeを引数に指定する
bannerView = new BannerView(
UnitID,
adaptiveSize,
AdPosition.Bottom);
bannerView.OnBannerAdLoaded += () =>
{
Debug.Log("ロードされました - 表示します");
};
bannerView.OnBannerAdLoadFailed += (LoadAdError error) =>
{
Debug.LogError("ロード失敗しました");
};
//リクエストを生成
var adRequest = new AdRequest();
bannerView.LoadAd(adRequest);
}
}
コード内にIDが入らないため、見た目もスッキリ
ただしIDはBaseクラスに宣言してあるので、クラス構成を忘れないようにしてくださいね
オブジェクト破壊時に広告を解除する処理
バナーのオブジェクトがDestroyされた時、バナーを消す処理も実装します。こちらはOnDestroy時に作られているバナーがある場合、削除を行うようにします。もともとあった削除処理も今回の変更に合わせて修正を行います。コードも再びすべて載せますので、違う部分などを見比べて見てください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;
using System;
public class AdmobUnitBanner : AdmobUnitBase
{
private BannerView bannerView;
protected override void Initialize()
{
ShowBanner();
}
public void ShowBanner()
{
UnitDestroy();
AdSize adaptiveSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);
bannerView = new BannerView(
UnitId,
adaptiveSize,
AdPosition.Bottom);
bannerView.OnBannerAdLoaded += () =>
{
Debug.Log("ロードされました - 表示します");
bannerView.Show();
};
bannerView.OnBannerAdLoadFailed += (LoadAdError error) =>
{
Debug.LogError("ロード失敗しました");
};
//リクエストを生成
var adRequest = new AdRequest();
bannerView.LoadAd(adRequest);
}
private void UnitDestroy()
{
if (bannerView != null)
{
Debug.Log("Destroying banner view.");
bannerView.Destroy();
bannerView = null;
}
}
private void OnDestroy()
{
UnitDestroy();
}
}
コメント