ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】UI開発 おまけ

前回の記事に入り切らなかったやつです。

Image

Raycast Target

タッチ制御が無いなら、無駄に計算処理が走るだけなので外しておくと良いです。

Cull Transparent Mesh

チェックを入れるとα値が0なら頂点データを転送しなくなります。

Animator

複雑なアニメーションを設定する時は Animator を使って制御するのが楽ですが、こちらにも書かれているように、常にCanvasを更新するので、Animatorは一時的なUI演出などに使うのが良いです。

Shader

左右や上下に揺れるなど周期性のある動きはシェーダで表現するのも手です。GPUで処理するためCanvasの更新も走らないです。

こういう表現とか面白いですよね。 baba-s.hatenablog.com

【Unity】UI開発 Part 4 最適化編

UI開発、最後は最適化です。CanvasのBatch処理、Overdrawを例に上げた後、Profilerによる確認方法をまとめてます。

Canvas

全てのUIはCanvas配下になります。何も考えず大量にUIを配置するとパフォーマンスが低下します。

Batch処理

最も効果的なのはBatch処理です。これはザックリ言うとCPUがGPUに描画の命令を出す時に、必要な情報(Material, Texture)をまとめる事で命令数を減らしCPUの負荷を軽減するというものです。

という訳で、以下にBatch処理が有効になる条件・注意点をまとめました。

  1. 同じTextureを参照
    Textureを個別に参照するとBatch処理が効かないため、Atlas化して一つのTextureにまとめます。
    kan-kikuchi.hatenablog.com

  2. 同じMaterialを参照
    これもTextureと同様にまとめれるものは同じMaterialを参照するようにします。 UIのレイヤー表示に注意
    MaterialA, MaterialB を参照するImageを下図のように交互に重ねて表示する場合、Batch処理が効かなくなります。
    f:id:aki517:20210208073231p:plain
    この場合はMaterialをまとめるか、重ねない表示にするかです。
    f:id:aki517:20210208073225p:plain

  3. 同じCanvasに配置
    uGUIのBatch処理はCanvas単位で実行されます。前述でまとめたTexture,Materialが他のCanvasを跨がないようにする必要があります。
    Canvas単位の表示制御に注意
    UIをCanvas単位で表示・非表示する時はCanvasを無効にしてください。GameObject を無効化すると頂点データが破棄されてしまい、次回有効時に頂点バッファが再生成され Canvasの更新が発生するためです。

    Canvasの親子関係に注意
    ただし、Canvasに親子関係を設定している場合、子Canvasの無効化時に親Canvasの更新が走ります。

  4. 動かさない
    各UIを更新するとBatch処理が都度実行されます。これは中々に重たい処理でUI生成時などタイミングが限定的ならまだ良いですが毎フレーム走る場合はかなり問題になります。

    Canvas単位でBatch処理を実行するため、動かしていない他UIも含めて影響が出ます。

    Canvasを分割する
    とはいえ毎フレーム更新が必要なUIは絶対に出てきます。対処法の1つは更新用Canvasに分割します。
    こうすれば更新用CanvasのみBatch処理が走り、影響範囲を最小限に抑えれます。

    ただし、Canvasを分割し過ぎると今度はBatch処理の意味がなくなるので、負荷を計測して分割数を決める必要があります。
    Shaderで動かす
    もう1つの対処法は周期性(左右・上下振動)のある表現をシェーダで実装します。GPU側で処理するためCanvasのBatch処理が実行されないです。
    baba-s.hatenablog.com

Overdraw

半透明のUIを大量に重ねると余計な描画処理が発生するので、なるべく半透明UIを重ねないよう気をつける必要があります。Overdrawは下図のようにSceneビューで確認できます。明るい所ほどポリゴンが重なり負荷が高いです。

Profiler

最後にUnityのProfilerを使って先程の最適化が効いているのかを確認する方法です。
Window > Analysis > Profiler で開きます。

CPU Usage

