(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



モバイルアプリに簡単に(インタースティシャル, リワード, バナー)広告を実装できるMonetization SDK(旧Unity Ads)の使い方【Unity】【Unity Services】【Unite Tokyo 2019】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2019.2.15f1
Monetization SDK(Advertisement) 3.4.1


はじめに

今回は『Unite Tokyo 2019』の講演の動画を見て勉強しつつ、

ついでに記事にまとめちゃおうという感じのやつです。


そして、題材にする講演は、

Unity Monetization SDKでできることと使い方です!

Unity Ads SDKはバージョン3.xから「Unity Monetization SDK」に名称が変更となり、アプリのマネタイゼーションに効果的な機能が追加されました!

このセッションでは、Unity Monetization SDKを使ってできることと、その使い方について解説します。

出演:
鎌田 泰行(ユニティ・テクノロジーズ・ジャパン合同会社 フィールドエンジニア)





Unity Monetization SDKとは

そもそもUnity Monetization SDKとはなんぞやという話からですが、

ざっくり言えばUnity Ads SDKの新しい名称(Ver3.0から)です。

f:id:kan_kikuchi:20191213044552j:plain


そしてそのUnity Adsとは、名前の通り広告を出してアプリの収益化をするためのサービスで、

現在はAndroidとiOSに対応しています。


ちなみに以前本ブログでも紹介記事を書いていたりします。

ただし古い記事なので、情報も色々古いです。





使うための準備

まずはUnity Monetization SDKを使うための準備からです。


導入

Unity Monetization SDKの導入はお馴染みPackage Managerからです。

f:id:kan_kikuchi:20191213074420j:plain


ただし、現状は表記がUnity Monetization SDKではなく、

AdsとかAdvertisementとか統一されていない点には注意が必要です。

f:id:kan_kikuchi:20191227042419j:plain


一応アセットストアにもありますが、Package Managerから導入した方が楽かと思います。


Unity Monetization - Asset Store


内蔵されているSDKの無効化


上記の2通りだけでなく、Unity Adsはエディタに内蔵されているため、

エディタ右上にある雲のボタンから開けるUnity Servicesウィンドウからも有効に出来ます。


ただしこの場合は、Adsだけアップデートする事が出来ず

Unity自体をアップデートする必要がでてくるため、使い勝手がよくありません。

f:id:kan_kikuchi:20191213075216j:plain


なので、基本的に内蔵のは使わないように無効化しておいた方が得策です。

ちなみに先程のウィンドウで一旦Adsを有効にした後、

AdvancedのEnable Builtpin Ads Extensionのチェックを外すと無効にできます。

f:id:kan_kikuchi:20191213080436j:plain



実装

ここからはUnity Monetization SDKを使った実装方法の解説です。


SDKの初期化

まずはSDKの初期化を行います。

こうする事で広告をダウンロードし、キャッシュする事でいつでも表示できるようになります。

f:id:kan_kikuchi:20191213090124j:plain


実際のコードは以下のような感じで、ゲームIDを渡してAdvertisement.Initializeを実行するだけです。

なお、講演ではMonetization.InitializeのようにMonetizationが使われていましたが、

既にDeprecated(非推奨)になっているようだったので、Advertisementを使っています。

using UnityEngine;
using UnityEngine.Advertisements;//Advertisementクラスを使うのに必要

public class NewBehaviourScript : MonoBehaviour{
    
  private void Start() {
    //ゲームIDをAndroidとそれ以外(iOS)で分ける
    #if UNITY_ANDROID
    string gameID = "3395904";
    #else
    string gameID = "3395905";
    #endif
    
    //広告の初期化
    Advertisement.Initialize(gameID);
  }

  private void Update() {
    //広告が使えるようになったかの確認
    Debug.Log(Advertisement.IsReady());
  }

}
f:id:kan_kikuchi:20191213101908j:plain


ちなみにゲームIDとはゲームやプラットフォームごとに違うAdsのIDの事で、

ServicesのウィンドウでAdsを有効にするだけで生成されます。


また、確認したい場合はGo to Dashboardから行けるページの

f:id:kan_kikuchi:20191213102246j:plain


OperateにあるProject SettingsのGame IDsを見ます。

f:id:kan_kikuchi:20191213102251j:plain


ちなみに初期化時に

2つ目の引数をtrueにするとテストモード(ダミーの広告が流れる)にする事も出来ます。

//テストモードで初期化
Advertisement.Initialize(gameID, testMode:true);


このテストモードは先程ゲームIDを確認したOperateのちょっと下にある

Test modeから強制的にOnにしたりOffしたりする事も可能です。(プログラムの第2引数は無視される)

f:id:kan_kikuchi:20191213103134j:plain



動画広告の表示

次に動画広告の表示ですが、なんとPlacement IDを渡してAdvertisement.showを実行するだけ

なお、これまた講演ではMonetizationが使われていましたが、

現在はDeprecatedなので、Advertisementを使っています。

//動画広告の表示("video"がPlacement ID)
Advertisement.Show("video");


ちなみにPlacement IDの確認や追加もOperateから行えます。

なお、デフォルトでvideoとrewardedVideoが設定されているようです。

f:id:kan_kikuchi:20191213185826j:plain


なお、IsReady(isInitializedではなく)がtrueになっていなければ表示出来ませんし、

f:id:kan_kikuchi:20191213103932j:plain


表示したい広告自体の準備が出来ている必要もあるので、以下のような確認をいれた方が良いです。

//動画広告のPlacementID
private static readonly string VIDEO_PLACEMENT_ID = "video";

/// <summary>
/// 動画広告の表示
/// </summary>
public void ShowMovieAd() {
  //広告全体の準備が出来ているかチェック
  if (!Advertisement.IsReady()) {
    Debug.LogWarning("動画広告の準備が出来ていません");
    return;
  }

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



動画広告の再生後の判定

リワード広告を実装したい場合、動画が正常に再生されたかを判定する必要があります。

そんな時は以下のような感じでIUnityAdsListenerを実装します。(動画再生部分は上記と変わらず)

using UnityEngine;
using UnityEngine.Advertisements;//Advertisementクラスを使うのに必要

public class NewBehaviourScript : MonoBehaviour, IUnityAdsListener{ //IUnityAdsListenerを実装

  //=================================================================================
  //初期化
  //=================================================================================
    
  private void Start() {
    //ゲームIDをAndroidとそれ以外(iOS)で分ける
    #if UNITY_ANDROID
    string gameID = "3395904";
    #else
    string gameID = "3395905";
    #endif
    
    //広告の初期化
    Advertisement.Initialize(gameID);

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

  //=================================================================================
  //イベント
  //=================================================================================
  
  //広告の準備完了
  public void OnUnityAdsReady (string placementId) {
    Debug.Log($"{placementId}の準備が完了");
  }
 
  //広告でエラーが発生
  public void OnUnityAdsDidError (string message) {
    Debug.Log($"広告でエラー発生 : {message}");
  }
 
  //広告開始
  public void OnUnityAdsDidStart (string placementId) {
    Debug.Log($"{placementId}の広告が開始");
  }
  
  //広告の表示終了
  public void OnUnityAdsDidFinish (string placementId, ShowResult showResult) {
    Debug.Log($"{placementId}の表示終了");
    switch (showResult){
      //最後まで視聴完了(リワード広告ならここでリワード付与する感じ)
      case ShowResult.Finished:
        Debug.Log("広告の表示成功");
        break;
      //スキップされた
      case ShowResult.Skipped:
        Debug.Log("広告スキップ");
        break;
      //表示自体が失敗した
      case ShowResult.Failed:
        Debug.LogWarning("広告の表示失敗");
        break;
    }
  }

}


すると、広告が最後まで見られた、スキップされた、表示が失敗した、のどれか分かるようになり、

さらに広告の準備が完了したタイミング、開始されたタイミングも分かるようになります。

f:id:kan_kikuchi:20191227045549g:plain



バナー広告の表示

Monetization SDKはバナー広告の表示も可能です。

ただし、動画広告とは違い、実装前にOperateからバナー広告用のPlacement IDの追加が必要です。


追加はAdd Placementボタンを押し、

f:id:kan_kikuchi:20191227050038j:plain


任意のIDを入力後、Bannerを選択し、Create placementを押すだけ。

f:id:kan_kikuchi:20191227050049j:plain


すると一覧に新たにバナーのIDが追加されています。

f:id:kan_kikuchi:20191227050059j:plain


実装は動画広告と同様に初期化を行った後、

Advertisement.Bannerを使って表示場所の設定(SetPosition)や表示(Show)、非表示(Hide)を行います。

//動画広告のPlacementID
private static readonly string BANNER_PLACEMENT_ID = "Banner";
  
/// <summary>
/// バナー広告の表示
/// </summary>
public void ShowBannerAd() {
  //広告全体の準備が出来ているかチェック
  if (!Advertisement.IsReady()) {
    Debug.LogWarning("広告全体の準備が出来ていません");
    return;
  }

  //表示したい広告の準備が出来ているかチェック
  var state = Advertisement.GetPlacementState(BANNER_PLACEMENT_ID);
  if (state != PlacementState.Ready) {
    Debug.LogWarning($"{BANNER_PLACEMENT_ID}の準備が出来ていません。現在の状態 : {state}");
    return;;
  }
    
  //バナー広告の表示場所の設定
  Advertisement.Banner.SetPosition(BannerPosition.BOTTOM_CENTER);
    
  //バナー広告の表示
  Advertisement.Banner.Show(BANNER_PLACEMENT_ID);
}

/// <summary>
/// バナー広告の非表示
/// </summary>
public void HideBannerAd() {
  Advertisement.Banner.Hide();
}
f:id:kan_kikuchi:20191230042142g:plain



課金アイテムを広告枠で宣伝

Monetization SDKにはIAP Promoという

アプリ内でそのアプリ自身の課金アイテムを宣伝することが出来る機能も用意されています。

f:id:kan_kikuchi:20191230042343j:plain


IAP Promoについての詳細は講演でも省かれていたので、

代わりに公式のマニュアル、紹介記事、ワークショップの情報を載せておきます。







必要な広告のみをロードし、通信量を減らす

今までの実装の仕方だと、全ての広告を起動時にロードしているので、その分通信が発生しています。

特に動画広告は他より重いので、場合によっては必要な時だけロードしたいという事もあります。

そんな時のためにMonetization SDKにはLoad APIというものが用意されています。

f:id:kan_kikuchi:20191230044746j:plain


使い方は簡単で初期化に使用する

Initializeの第三引数(enablePerPlacementLoad)をtrueにするだけ。

//広告の初期化(広告のロードはまだしない)
Advertisement.Initialize(gameID, testMode:false, enablePerPlacementLoad:true);


これで初期化時に広告のロードがされなくなるので、

あとは必要な時にAdvertisement.Loadを実行して、広告をロードするだけ。

//動画広告のPlacementID
private static readonly string VIDEO_PLACEMENT_ID = "video";

/// <summary>
/// 動画広告をロードする
/// </summary>
public void LoadMovieAD() {
  //広告全体の準備が出来ているかチェック
  if (!Advertisement.IsReady()) {
    Debug.LogWarning("広告全体の準備が出来ていません");
    return;
  }

  //動画広告をロード
  Advertisement.Load(VIDEO_PLACEMENT_ID);
}


ただし、広告を表示する度にロードが必要になる点には注意が必要かもしれません。

f:id:kan_kikuchi:20191230045628g:plain



おわりに

サービス開始時は凄く簡単に使えた印象だったのですが、

今は内蔵されているものに加えてPackage ManagerやUnity Asset Storeにもあったり、

名前を変えてしまった上に、その名前の表記が統一されていなかったり、

実装方法も色々あったりと、機能の追加や更新を重ねる事で使い難くなってしまったようです。


それでも、広告の中では使いやすい方だとは思いますし、

なによりUnityエディタ上で動作を確認出来る利点があるので、

アプリ開発初心者の方にも十分にオススメ出来ると思います。