【Unity】Unityのダッシュボードのレイアウト変わってたから実装手順は俺が書く

## Unityダッシュボードのレイアウト変わっててUnityAdsの導入手順が分からない
掲題の通りだ。金が欲しいのでUnityでゲーム作って広告入れようと思ったら、ダッシュボードのレイアウトが大きく変わったため既存の導入手順系の記事通りに行かなくなってしまった。
「いや公式リファレンス読めばわかるじゃんwww」という方は帰ってどうぞ。君らはターゲットじゃない。
同じことで悩んでいる初学者のみんな、頑張りましょう。公式リファレンスは俺が代わりに読んどくよ。

## 内容
- 一応、公式リファレンスがどこから見られるか書いとくよ　　
以下を参考にしてね※Unity用のページの開き方だよ  
![ダッシュボードのスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/22b65995-5a16-a4bc-3b53-d1f19807bd53.png)
![ダッシュボードのスクショ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/2be5ef61-c7bb-2d5a-b6a0-96ce92cbbe03.png)
  
これで<a href = "https://unityads.unity3d.com/help/unity/integration-guide-unity?_ga=2.33843236.464581283.1634041148-108134839.1572526592">**Integration guide for Unity**</a>ってページが開くよ。  

ダッシュボード画面のガイドは<a href = "https://unityads.unity3d.com/help/resources/dashboard-guide#project-settings">こっち</a>

あとはこのリファレンス通りに作業するだけだから、英語強い人は上のサイト見てね。  

### 準備するよ  

- ビルドターゲットを変更
ここではAndroidにするよ。UnityEditor左上の[File]>[Build Settings]を押すよ  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/531409db-0a8b-9646-9fca-f61373e2c58a.png)  
右下に[Switch Platform]ってボタンが出るはずなので、それを押すよ  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/b82af8bb-fad6-d2a3-e78d-f9c50f42d6c8.png)  

- UnityAdsをインストールするよ
UnityEditor左上の[Window]>[PackageManager]を押してね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/a97e73fa-4a94-90f4-2c27-faad7a73f1a5.png)  

- AdvertisementをImportするよ
こんな感じの画面が出るから、Advertisementを探してね。右下（この画像だと[Up to date]ボタンの位置）に[Install]ってボタンがあるから押してね。なんか[Import]みたいな画面でるはずだから、色々先に進みそうなボタン押してね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/9f102f69-cb54-9f7a-ab26-30c59984348a.png)

- ダッシュボードで広告の設定するよ
ここ押すよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/6ceedd0c-332e-f57a-ff10-6d1e276c1704.png)
  
最初どんな画面が出るか忘れちゃった。何かしらやって、以下の画面になったら[Add Ad Unit]を押してね  
![ダッシュボードのスクショ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/cab9c1d5-ea94-bc3c-6f3d-626ee64cdd78.png)    

こんな画面になるから、適宜情報を入力しよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/97d010b9-8c21-5c6c-087a-317abcef6dc9.png)
- [Rewarded]はスキップできない広告で、見終わるとプレイヤーにゲーム内通貨とかの報酬を与えられるやつ。漫画アプリとかで広告みたら一話読めたりするよね。
- [Interstitial]は一定秒数経過で広告をスキップできる。基本的にはこっち選んどこうね。面倒くさいからね。

こんなんでるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/3afcb8ea-fa63-27db-61bb-2d2c27db8adc.png)  
[+Advanced Settings]で表示する広告について音出すかとか、何秒で飛ばせるかとか決められるみたい。決定ボタンみたいなのはないから、設定終わったら[←]を押してひとつ前の画面に戻る
![ダッシュボードのスクショ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/f2c67ec6-5c1c-8db0-d568-9a0c4d69179a.png)  
そしたら一番下にこんな感じで今作った広告の設定？が表示されるはず
![ダッシュボードのスクショ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/89eeb5aa-db8a-a5ea-9c29-c242dfba1ff8.png)
もっと詳しく設定したい人は<a href = "https://unityads.unity3d.com/help/monetization/ad-units-management">こっち</a>
  
### 組み込んでいくよ
じゃあそろそろゲームの方に組み込んでいこう。  
まずGameIDを調べよう。ダッシュボード上で、さっき開いてたAd Unitsのページをもう一回開いてね。
ここにApple用のGameIDとAndroid用のGameID載ってるから、控えといてね。  
![ダッシュボードのスクショ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/0c83c950-84cc-befe-1446-40db1568b122.png)  
  
したらScene内に空のGameObject置くか、ゲーム開始時点～ゲーム中も存在するObjectに以下の内容のScriptをアタッチしてあげてね。
※リファレンスからの丸ごとコピーだから、もし権利者に怒られたら消すよ