Batch処理の発生回数・負荷を確認できます。下図の検索フォームに "Canvas.BuildBatch" と入力するれば簡単に確認できます。

UI/UI Details

Batch処理の実行回数と対象オブジェクトを確認できます。

Batch処理が失敗した原因をBatch Break Reasonで確認できます。

UISystemPreviewWindow

UI/UI Details の右下に表示されるウインドウです。Batch範囲とOverdrawの確認ができます。

composite overdraw を選択すると対象UIの overdraw を確認できます。

重なりに応じた色分けをします。

まとめ

Canvasを中心に最適化方法をまとめました。Batch処理・OverdrawはUIに限らず3Dでも注意すべき内容ですね。UnityのProfilerはとても優秀です。すぐに起動できて詳細情報も確認しやすいです。

普段からパフォーマンスを意識して開発をするのが大事ですね。終盤で対応するのは大変ですし・・^_^;

参考

Some of the best optimization tips for Unity UI - Unity
Unityでパフォーマンスの良いUIを作る為のTips

【Unity】UI開発 Part 3 Tween編

今回もUIです。UIアニメーションでよく使うTween関連です。

Tween

シンプルな動きはTween制御系Assetが便利です。有名な DOTween, LeanTween, iTweenの特徴とサンプルコードを貼ってます。

また、パフォーマンス比較はDOTween公式サイトにまとまってます。

ちなみに私はパフォーマンス重視なのでLeanTweenを使ってます。また、ゲーム仕様に依存する部分がある場合はこちらこちらを参考に自前のTween制御を書いてます。

DOTween

無料版はパッケージにコードが含まれてないです。(GitHubにアップはされている)有料版はTextMeshPro対応とEditor上でTweenの編集ができます。

// !!初回起動時に1回だけ呼ぶ必要あり.
DOTween.Init();

// 実行. 2秒で targetPos へ Linear補間で移動後、OnCompleteに通知.
Tweener twr = this.transform.DOMove( targetPos, 2.0f );
twr.SetEase( Ease.Linear );
twr.onComplete = OnComplete;

// 中断.
twr.Kill( complete:true );

// 一時停止.
twr.Pause();

// 再開.
twr.Play();

LeanTween

パフォーマンス重視のTweenです。コードは全て含まれてるのでカスタムしやすいです。

// !!初回起動時に1回だけ呼ぶ必要あり.
LeanTween.init();

// 実行. 2秒で targetPos へ Linear補間で移動後、OnCompleteに通知.
LTDescr dsc = this.transform.LeanMove( targetPos, 2.0f );
dsc.setEase( LeanTweenType.linear );
dsc.setOnComplete( OnComplete );

// 中断.
LeanTween.cancel( dsc.uniqueId, callOnComplete:true );

// 一時停止.
dsc.pause();

// 再開.
dsc.resume();

iTween

iTween.cs を入れるだけで導入が簡単です。

// 実行. 2秒で targetPos へ Linear補間で移動後、OnCompleteに通知.
var hash = iTween.Hash( "position", targetPos, 
                        "time", 2.0f, 
                        "easetype", iTween.EaseType.linear,
                        "oncomplete", "OnComplete" );
iTween.MoveTo( this.gameObject, hash );

// 中断.
iTween.Stop( this.gameObject );

// 一時停止.
iTween.Pause( this.gameObject, includechildren:true );

// 再開.
iTween.Resume( this.gameObject );

Time.timeScaleの影響

上記3つのTweenの時間制御は Time.deltaTime を参照しています。こちらの値は Time.timeScale の影響を受けます。そして、これは演出系のUIアニメーションで問題になる場合があります。

例えば以下のような格闘ゲームのKO演出です。キャラ・背景は一時停止してますが、"KO"のUIはアニメーションしてます。
f:id:aki517:20210119072630g:plain

ゲーム全体のアニメーションを停止であればTime.timeScaleの値を変更すれば良いですが、 このケースではUIアニメーションだけ影響を受けない設定が必要になります。

