Admob-アダプティブバナーの実装とUnitBaseの改良![Unity]

広告実装の基本であるバナーの実装を行います。内容としては前回の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();
    }
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次