Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Unity】AdMobバナー広告をシーンごとに表示・非表示する方法

Unityでアプリを開発していると、シーンによってバナー広告を表示したい画面と、表示したくない画面があります。例えば「カテゴリ選択画面では表示するけど、問題プレイ中の画面では非表示にしたい」といったケースです。

今回は GoogleAdMobBanner.csAdSceneController.cs を使って、シーン切り替えに応じてバナー広告を表示・非表示する方法を紹介します。


1. AdMobの導入準備

まずは Google Mobile Ads SDK for Unity をインポートしておきましょう。iOS/Androidのビルド設定も事前に済ませておく必要があります。


2. GoogleAdMobBanner.cs

広告をロードして保持するスクリプトです。Start画面など最初のシーンにアタッチし、DontDestroyOnLoad でシーンを跨いでも残るようにします。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleMobileAds.Api;

public class GoogleAdMobBanner : MonoBehaviour
{
    private static GoogleAdMobBanner instance;
    private BannerView bannerView;

    void Awake()
    {
        // シングルトン化(複数シーンにまたがっても1つだけ)
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(gameObject); // シーンを跨いでも残す
    }

    void Start()
    {
        // 初期化
        MobileAds.Initialize(initStatus => { });
        RequestBanner();
    }

    private void RequestBanner()
    {
        #if UNITY_ANDROID
            string adUnitId = "ca-app-pub-3940256099942544/6300978111"; // テスト用ID
        #elif UNITY_IPHONE
            string adUnitId = "ca-app-pub-3940256099942544/2934735716"; // テスト用ID
        #else
            string adUnitId = "unexpected_platform";
        #endif

        bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Bottom);
        AdRequest request = new AdRequest.Builder().Build();
        bannerView.LoadAd(request);
    }

    // 追加: バナーを非表示にする
    public void HideBanner()
    {
        if (bannerView != null)
        {
            bannerView.Hide();
        }
    }

    // 追加: バナーを再表示する
    public void ShowBanner()
    {
        if (bannerView != null)
        {
            bannerView.Show();
        }
    }
}

 

ポイント:

  • DontDestroyOnLoad でシーン切り替え後も広告オブジェクトを保持。

  • ShowBanner()HideBanner() を公開しておき、他のスクリプトから操作可能に。


3. AdSceneController.cs

シーン切り替えを監視して、広告の表示/非表示を自動で切り替えるスクリプトです。GoogleAdMobBanner と同じオブジェクトにアタッチします。

以下の例では、「MainScene」と「DetailScene」だけ非表示にして他の画面では表示にしています。それ以外では適宜名称を変更してもらえばいいと思います。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AdSceneController : MonoBehaviour
{
    void OnEnable()
    {
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

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

    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        var ad = FindObjectOfType<GoogleAdMobBanner>();
        if (ad == null) return;

        if (scene.name == "MainScene")   // ★MainSceneでは非表示
        {
            ad.HideBanner();
        }
        else if (scene.name == "DetailScene") // ★DetailSceneでは非表示
        {
            ad.HideBanner();
        }        
        else                            // ★それ以外のシーンでは表示
        {
            ad.ShowBanner();
        }
    }
}

 

ポイント:

  • SceneManager.sceneLoaded を使ってシーン切り替えを検知。

  • シーン名に応じて ShowBanner() / HideBanner() を呼び分け。


4. 実際の使い方

  1. はじめに呼ばれるStartシーンなどの空オブジェクトに GoogleAdMobBannerAdSceneController をアタッチ。

  2. 他のシーンには 広告用オブジェクトは配置しない

  3. 非表示に設定した画面では広告は非表示になり、それ以外の画面では表示される。


5. 注意点

  • 実機でテストする際は テスト広告ID を使用してください。本番IDを使うと規約違反になる可能性があります。

  • Editor上では挙動が完全に再現されないので、必ず実機で動作確認を行いましょう。

  • 今回の方法は バナー広告専用 です。インタースティシャル広告やリワード広告などを使う場合は、別途それぞれの管理スクリプトを用意し、表示タイミングを明示的に制御する必要があります。シーンごとの表示/非表示制御をそのまま使うと誤動作や不自然な表示になるため注意してください。


まとめ

  • GoogleAdMobBanner.cs で広告を生成・保持。

  • AdSceneController.cs でシーン切り替えを監視し、広告を表示/非表示。

  • はじめに呼ばれるStartシーンなどのオブジェクトにまとめてアタッチすればOK。

  • バナー以外の広告は別途制御が必要。

この方法を使えば、表示が必要な画面ではバナー広告を表示し、ゲームプレイ画面など非表示にしたい画面では自動的に非表示にできます。シンプルかつ管理しやすい構成なのでおすすめです。