と言うわけで、各TweenのTime.timeScaleの影響を受けないサンプルコードです。

DOTween

twr.SetUpdate( UpdateType.Normal, isIndependentUpdate:true );

LeanTween

dsc.setIgnoreTimeScale( useUnScaledTime:true );

iTween

// "ignoretimescale" に true を設定する.
var hash = iTween.Hash( "position", targetPos, 
                        "time", 2.0f, 
                        "easetype", iTween.EaseType.linear,
                        "oncomplete", "OnComplete",
                        "ignoretimescale", true );  // ←ここ.

おまけ

Tweenとは関係ないですがParticleSystemで作られたUIエフェクトは Delta Time を Unscaled にすると TimeScale の影響を受けません。
f:id:aki517:20210125133003p:plain

まとめ

Tween制御系Assetをまとめてみました。複雑なアニメーションは Animator, AnimationClip を使ったり、周期性のある動きはシェーダでと、UIアニメーションは実装方法が多いですね。

【Unity】UI開発 Part 2 テキスト編

前回に引き続きUnityによるUI開発です。今回はテキスト編です。

概要

Unityのテキスト表示は uGUI標準のText と TextMeshPro です。
ここ最近で使い勝手の良い TextMeshPro を今回は取り上げます。

導入方法

Window > TextMeshPro > Import TMP Essential Resources から最低限のアセットの事前インポートが必要です。

FontAsset

TextMeshProでテキストを表示するにはフォントデータを元にFontAssetを作成する必要があります。

作成方法

  1. Window > TextMesh Pro > Font Asset Creator を選択
  2. Source Font File に フォントデータ(TTF, OTF) を設定
  3. Atlas Resolution に 解像度を設定、ASCIIなら 512 x 512,
    日本語(ひらがな・カタカナ・常用漢字含む)なら 4096 x 4096 くらいで収まります。
  4. Character Set を Custom Characters に設定
  5. Custom Character List に対象テキストを追加
  6. Render Mode に SDF AA を選択
  7. Generate Font Atlas」をクリック
    ※データ量によって生成に1〜2分ほど掛かります。
  8. Save」をクリックして Font Asset を .asset にして保存

使い方

TextMeshProコンポーネントの Font Asset に作成した Font Asset を設定するだけです。

Dynamic SDF

Font Asset をダイナミックフォント的な扱いができる Dynamic SDF 形式にする方法です。

  1. 作成した Font Asset を選択
  2. Source Font File に フォントデータ(TTF, OTF) を設定
    Atlas Population Mode で Dynamic を選択
    Atlas Width/Height に任意の解像度を設定
  3. 「Apply」をクリック

Font Fallback

入力したテキストが Font Asset 内に無い時に別のFont Assetを参照する機能です。

設定方法は対象Font Asset を選択
Font Fallback Asset に Font Asset を設定します。

使用例としては
英数字は良く使うが、全角文字はほぼ使わないゲームがあるとします。
・ASCII制御文字(半角英数字・記号) のみの Font Asset A を作成
・そのFontFallback に Dynamic SDF 形式 の 全角文字のFont Asset B を設定
こうすれば、普段は A を参照しつつ、全角文字を使う際は B を参照し
フォント用テクスチャのメモリ消費を抑えられます。

絵文字

TextMeshProはテキスト領域に絵文字を挿入できます。利用するには Sprite Asset が必要です。

Sprite Asset 作成方法

  1. 対象のテクスチャを選択
  2. Inspectorビューから
    Texture Type - Sprite (2D and UI) を選択
    Sprite Mode - Multiple を選択
  3. Apply」をクリック
  4. Sprite Editor」をクリック
  5. Sprite Editor 上で使いたい絵文字を切り抜く
  6. Apply」をクリック
  7. Projectビュー > Create > TextMeshPro > Sprite Asset を選択
  8. Sprite Asset が作成されます。

