AdMob-Reward広告を実装する[Unity]

お問い合わせも多かったReward広告。今までの広告実装が出来ている人であればさっと実装出来ると思います。ただ注意点も多いので、先にそのあたり解説してから実装していきたいと思います。

目次

リワード広告を実装する

インタースティシャルとほとんど同じですが、唯一違うのは再生後になんのリワード広告だったかを確認できるところですね。

手順の確認

リワード広告は以下の手順で実装を行います

  1. 広告の読み込み
  2. [オプション]サーバーサイドの検証(今回は実装せず)
  3. 報酬のコールバック登録
  4. 広告の再生
    • 再生後にTypeとAmountによって報酬を変える
  5. クリーンアップ
  6. 次の広告の準備

テスト用広告ID

よく使うのでメモ。リワード広告のテスト用ID

プラットフォームテスト用ID
Androidca-app-pub-3940256099942544/5224354917
iOSca-app-pub-3940256099942544/1712485313

リワード広告用のクラス

毎度おなじみAdmobUnitBaseを継承したクラス、AdmobUnitRewardを作成して下さい。

using UnityEngine;
using GoogleMobileAds.Api;
using System;

public class AdmobUnitReward : AdmobUnitBase
{
    private RewardedAd rewardedAd;

    public bool IsReady
    {
        get
        {
            if (AdmobManager.Instance.IsReady == false)
            {
                return false;
            }
            return rewardedAd != null && rewardedAd.CanShowAd();
        }
    }
    protected override void Initialize()
    {
        LoadRewardAd();
    }

    public void LoadRewardAd()
    {
        if (IsReady)
        {
            Debug.Log("Reward ad is already loaded.");
            return;
        }

        // Clean up the old ad before loading a new one.
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }

        var adRequest = new AdRequest();

        RewardedAd.Load(UnitID, adRequest,
            (RewardedAd ad, LoadAdError error) =>
            {
                if (error != null || ad == null)
                {
                    Debug.LogError("rewarded ad failed to load an ad " +
                        error?.ToString());
                    return;
                }

                rewardedAd = ad;
                RegisterEventHandlers(rewardedAd);
            });
    }

    public void ShowRewardAd(Action<Reward> onReward)
    {
        if (IsReady)
        {
            rewardedAd.Show((Reward reward) =>
            {
                Debug.Log("Reward ad completed successfully.");
                onReward?.Invoke(reward);
            });
        }
        else
        {
            Debug.Log("Reward ad is not ready yet.");
            onReward?.Invoke(null);
        }
    }

    private void RegisterEventHandlers(RewardedAd ad)
    {
        // Raised when the ad is estimated to have earned money.
        ad.OnAdPaid += (AdValue adValue) =>
        {
            Debug.Log(String.Format("Rewarded ad paid {0} {1}.",
                adValue.Value,
                adValue.CurrencyCode));
        };
        // Raised when an impression is recorded for an ad.
        ad.OnAdImpressionRecorded += () =>
        {
            Debug.Log("Rewarded ad recorded an impression.");
        };
        // Raised when a click is recorded for an ad.
        ad.OnAdClicked += () =>
        {
            Debug.Log("Rewarded ad was clicked.");
        };
        // Raised when an ad opened full screen content.
        ad.OnAdFullScreenContentOpened += () =>
        {
            Debug.Log("Rewarded ad full screen content opened.");
        };
        // Raised when the ad closed full screen content.
        ad.OnAdFullScreenContentClosed += () =>
        {
            Debug.Log("Rewarded ad full screen content closed.");
            LoadRewardAd();
        };
        // Raised when the ad failed to open full screen content.
        ad.OnAdFullScreenContentFailed += (AdError error) =>
        {
            Debug.LogError("Rewarded ad failed to open full screen content " +
                           "with error : " + error);
            LoadRewardAd();
        };
    }
}

ポイントになる点としては広告再生後にRewardという戻り値を受け取っている点です。これは広告作成時になんのための広告かを判別するためです。リワード広告を実装すると下記のような設定を行います。この時RewardのTypeとAmountがそれぞれ報酬の数と報酬アイテムに割り当てられます。

スライム

デフォルトがRewardになっていますが、謎解きの解答で利用するならAnswerにしたり、無料ゲームの報酬アップならPrizeUpなどわかりやすい名前つけたりするといいですね

テスト用スクリプト

リワード広告もテストして動かして見ましょう。インタースティシャルと同じような構成ですね。

using UnityEngine;
using UnityEngine.UI;

public class TestReward : MonoBehaviour
{
    public Button showRewardButton;

    public AdmobUnitReward admobUnitReward;

    private void Start()
    {
        showRewardButton.interactable = false;

        showRewardButton.onClick.AddListener(() =>
        {
            admobUnitReward.ShowRewardAd((reward) =>
            {
                if (reward != null)
                {
                    Debug.Log("Reward type: " + reward.Type);
                    Debug.Log("Reward received: " + reward.Amount);
                }
            });
            showRewardButton.interactable = false;
        });
    }

    private void Update()
    {
        showRewardButton.interactable = admobUnitReward.IsReady;
    }
}

ShowRewardAdを呼び出したところが注目ポイントです。if文でrewardをnullチェックしているところで報酬を渡してあげる処理を実装して下さい。TypeとAmountでなんの報酬にするか決めて下さいね。

テストを行う手順

基本的にはインタースティシャルのときと同じ。

  • AdmobUnitRewardをセット
    • 空のGameObjectを作成(name:AdmobUnitReward)
    • AdmobUnitRewardコンポーネントをセット
    • 広告IDをセット(ここは最終的には自身の広告IDをセットして下さい)
      • Android:ca-app-pub-3940256099942544/5224354917
      • iOS:ca-app-pub-3940256099942544/1712485313
  • シーン内のセットアップ
    • リワード広告用のボタンを作成
  • TestRewardをセット
    • 空のゲームオブジェクトを作成(name:TestReward)
    • TestRewardコンポーネントをセット
    • インスペクターのセット
      • Show Reward Button:リワード広告用のボタン
      • Admob Unit Reward:上記で作成したAdmobUnitRewardコンポーネントをくっつけたゲームオブジェクト
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメント一覧 (1件)

  • 本当にありがとうございます!
    こちらの記事参考にさせていただきました!
    めっっちゃ助かります

コメントする

目次