【Unity】広告の導入方法

# 導入方法

Unityの`Services`の部分を有効にしたら、自動で、「Package Manager」の「Advertisement」が有効になる。

アセットストアからのインポートは行わない。

Servicesの部分を設定する。

`Advanced`のチェックボックスは外す！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/3f557976-4b8c-8490-b445-5a4698ee3414.png)

## パッケージのアップデート
Package Managerから、`Advertisement`を開いて、アップデートする。

## 初期化
一番初めのシーンで初期化を行います。
そのために、ゲームオブジェクトをはじめのシーンに用意して、そこで、下記のスクリプトを読み込みます。

```cs:広告初期化用スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Advertisements;

public class AdsControl : MonoBehaviour, IUnityAdsListener
{
    /// <summary>
    /// 広告再生スキップフラグ
    /// </summary>
    public static bool adsSkip = false;

    /// <summary>
    /// 広告再生終了フラグ
    /// </summary>
    public static bool adsEnd = false;

    private void Awake()
    {
        //DontDestroyOnLoad(this);
    }

    // Start is called before the first frame update
    void Start()
    {
        // ゲームIDをAndroidとiOSで分ける
#if UNITY_ANDROID
        string gameID = "XXXXXXX";
#else
        string gameID = "XXXXXXX";
#endif
        //広告の初期化
        Advertisement.Initialize(gameID, testMode: true);

        //広告関連のイベントが発生するように登録
        Advertisement.AddListener(this);

        Invoke("ShowMovieAd", 10f);
    }

    public static bool ShowMovieAd(string adsPlacement)
    {
        //広告全体の準備が出来ているかチェック
        if (!Advertisement.IsReady())
        {
            Debug.LogWarning("動画広告の準備が出来ていません");
            return false;
        }

        //表示したい広告の準備が出来ているかチェック
        var state = Advertisement.GetPlacementState(adsPlacement);
        if (state != PlacementState.Ready)
        {
            Debug.LogWarning($"{adsPlacement}の準備が出来ていません。現在の状態 : {state}");
            return false;
        }

        // フラグ初期化
        adsSkip = false;
        adsEnd = false;

        //広告表示
        Advertisement.Show(adsPlacement);
        return true;
    }

    //=================================================================================
    //イベント
    //=================================================================================

    //広告の準備完了
    public void OnUnityAdsReady(string placementId)
    {
        Debug.Log($"{placementId}の準備が完了");
    }

    //広告でエラーが発生
    public void OnUnityAdsDidError(string message)
    {
        Debug.Log($"広告でエラー発生 : {message}");
        adsEnd = true;
    }

    //広告開始
    public void OnUnityAdsDidStart(string placementId)
    {
        Debug.Log($"{placementId}の広告が開始");
    }

    //広告の表示終了
    public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
    {
        Debug.Log($"{placementId}の表示終了");
        adsEnd = true;
        switch (showResult)
        {
            //最後まで視聴完了(リワード広告ならここでリワード付与する感じ)
            case ShowResult.Finished:
                Debug.Log("広告の表示成功");
                break;
            //スキップされた
            case ShowResult.Skipped:
                Debug.Log("広告スキップ");
                adsSkip = true;
                break;
            //表示自体が失敗した
            case ShowResult.Failed:
                Debug.LogWarning("広告の表示失敗");
                break;
        }
    }
}
```

## 


## 他のシーンからの呼び出し


別のシーンでAdsの初期化を実行していて・・・
その後、オブジェクトは破棄されている場合でも、スクリプトは実行されているので、Advertisementクラスを呼び出すことができる。

# 参考URL
https://kan-kikuchi.hatenablog.com/entry/Unity_Monetization_SDK