表示方法

  1. TextMeshPro コンポーネントExtra Settings を開く
  2. Sprite Asset の項目に作成した Sprite Asset を設定
  3. テキスト領域に以下のようにタグを使って入力

    表示結果

表示位置がズレる

以下の方法でオフセットを調整すると直ります。

Sprite Asset の Sprite Glyph Table を開き個別にオフセットを調整します。

まとめて設定したい場合は Sprite Glyph Table の最下部にある Global Offsets & Scale を調整します。

ルビ

TextMeshPro はルビ(ふりがな)の設定できます。コガネブログさんのサイトがとても参考になります。
baba-s.hatenablog.com

まとめ

TextMeshPro は各アセット作成の手間はありますが表現の幅とパフォーマンスは uGUI標準のText よりも良いです。とりあえずテキストを出してみたいだけであれば Text でも十分です。

参考

【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。 - テラシュールブログ
Unity Live Help home | Lessons
TextMesh Pro: Sprite Assets - Unity Learn

【Unity】UI開発 Part 1 Canvasと描画順

あけましておめでとうございます。暫くぶりの更新です ^_^;
今回は、UnityのUI開発で個人的に面倒なところをまとめてみました。

Canvas

UnityのuGUIによるUI開発は全てこのCanvasコンポーネントが起点となります。このコンポーネント配下にUI要素をぶらさげる形になります。
f:id:aki517:20201208213513p:plain

Render Mode

Render Mode に応じてUIスクリーンに描画するか、3D空間に描画するかを設定できます。
f:id:aki517:20201208215434p:plain

Render Mode 概要
Screen Space - Overlay 画面に合わせて拡縮、カメラは参照せず常に最前面に表示、通常のUI作成はこれを使います。
Screen Space - Camera 指定したカメラを参照してその範囲に収まるUIを表示します。UIは常にカメラに向きます。Perspectiveビューも設定できるため3Dモデルを間に挟んだ表示ができます。キャラ選択画面でUI上に3Dキャラを表示する等で使います。
World Space 指定したカメラの3D空間にUIを表示します。3Dキャラの頭上にHPを表示等に使います。

解像度対応

モバイルなど端末によって解像度が異なる問題を解決する方法です。ここではアスペクト比を固定化する方法です。

  1. Canvas Scaler の設定を変更

    ・UI Scale Mode - Scale With Screen Size
    ・Reference Resolution - 基準解像度の半分 (1080 x 1920の場合、X:540 Y:960)
    ・Screen Match Mode - Expand
  2. Canvas配下にPanelを配置
  3. 追加したPanel に Aspect Ratio Filter コンポーネントを追加

    Aspect Mode - Fit In Parent
  4. クリップ処理が必要なら Panel に Maskコンポーネント を追加

    ・Show Mask Graphis - チェック外す

SafeArea対応

Unity2019.3以降であれば Device Simulator を使いエディタ上で大まかな判定が可能です。テラシュールさんの記事が綺麗にまとまってます。
【Unity】Device Simulatorでノッチとセーフエリアの対策 - テラシュールブログ

描画順

これはとても重要です。事前にUIデザイナーとエンジニアでルールを決めないと後で痛い目にあいます・・いやほんと・・(TAT)

Canvas内の描画順

Canvas内に限定した話であれば、Hierarchyビューの並びで描画順が決まります。

複数Canvas間の描画順

Screen Space - Overlay と Screen Space - Camera / World Space で設定が異なります。

Screen Space - Overlay
・常に Screen Space - Camera と World Space のUIよりも手前に描画
Sort Order で描画順を制御

Screen Space - Camera / World Space
カメラDepth > Sorting Layer > Order In Layer の順で奥から手前に描画

こちらのサイトがとても綺麗にまとまっています。
uGUI 描画優先度のチートシート │ Aiming 開発者ブログ

UIにパーティクルを差し込む

UI(奥) - Particle - UI(手前) で表示したい場合、Sorting Layer が同じ値なら Order In Layer で調整が手っ取り早いです。