```
using UnityEngine;
using UnityEngine.Advertisements;

public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener
{
    [SerializeField] string _androidGameId;
    [SerializeField] string _iOsGameId;
    [SerializeField] bool _testMode = true;
    [SerializeField] bool _enablePerPlacementMode = true;
    private string _gameId;

    void Awake()
    {
        InitializeAds();
    }

    public void InitializeAds()
    {
        _gameId = (Application.platform == RuntimePlatform.IPhonePlayer)
            ? _iOsGameId
            : _androidGameId;
        Advertisement.Initialize(_gameId, _testMode, _enablePerPlacementMode, this);
    }

    public void OnInitializationComplete()
    {
        Debug.Log("Unity Ads initialization complete.");
    }

    public void OnInitializationFailed(UnityAdsInitializationError error, string message)
    {
        Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
    }
}
```

InspectorからAndroid Game Id, iOsGameIdのとこに、さっき控えたandroidのGameIDとiOSのGameIDを入力しよう  
![エディタのスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/0bcf9012-88b5-230e-8c91-8407a8111418.png)

ここまでで広告表示のためのSDK初期化ができたよ。あと少し！
さっきのスクリプトと同じGameObjectに以下のScriptをアタッチしてあげてね。

```
using UnityEngine;
using UnityEngine.Advertisements;

public class InterstitialAdExample : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
    [SerializeField] string _androidAdUnitId = "Interstitial_Android";
    [SerializeField] string _iOsAdUnitId = "Interstitial_iOS";
    string _adUnitId;

    void Awake()
    {
        // Get the Ad Unit ID for the current platform:
        _adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
            ? _iOsAdUnitId
            : _androidAdUnitId;
    }

    // Load content to the Ad Unit:
    public void LoadAd()
    {
        // IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
        Debug.Log("Loading Ad: " + _adUnitId);
        Advertisement.Load(_adUnitId, this);
    }

    // Show the loaded content in the Ad Unit: 
    public void ShowAd()
    {
        // Note that if the ad content wasn't previously loaded, this method will fail
        Debug.Log("Showing Ad: " + _adUnitId);
        Advertisement.Show(_adUnitId, this);
    }

    // Implement Load Listener and Show Listener interface methods:  
    public void OnUnityAdsAdLoaded(string adUnitId)
    {
        // Optionally execute code if the Ad Unit successfully loads content.
    }

    public void OnUnityAdsFailedToLoad(string adUnitId, UnityAdsLoadError error, string message)
    {
        Debug.Log($"Error loading Ad Unit: {adUnitId} - {error.ToString()} - {message}");
        // Optionally execite code if the Ad Unit fails to load, such as attempting to try again.
    }

    public void OnUnityAdsShowFailure(string adUnitId, UnityAdsShowError error, string message)
    {
        Debug.Log($"Error showing Ad Unit {adUnitId}: {error.ToString()} - {message}");
        // Optionally execite code if the Ad Unit fails to show, such as loading another ad.
    }

    public void OnUnityAdsShowStart(string adUnitId) { }
    public void OnUnityAdsShowClick(string adUnitId) { }
    public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState) { }

    public void OnGUI()
    {
        if (GUILayout.Button("LoadAndShowAd"))
        {
            LoadAd();
            ShowAd();
        }
    }
}
```

これでゲームを再生してみてね。画面上方に以下みたいな感じで[LoadAndShowAd]ってボタンが出てくるから、これを押してみてね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/75ed424a-e112-7c47-4c8f-8631494e2bc9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/f28e96b5-5f43-aa7a-e1c8-3e52bfb56e3b.png)
  
広告が表示されると思う。されなかった？困っちゃうね。（投げやり）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/b204567d-021a-5b88-42b3-3ea2509d1641.png)

たぶんね、Inspector上でInterstitialAdExampleのAndroid Ad Unit Idを、さっき作った広告設定のIDに書き換えるとそれを表示するようにできるんですよ。  
でもね、上述の手順だけだとその作成した広告設定の情報が穴だらけで使えないみたい。だからそこは自分で調べてみてね。
僕も調べるから、また進捗あれば更新するよ。

## 以上
想像以上に雑な内容でビビったかな？ごめんね、でも英語分からなくても広告が出せるとこまではたぶんいったよね？それで許してね。
今後も僕自身が「これ調べても出てこねーじゃんかよォ！！！！」て激怒することがあれば、こんな感じでHowTo記事にしようと思うよ。じゃあの。

## 追記
- このままビルドするとテスト広告が表示されてしまうよ  
  作ってる最中の確認はテスト広告でいいけど、ストアで売り出すときはこのままだとUnityAdsのテスト広告が流れちゃうよ。  
  スクリプト上でいじってもいいけど、手っ取り早いのはInspector上で`AdsInitializer`の`TestMode`のチェックボックスを外すことだよ。  
![テスト広告のチェックを外す.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256111/bd9793a6-1105-605e-f1c0-f61a4b5d4c24.png)  
  金を稼ぐ下準備はできたね！そろそろゲーム作ろうか。