💨

Androidでアプリ内にAdmobテストバナー広告を実装(Unity)

に公開

概要

本記事では、25年4月時点のUnity(2022.3.43f1)で、
Google Mobile Ads Unity Plugin v10.0.0でエラーが出た為、
Google Mobile Ads Unity Plugin v9.6.0での導入と
Admobのテストバナー広告の簡単な実装方法を解説します。

  1. 準備するもの

    • Unity(2022.3.43f1)
  2. Mobile Ads SDK (Unity)の導入

- 下にスクロールしてGoogle Mobile Ads Unity Plugin v9.6.0を押す

 - 下記画面になるので、GoogleMobileAds-v9.6.0.unitypackageを押してダウンロード

- Assets > Import Package > Custom Packageを押す

- GoogleMobileAds-v9.6.0.unitypackageを選択して開く

- 下記画面でImportを押す

- 下記画面が出た場合Enableを押す

- 上記画面が出なかった場合は手動で、
Assets > External Dependency Manager > Android Resolver > Force Resolver

- 下記画面になったらOK

- Assets > Google Mobile Ads > Settingsを押す

- GoogleMobileAdsSettingsを押して下記テストIDを入力
Androidテスト用AppID : ca-app-pub-3940256099942544~3347511713
    iOSテスト用AppID : ca-app-pub-3940256099942544~1458002511

- 下記空のGame Objectを作成して、名前をAdmobManagerにします
  
- スクリプトは下記をコピーして、AdmobManagerにアタッチします

using UnityEngine;
using GoogleMobileAds.Api;

public class AdmobManager : MonoBehaviour
{
    public static AdmobManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<AdmobManager>();
            }
            return instance;
        }
    }
    public static AdmobManager instance;


    private bool isReady = false;
    public bool IsReady
    {
        get
        {
            return isReady;
        }
    }
    void Start()
    {
        if (this != Instance)
        {
            Destroy(gameObject);
            return;
        }
        else
        {
            DontDestroyOnLoad(gameObject);
            instance = this;
        }
        MobileAds.RaiseAdEventsOnUnityMainThread = true;
        MobileAds.Initialize(initStatus =>
        {
            isReady = true;
            Debug.Log(initStatus);
        });
    }
}
  • スクリプトは下記をコピーして、AdmobUnitBaseを作成。アタッチしません。
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)
    {
    }
}
  • 下記空のGame Objectを作成して、名前をAdmobUnitBannerにします
  • 下記スクリプトは、バナー表示とボタンを押した場合に任意のシーン
     下記例では "Title", "Leaderboard" のシーンでバナー広告が出ない。
     任意のボタンをアタッチするとバナーが出なくなります。
     ボタンをアタッチしなかった場合はバナー広告は出っ放しになります。
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using GoogleMobileAds.Api;

public class AdmobUnitBanner : AdmobUnitBase
{
    public BannerView bannerView;

    public Button StartButton;
    public Button TitleButton;

    // Start メソッドを使用して、ゲームが開始されたときに広告を表示するかどうかをチェックします。
    private void Start()
    {
        SceneManager.sceneLoaded += OnSceneLoaded;

        // 最初のシーンが読み込まれたときに広告をチェック
        CheckAndShowBanner(SceneManager.GetActiveScene());

        // ボタンの参照を設定
        if (StartButton != null)
        {
            StartButton.onClick.AddListener(OnButtonClick);
        }
        else
        {
            Debug.Log("StartButtonが設定されていません");
        }

        if (TitleButton != null)
        {
            TitleButton.onClick.AddListener(OnButtonClick);
        }
        else
        {
            Debug.Log("TitleButtonが設定されていません");
        }

    }

    private void OnButtonClick()
    {
        Debug.Log("ボタンが押されました");
        DestroyBanner();
    }

    private void OnDestroy()
    {
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }

    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        // 新しいシーンが読み込まれるたびに広告をチェック
        CheckAndShowBanner(scene);
    }

    private void CheckAndShowBanner(Scene scene)
    {
        // 広告を表示するシーンの名前をリスト化
        string[] targetSceneNames = { "Title", "Leaderboard" };

        // 現在のシーンがリストに含まれている場合のみ広告を表示
        if (System.Array.Exists(targetSceneNames, element => element == scene.name))
        {
            Debug.Log(scene.name + "でバナーを表示します");
            ShowBanner();
        }
        else
        {
            Debug.Log(scene.name + "ではバナーを表示しません");

            // ここを修正 → ボタンが設定されている場合だけDestroy
            if (StartButton != null || TitleButton != null)
            {
                DestroyBanner();
            }
            else
            {
                Debug.Log("ボタンが設定されていないため、バナーはそのままにします");
            }
        }
    }


    public void ShowBanner()
    {
        if (bannerView != null)
        {
            bannerView.Destroy();
            bannerView = null;
        }

        // AdSizeを新たに作成
        AdSize adaptiveSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);

        // 作成したAdSizeを引数に指定する
        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);
    }

    public void DestroyBanner()
    {
        if (bannerView != null)
        {
            Debug.Log("バナーは消えました");
            bannerView.Destroy();
            bannerView = null;
        }
    }
}
  • 下記Build Setting を開いて、Player Settingsを開く
  • 下記Other Settings のMinimum API Level 24、Target API Level 34に設定。
    • あとはBuild or Build And Runボタンで完了です。

Discussion