ただし、UI要素の Sorting Layer と Order In Layer はCanvasでの設定値になるため
手前に表示するUI要素は Canvasの子にして Order In Layer を変更する必要があります。

f:id:aki517:20201218234449g:plain

また、Canvasが増えるとその分だけ SetPass が呼ばれパフォーマンスに影響するので、この辺はゲーム仕様に応じて適切に使い分ける必要があります。

Image

f:id:aki517:20201220215348p:plain
画像やシンプルな矩形を表示するコンポーネントです。

テクスチャの設定

Imageに使用するテクスチャは Texture Type を Sprite (2D and UI) に設定します。

Image Type

ImageType 表示
Simple 最もシンプルな表示です。拡大縮小すると画像全体を引き伸ばします。
Sliced 拡大縮小時にBorder(境界)部分の大きさは固定したままで、中心部分だけ引き伸ばします。
Tiled Borderの制御はSlicedと同じですが、中心部分が繰り返し表示になります。
Filled Fill Methodで指定した方式で表示領域を変更します。

Border 設定方法

Sliced, Tiled を使う場合は Sprite Editor で Border の設定が必要です。
1. 対象テクスチャのInSpectorビューから「Sprite Editor」を選択

2. Sprite Editor ウインドウ左上のプルダウンから「Custom Outline」を選択

3. Border の値を入力して右上の「Apply」をクリックで完了

RawImage

f:id:aki517:20201220215334p:plain
Image同様に画像を表示するコンポーネントです。
Imageと違い、Texture Type に依存しないので
・ネットワーク経由でダウンロードした画像
・ゲーム内の3Dモデルをテクスチャ
等に使用できます。

UV Rect

こちらのプロパティを編集することで UV ScrollやTilingを設定できます。

まとめ

Canvasとそれに紐づく解像度対応や描画順、最後に簡単に画像表示できる Image・RawImage について書きました。これだけでもかなりの量になりました。。本当はテキスト、アニメーション、パフォーマンスと書きたい事は沢山ありますが今回はこの辺で ^_^;

参考

https://learning.unity3d.jp/tag/ui/
Unityでパフォーマンスの良いUIを作る為のTips
Unity Live Help home | Lessons

【Unity】Google Mobile Ads Unity Plugin を試す

今回は Google Mobile Ads SDK Unity プラグインを使った動画リワード広告を試してみました。

リワード広告とは

ユーザーが広告を操作・視聴するのと引き換えに、アプリ内で報酬を獲得できるものです。スマホのアプリでよくある、ここから先は動画広告を見たら遊べる的なやつです。

Google AdMob

まずは Google AdMob でAdMobアカウント、アプリ情報、広告ユニットの作成をします。すでにある方は読み飛ばしてOKです。  

AdMobアカウント作成
  1. こちらの Google AdMob にアクセス、アカウントが無ければ以下のような表示になります。

  2. 必要な情報を入力してAdSence 利用規約を確認してチェックを入れたら「ADMOBアカウントを作成」をクリック
    ちなみに私は以下の情報で作成
    国または地域:日本
    タイムゾーン:(UTC+09:00) 東京
    お支払い通貨:(JPY¥)

  3. 最後にPINコードの入力をします。
    電話番号の前に国番号(日本は+81)を付けるのを忘れないでください。

  4. 以下のような管理画面が表示されたら完了です。

アプリ情報を作成

アプリ固有のアプリIDを取得するためにアプリ情報を作成してAdMobに追加します。

  1. サイドバーの「アプリ」から「アプリを登録して利用を開始」をクリック

  2. アプリを公開済みなら「はい」を選択して自身のアプリを設定します。

  3. アプリ名の入力とプラットフォームの指定を行い「追加」をクリック

  4. アプリ情報が追加されアプリIDが発行されました。

広告ユニットを作成

