【Unity】Admobのリワード広告をつけてみた

この前作った脱出ゲームにリワード広告をつけてみました。

リワード広告は、広告を見たらアイテムが手に入ったりポイントがもらえたりするのが一般的のようです。

今回、私の作った脱出ゲームの場合には、動画を見るとクリアするヒントが表示されるようにしてみました。

リワード広告を追加するために以下の手順で進めました。

  1. UnityにMobile Ads SDKを入れる
  2. Admobページで広告ユニットを作成
  3. スクリプトを追加
  4. iOSビルドして実機で確認

1については以下のページで解説しています。

【Unity】admobのバナー広告をつけてiOSアプリを作ってみた-その2-

2番目の広告ユニットの作成についてみて行きます。

報酬の設定は何も弄らずにユニット名だけ決めて作成しました。

次にスクリプトの追加です。

スクリプトは以下のサイトにあるコードを参考にしています。

https://simanezumi1989.hatenablog.com/entry/2020/03/22/104215

リワード広告を見た回数に応じて、合計4種類のヒントが表示されるようにしました。

AndroidとiPhoneの両方に対応できるようにしています。

using UnityEngine;

using GoogleMobileAds.Api;
using UnityEngine.UI;
using System;

public class AdMob : MonoBehaviour
{
    private RewardedAd rewardedAd;
    public Text hintText;
    int count = 0;
    bool isRewarded;
    [SerializeField] GameObject hintPanel;
    string[] hints = {
        "これは1つ目のヒントです。",
        "これは2つ目のヒントです。",
        "これは3つ目のヒントです。",
        "これは4つ目のヒントです。"
    };

    // Use this for initialization
    void Start()
    {

#if UNITY_ANDROID
        string appId = "AppIdを入れます";
#elif UNITY_IPHONE
        string appId = "AppIdを入れます";
#else
        string appId = "unexpected_platform";
#endif


        // Initialize the Google Mobile Ads SDK.
        MobileAds.Initialize(appId);

        RequestRewardAd();
        this.RequestBanner();
    }

    private void RequestBanner()
    {
        // 本番では 自身の広告ユニットIDを設定します
#if UNITY_ANDROID
        string adUnitId = "バナー広告のIDを入れます";
#elif UNITY_IPHONE
        string adUnitId = "バナー広告のIDを入れます";
#else
        string appId = "unexpected_platform";
#endif

        // Create a 320x50 banner at the top of the screen.
        BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();

        // Load the banner with the request.
        bannerView.LoadAd(request);
    }

    // Update is called once per frame
    void Update()
    {
        if (isRewarded)
        {
            isRewarded = false;
            ShowRewardResult();
        }
    }

    public void UserChoseToWatchAd()
    {
        if (this.rewardedAd.IsLoaded())
        {
            this.rewardedAd.Show();
        }
    }

    void RequestRewardAd()
    {

#if UNITY_ANDROID
        string adUnitId = "リワード広告のIDを入れます";
#elif UNITY_IPHONE
        string adUnitId = "リワード広告のIDを入れます";
#else
        string appId = "unexpected_platform";
#endif

        this.rewardedAd = new RewardedAd(adUnitId);

        // Load成功時に実行する関数の登録
        this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        // Load失敗時に実行する関数の登録
        this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
        // 表示時に実行する関数の登録
        this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
        // 表示失敗時に実行する関数の登録
        this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
        // 報酬受け取り時に実行する関数の登録
        this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
        // 広告を閉じる時に実行する関数の登録
        this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;

        AdRequest request = new AdRequest.Builder().Build();
        this.rewardedAd.LoadAd(request);
    }

    public void ShowRewardResult()
    {
        hintText.text = hints[count];
        count++;
        if(count == 4)
        {
            count = 0;
        }
    }

    public void CreateAndLoadRewardedAd()
    {
#if UNITY_ANDROID
        string adUnitId = "リワード広告のIDを入れます";
#elif UNITY_IPHONE
        string adUnitId = "リワード広告のIDを入れます";
#else
        string appId = "unexpected_platform";
#endif

        this.rewardedAd = new RewardedAd(adUnitId);

        this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
        this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;

        AdRequest request = new AdRequest.Builder().Build();
        this.rewardedAd.LoadAd(request);
    }


    public void HandleRewardedAdLoaded(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdLoaded event received");
    }

    public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
    {
        MonoBehaviour.print(
            "HandleRewardedAdFailedToLoad event received with message: "
                             + args.Message);

    }

    public void HandleRewardedAdOpening(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdOpening event received");
    }

    public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
    {
        MonoBehaviour.print(
            "HandleRewardedAdFailedToShow event received with message: "
                             + args.Message);
    }

    public void HandleRewardedAdClosed(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdClosed event received");
        CreateAndLoadRewardedAd();
        hintPanel.SetActive(true);
    }

    public void HandleUserEarnedReward(object sender, Reward args)
    {
        string type = args.Type;
        double amount = args.Amount;
        MonoBehaviour.print(
            "HandleRewardedAdRewarded event received for "
                        + amount.ToString() + " " + type);
        isRewarded = true;
    }
}

バナー広告とリワード広告を表示するようにしています。

`UserChoseToWatchAd`はクリックした時に動画広告を再生する関数です。ボタンのクリックイベントに設定します。

`ShowRewardResult`は動画広告を全部見終わった時の報酬です。ここでヒントを表示することにしました。

あとはいろいろ問題が発生したので、下にメモっておきます。

動画がパネルに隠れてしまった

Unityで実行すると広告が出てきたんですが、UIパネルの下に隠れてしまったんですよ。

肝心の動画が見れない。

そこで、動画再生ボタンが押されたらパネルを非表示にして、見終わったら表示する処理を追加しました。

動画を見終わって広告を消した時には、`HandleRewardedAdClosed`が呼ばれるのでそこでパネルを復活させました。

iOSビルドしたら広告が表示されなかった

これが結構ドキドキ・ハラハラしましたね。

Xcodeでビルドして実機でアプリ実行したらバナー広告とリワード広告が両方表示されなくなったんですよ。

理由はXcodeで本番環境のバンドルIDを設定してなかったからです。

テストだと思ってXcodeでバンドルIDを適当に設定すると、別アプリとして認識されるので広告も表示されないようです。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog