この記事でのバージョン
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から)です。
そしてそのUnity Adsとは、名前の通り広告を出してアプリの収益化をするためのサービスで、
現在はAndroidとiOSに対応しています。
ちなみに以前本ブログでも紹介記事を書いていたりします。
ただし古い記事なので、情報も色々古いです。
使うための準備
まずはUnity Monetization SDKを使うための準備からです。
導入
Unity Monetization SDKの導入はお馴染みPackage Managerからです。
ただし、現状は表記がUnity Monetization SDKではなく、
AdsとかAdvertisementとか統一されていない点には注意が必要です。
一応アセットストアにもありますが、Package Managerから導入した方が楽かと思います。
内蔵されているSDKの無効化
上記の2通りだけでなく、Unity Adsはエディタに内蔵されているため、
エディタ右上にある雲のボタンから開けるUnity Servicesウィンドウからも有効に出来ます。
ただしこの場合は、Adsだけアップデートする事が出来ず、
Unity自体をアップデートする必要がでてくるため、使い勝手がよくありません。
なので、基本的に内蔵のは使わないように無効化しておいた方が得策です。
ちなみに先程のウィンドウで一旦Adsを有効にした後、
AdvancedのEnable Builtpin Ads Extensionのチェックを外すと無効にできます。
実装
ここからはUnity Monetization SDKを使った実装方法の解説です。
SDKの初期化
まずはSDKの初期化を行います。
こうする事で広告をダウンロードし、キャッシュする事でいつでも表示できるようになります。
実際のコードは以下のような感じで、ゲーム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()); } }
ちなみにゲームIDとはゲームやプラットフォームごとに違うAdsのIDの事で、
ServicesのウィンドウでAdsを有効にするだけで生成されます。
また、確認したい場合はGo to Dashboardから行けるページの
OperateにあるProject SettingsのGame IDsを見ます。
ちなみに初期化時に
2つ目の引数をtrueにするとテストモード(ダミーの広告が流れる)にする事も出来ます。
//テストモードで初期化 Advertisement.Initialize(gameID, testMode:true);
このテストモードは先程ゲームIDを確認したOperateのちょっと下にある
Test modeから強制的にOnにしたりOffしたりする事も可能です。(プログラムの第2引数は無視される)
動画広告の表示
次に動画広告の表示ですが、なんとPlacement IDを渡してAdvertisement.showを実行するだけ。
なお、これまた講演ではMonetizationが使われていましたが、
現在はDeprecatedなので、Advertisementを使っています。
//動画広告の表示("video"がPlacement ID) Advertisement.Show("video");
ちなみにPlacement IDの確認や追加もOperateから行えます。
なお、デフォルトでvideoとrewardedVideoが設定されているようです。
なお、IsReady(isInitializedではなく)がtrueになっていなければ表示出来ませんし、
表示したい広告自体の準備が出来ている必要もあるので、以下のような確認をいれた方が良いです。
//動画広告の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; } } }
すると、広告が最後まで見られた、スキップされた、表示が失敗した、のどれか分かるようになり、
さらに広告の準備が完了したタイミング、開始されたタイミングも分かるようになります。
バナー広告の表示
Monetization SDKはバナー広告の表示も可能です。
ただし、動画広告とは違い、実装前にOperateからバナー広告用のPlacement IDの追加が必要です。
追加はAdd Placementボタンを押し、
任意のIDを入力後、Bannerを選択し、Create placementを押すだけ。
すると一覧に新たにバナーのIDが追加されています。
実装は動画広告と同様に初期化を行った後、
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(); }
課金アイテムを広告枠で宣伝
Monetization SDKにはIAP Promoという
アプリ内でそのアプリ自身の課金アイテムを宣伝することが出来る機能も用意されています。
IAP Promoについての詳細は講演でも省かれていたので、
代わりに公式のマニュアル、紹介記事、ワークショップの情報を載せておきます。
必要な広告のみをロードし、通信量を減らす
今までの実装の仕方だと、全ての広告を起動時にロードしているので、その分通信が発生しています。
特に動画広告は他より重いので、場合によっては必要な時だけロードしたいという事もあります。
そんな時のためにMonetization SDKにはLoad APIというものが用意されています。
使い方は簡単で初期化に使用する
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); }
ただし、広告を表示する度にロードが必要になる点には注意が必要かもしれません。
おわりに
サービス開始時は凄く簡単に使えた印象だったのですが、
今は内蔵されているものに加えてPackage ManagerやUnity Asset Storeにもあったり、
名前を変えてしまった上に、その名前の表記が統一されていなかったり、
実装方法も色々あったりと、機能の追加や更新を重ねる事で使い難くなってしまったようです。
それでも、広告の中では使いやすい方だとは思いますし、
なによりUnityエディタ上で動作を確認出来る利点があるので、
アプリ開発初心者の方にも十分にオススメ出来ると思います。