アプリ用の広告ユニットを作成します。

  1. 対象アプリを選択して「アプリの概要」から「広告ユニットを追加」をクリック

  2. 広告フォーマットを選ぶ画面になるので、今回はリワード広告を選択します。

  3. 次に広告ユニット名、報酬の数、報酬アイテムを入力して「広告ユニットを作成」をクリック

  4. 広告ユニットが作成され、広告ユニットIDが発行されました。

Google Mobile Ads Unity Plugin
パッケージのインストール
  1. こちらGitHubから GoogleMobileAds-v[バージョン].unitypackage をダウンロードします。

  2. 適当なUnityプロジェクトを作成して Assets > Import Package > Custom Package からダウンロードした .unitypackage をインポートします。

  3. インポート中に Package Manager Resolver ウインドウが表示され、Game Package Registry by GoogleレジストリをPackage Managerに追加して良いかと聞かれるので 「Add Selected Registries」をクリックします。

  4. 次に Assets > Google Mobile Ads > Settings を選択
    f:id:aki517:20200906210940p:plain

  5. Google AdMob の Enabled をチェック
    Google AdMobで作成したアプリIDを設定します。

  6. Android用の設定
    Assets > External Dependency Manager > Android Resolver > Settings を選択

    Enable Auto-Resolution, Enable Resolution On Build のチェックを外しておきます。

  7. iOS用の設定
    Cocoapods が未インストールの場合は
    Assets > External Dependency Manager > iOS Resolver > Install Cocoapods からインストール

    次に Assets > External Dependency Manager > iOS Resolver > Settings を選択

    Xcode Project - Add Cocoapods to the Xcode project を選択

  8. これでUnity Editor上で必要な設定は完了です。

スクリプトの設定

適当なCSファイルを作成して広告表示までの処理を書いていきます。

初期化

アプリ起動時などに MobileAds.Initialize() を一度だけ呼び出して初期化します。

using UnityEngine;

using GoogleMobileAds.Api;
using GoogleMobileAds.Common;

public class SampleAds : MonoBehaviour
{
    void Start()
    {
        // 広告を読込前に一度だけ呼び出す.
        MobileAds.Initialize( OnInitCompleted );
    }

    void OnInitCompleted( InitializationStatus initStatus ){
    }
}
広告オブジェクトの作成と読込

広告ユニットIDを設定してリワード広告オブジェクトの作成と読込を行います。

RewardedAd m_rewardedAd;

void CreateAndLoadRewardedAd()
{
    // プラットフォームに応じた広告ユニットIDを設定.
    string adUnitId = "unexpected_platform";
    #if UNITY_ANDROID
        adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx";
    #elif UNITY_IPHONE
        adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxx";
    #endif

    // リワード広告オブジェクトを作成.
    m_rewardedAd = new RewardedAd( adUnitId );

    // リワード広告を読込.
    AdRequest request = new AdRequest.Builder().Build();
    m_rewardedAd.LoadAd( request );
}
広告の表示

リワード広告の表示は RewardedAd.Show() を呼ぶだけです。ただし、広告を1回表示するとそのRewaredAdオブジェクトは破棄されるので、このオブジェクトを使い回して以降の広告を読込/表示はできません。

void Show()
{
    if( m_rewardedAd.IsLoaded()){
        m_rewardedAd.Show();
    }
}
イベントの設定

以下のようにRewardedAdに広告用イベントを設定できます。

    m_rewardedAd.OnAdLoaded += OnAdLoaded; // 広告読込完了時に呼び出される.
    m_rewardedAd.OnAdClosed += OnAdClosed; // 広告を閉じた時に呼び出される.

設定できるイベントは以下です。

