【Unity】UnityAdsで広告表示, 広告を一定周期で再表示

ゲームやリワード内容にもよりますが、リワード広告は表示する周期によってリテンション率が変わると言われてます。

![スクリーンショット 2018-05-24 01.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/237014/4e77bc35-06c8-3f41-33e5-8689d5e6d46c.png)

そこで以下のような機能を実装する方法を紹介します。
・ボタンを押したら広告が表示される
・見終わると広告ボタンが非表示になる
・一定時間が経つと再度ボタンが表示する


#Script
```C#:UnityAdsCtr.cs
using UnityEngine;
using UnityEngine.Advertisements;
using UnityEngine.Events;
using System;

/// <summary>
/// 広告表示とButton再表示を制御する
/// 常にActiveなGameObjectにアタッチして使用する
/// </summary>
public class UnityAdsCtr : MonoBehaviour
{
    //表示周期(編集可能)
    [SerializeField] int DisplaySpan = 10;
    TimeSpan lastTime;
    TimeSpan NowTime;
    //表示ボタン
    [SerializeField] GameObject AdsButton;
    //リワード処理
    public UnityEvent _UnityEvent;

    /// <summary>
    /// リワード広告を表示する
    /// Buttonイベントに登録するなどして実行する
    /// </summary>
    public void ShowRewardedAd()
    {
        if (_UnityEvent == null)
        {
            return;
        }
        if (Advertisement.IsReady("rewardedVideo"))
        {
            var options = new ShowOptions { resultCallback = HandleShowResult };
            Advertisement.Show("rewardedVideo", options);
        }
    }

    /// <summary>
    /// 広告を全て見るとリワード報酬を獲得する
    /// </summary>
    /// <param name="result">Result.</param>
    private void HandleShowResult(ShowResult result)
    {
        switch (result)
        {
            case ShowResult.Finished:
                Debug.Log("The ad was successfully shown.");
                _UnityEvent.Invoke();
                AdsButton.SetActive(false);
                lastTime = DateTime.UtcNow.TimeOfDay;
                break;
            case ShowResult.Skipped:
                Debug.Log("The ad was skipped before reaching the end.");
                break;
            case ShowResult.Failed:
                Debug.LogError("The ad failed to be shown.");
                break;
        }
    }

    private void Update()
    {
        DisplayCheck();
    }

    /// <summary>
    /// 表示周期が過ぎたらButtonを表示
    /// </summary>
    void DisplayCheck()
    {
        //Activeな時は処理を行わない
        if (AdsButton.activeSelf)
        {
            return;
        }
        NowTime = DateTime.UtcNow.TimeOfDay;
        var span = NowTime - lastTime;
        //Debug.Log("span.TotalMinutes " + span.TotalMinutes);
        if (span.TotalMinutes > DisplaySpan)
        {
            AdsButton.SetActive(true);
        }
    }

    public void Test()
    {
        Debug.Log("Invoke");
    }
}
```

#概要
◆UnityAdsの準備：
こちらを参照。非常に簡単です。
https://unity3d.com/jp/services/ads/quick-start-guide

◆実装例の概要：
・時間経過で宝箱が空く機能があるとします。
・広告を見ると時短できるとします。

◆画面の表示：左上に広告ボタンがあります
<img width="617" alt="スクリーンショット 2018-05-24 01.50.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/237014/ba461e21-2236-63cb-612b-ca7521fd6032.png">


◆Hierarcky：AdsSkipButtonが広告表示ボタンです
<img width="230" alt="スクリーンショット 2018-05-24 01.47.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/237014/819a0da2-1c6e-e4da-5825-fce43d488b91.png">

◆Inspector：
・SceneManagerなど常にActiveなGameObjectにアタッチします(AdsSkipButtonはNonactiveになるので適しません)
・DisplaySpanは分単位です。Scriptではデフォルトが10分で、スクショではテストのため1分にしてます。
・ButtonにEventを登録するように、リワード処理をUnityEventに登録します。スクショではテスト用のメソッドを登録してます。
<img width="368" alt="スクリーンショット 2018-05-24 01.47.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/237014/c1dd9969-894e-81ed-9d1a-b04c842cef86.png">

◆処理結果：
広告視聴後、時間が経過するとボタンが再表示されます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">広告を表示したら広告ボタンが非表示になり、一定時間（動画ではテストのため1分）が経過したらボタンが再表示される機能を実装。 <a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://t.co/axjNWVa351">pic.twitter.com/axjNWVa351</a></p>&mdash; アズマゴロ―@ReRotation/カードゲームRPG (@azumagoro) <a href="https://twitter.com/azumagoro/status/999336585651937281?ref_src=twsrc%5Etfw">2018年5月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#参考
https://www.slideshare.net/UnityTechnologiesJapan/unite-2017-tokyounity-adsanalyticsiap


#宣伝
ポケモン＋DCGみたいなゲーム作ってます
![TwitterHeader.png](https://qiita-image-store.s3.amazonaws.com/0/237014/705c3792-215c-d163-9f2a-7907769e2871.png)

https://rerotation.wixsite.com/rerotation