イベント 説明
OnAdLoaded 広告読込完了時に呼び出される。
OnAdFailedToLoad 広告の読込失敗時に呼び出される
OnAdOpening 広告が表示されると呼び出される。用途は必要に応じてアプリの音声やゲームループを停止する等
OnAdFailedToShow 広告の表示が失敗時に呼び出される
OnAdClosed ユーザが「閉じる」アイコンまたは「戻る」ボタンをタップして広告を閉じると呼び出される。用途は必要に応じてアプリの音声やゲームループを再開する等
OnUserEarnedReward 動画広告を視聴したユーザへのリワード付与時(動画を最後まで視聴した時)に呼び出される。引数のRewardには広告ユニットに設定した報酬アイテム(Type)報酬の数(Amount)が入る

<注意>上記イベントはUnityのメインスレッドとは別スレッドで実行されるので、設定したイベント内でUnityのAPIを呼びたい場合は以下のように MobileAdsEventExecutor.ExecuteInUpdate() を使って例外を回避する必要があります。

[SerializeField] UnityEvent m_onLoadedAd;

void OnAdLoaded( object sender, EventArgs args )
{
    MobileAdsEventExecutor.ExecuteInUpdate( ()=>{ m_onLoadedAd.Invoke(); });
}

イベントをキューイングしてUpdate()で実行してるだけなので同様の処理を自前で書いても良いです。

開発中の動作検証について

開発中にテスト広告を使わずに何度もリリース用の広告を呼び出すと不正な操作と検出されてAdMobアカウントをBANないしは利用制限が掛かる可能性があります。

テスト広告ユニットID

遷移やイベントの検知確認などのアプリをリリースする前のチェックであればこちらにテスト広告ユニットIDが用意されているのでこれらを使用してください。

テストデバイス追加

テスト広告ユニットではなく自分の作成した広告ユニットで動作確認をしたい場合、対象端末をテストデバイスとして追加すれば確認できます。

設定方法は以下です。

まずは先程のスクリプトの公告ユニットIDを設定するところをテスト広告ユニットIDに変更します。

void CreateAndLoadRewardedAd()
{
    // 動画リワードのテスト広告ユニットIDを設定.
    string adUnitId = "unexpected_platform";
    #if UNITY_ANDROID
        adUnitId = "ca-app-pub-3940256099942544/5224354917";
    #elif UNITY_IPHONE
        adUnitId = "ca-app-pub-3940256099942544/1712485313";
    #endif

    m_rewardedAd = new RewardedAd( adUnitId );

    AdRequest request = new AdRequest.Builder().Build();
    m_rewardedAd.LoadAd( request );
}

次に上記スクリプトが含まれるアプリを作成して起動後のログからテストデバイスIDを取得します。

Android
adb logcat | grep I/Ads から確認できます。

I/Ads     (12708): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("ここにテストデバイスIDが入る") to get test ads on this device.

iOS
XCodeView > Debug Area > Active Console から確認できます。

<Google> To get test ads on this device, set: GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"ここにテストデバイスIDが入る" ];

以下のエラーが出る場合、iOS端末の 設定 > プライバシー > 広告 > 追跡型広告の制限をオフにしてアプリを再起動してください。

<Google> Limit Ad Tracking may be enabled. To get test ads on this device, disable Limit AdTracking.

最後に、確認したテストデバイスIDを AdRequest.AddTestDevice() に設定します。
<注意>リリース版ではAddTestDevice()が含まれないようにしてください

// リワード広告を読込.
AdRequest request = new AdRequest.Builder()
                        .AddTestDevice( AdRequest.TestDeviceSimulator )
                    #if UNITY_ANDROID
                        .AddTestDevice( "テストデバイスID for Android" )
                    #elif UNITY_IPHONE
                        .AddTestDevice( "テストデバイスID for iOS" )
                    #endif
                        .Build();

これで準備が完了したので自分の作成した広告ユニットを使ってテストデバイスによる動作確認ができます。長かった・・・^_^;

まとめ

最後に簡単なミニゲームとリワード広告を連携させたサンプルをこちらGitHubにアップしておきました。

f:id:aki517:20200911082415g:plain

参考

スタートガイド  |  Unity  |  Google Developers
[Xcode]Mac OS Catalinaにアップデートしたらpodコマンドが通らなくなった