AdMob+Firebase 101 Unity: 設定とアナリティクスの基本

1. はじめに

広告は、アプリの全体的なユーザー エクスペリエンスにおいて重要な役割を果たします。広告を適切に実装すると、アプリ全体のユーザー エクスペリエンスが向上し、ユーザーの維持率やエンゲージメントを高めることもできます。たとえば、リワード広告を使用すると、動画広告を視聴したユーザーにアプリ内通貨やアイテムを報酬として進呈できます。これにより、ユーザーは行き詰まって離脱する可能性があった状況を乗り越えて、新たな高みに到達できます。

しかし、優れた広告エクスペリエンスを実現するのは簡単ではありません。このような広告をどのくらいの頻度で表示すればよいか、疑問に思うかもしれません。どこで、いつ表示すべきですか?どのような賞にすべきですか?残念ながら、アプリごと、プレースメントごとに回答が異なります。万能な答えはありません。

Firebase 向け Google アナリティクス、AdMob、その他 Firebase が提供する強力かつ使いやすいツールを使用することで、データに基づいてアプリを微調整することがはるかに容易かつ効率的になりました。今回は、その方法をご紹介します。

作成するアプリの概要

この Codelab は、ユーザーが描画の名前を推測するゲームの Awesome Drawing Quiz というアプリを作成する手順を説明する 3 つの Codelab のうちの最初の Codelab です。このセッションでは、リワード広告と Firebase サービスをゲームに組み込む方法について説明します。

この Codelab では、Firebase 向け Google アナリティクスを統合して、重要なアプリイベントを記録します。また、Firebase コンソールに表示されるアプリ分析の読み取り方法についても説明します。

学習内容

  • アプリで Firebase 向け Google アナリティクスを設定する方法
  • アプリ イベントを記録する方法
  • Firebase コンソールに表示されるアプリ分析の読み方

必要なもの

  • Unity 2018.4.4f1 以降
  • Xcode 10 以降(iOS のターゲットをビルドするため)
  • Google アカウント
  • Android 5.0 以降を搭載したテストデバイス(デバイスを接続するための USB ケーブル付き)、または Play ストア/Google API をサポートするシステム イメージを搭載した AVD(Android 仮想デバイス)を実行する Android エミュレータ
  • iOS 8.0 以降を搭載した iOS デバイスまたはシミュレータ

AdMob の使用経験についてお答えください。

初心者 中級者 上級者

ご自身の Firebase 使用経験をどのように評価されますか。

初心者 中級者 上級者

2. 開発環境をセットアップする

コードをダウンロードする

次のボタンをクリックして、この Codelab のすべてのコードをダウンロードします。

ダウンロードした zip ファイルを解凍すると、これにより、admob-firebase-codelabs-unity-master という名前のルートフォルダが展開されます。

または、コマンドラインから GitHub リポジトリのクローンを作成します。

$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-unity

リポジトリには、次の 4 つのフォルダが含まれています。

  • android_studio_folder.png101-base - この Codelab で作成する開始コード。
  • android_studio_folder.png101-complete_and_102-base - この Codelab の完成したコードと 102 Codelab のスターター。
  • android_studio_folder.png102-complete - 102 Codelab の完成したコード。

必要なファイルを準備する

Awesome Drawing Quiz は、プロジェクトのコンパイルと実行に必要な複数のオープンソース コードを使用しています。

ターミナルを開き、リポジトリのルート ディレクトリに移動します。次に、ターミナルから ./gradlew :prepareThirdPartyFiles(Windows の場合は gradlew.bat :prepareThirdPartyFiles)を実行して、必要なファイルをプロジェクトにコピーします。

スターター アプリをインポートする

Unity を起動し、ウェルカム画面で [Open] を選択します。次に、ダウンロードしたコードから 101-base ディレクトリを選択します。

これで、Unity でプロジェクトが開きます。

3. 動画リワード広告ユニットを設定する(省略可)

スターター アプリには、便宜上、専用の動画リワード広告ユニットがすでに含まれています。AdMob アカウントで新しいアカウントを作成したくない場合は、この手順をスキップしてもかまいません

Android 用の設定

アカウントで新しい AdMob アプリを作成する手順は次のとおりです。

  1. AdMob コンソールに移動します。
  2. [アプリ] メニューで、[アプリを追加] をクリックします。
  3. 「Google Play または App Store でアプリを公開したことがありますか?」という質問が表示されたら、「いいえ」と答えます。
  4. アプリに「Awesome Drawing Quiz」という名前を付け、プラットフォームとして [Android] を選択し、[追加] をクリックします。

アカウントで AdMob アプリを作成したら、以下の手順に沿って新しいリワード動画広告ユニットを作成します。

  1. AdMob フロントエンドで [アプリ] メニューをクリックし、アプリのリストから [Awesome Drawing Quiz] を選択します。
  2. [広告ユニット] メニューをクリックし、[広告ユニットを追加] をクリックして、新しいリワード動画広告ユニットを作成します。
  3. [広告フォーマット] で [リワード] を選択します。

7672f41ec611101b.png

  1. 広告ユニットの名前は任意で指定できます。次に、報酬の数を 1 に、報酬アイテムを 「ヒント」に設定します(これらはアプリが現在ユーザーに提供している報酬です)。[広告ユニットを作成] をクリックして、新しいリワード動画広告ユニットを作成します。

6d067814a2c38264.png

  1. 正常に作成されると、次のような手順が表示されます。

4bc1b3b341a5a81c.png

  1. Unity プロジェクトに戻り、AdMob アプリ ID と広告ユニット ID の定数を、前の手順で作成した ID に更新します。

Ads/AdManager.cs

namespace AwesomeDrawingQuiz.Ads {
    public class AdManager {

        public const string APP_ID_ANDROID = "YOUR_ADMOB_APP_ID";
        
        ...

        #elif UNITY_ANDROID
        private const string APP_ID = APP_ID_ANDROID;
        public const string AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";

        ...
    }
}

iOS 用の設定

アカウントで新しい AdMob アプリを作成する手順は次のとおりです。

  1. AdMob コンソールに移動します。
  2. [アプリ] メニューで、[アプリを追加] をクリックします。
  3. 「Google Play または App Store でアプリを公開したことがありますか?」という質問が表示されたら、「いいえ」と答えます。
  4. アプリに「Awesome Drawing Quiz」という名前を付け、プラットフォームとして [iOS] を選択して、[追加] をクリックします。

アカウントで AdMob アプリを作成したら、以下の手順に沿って新しいリワード動画広告ユニットを作成します。

  1. AdMob フロントエンドで [アプリ] メニューをクリックし、アプリのリストから [Awesome Drawing Quiz] を選択します。
  2. [広告ユニット] メニューをクリックし、[広告ユニットを追加] をクリックして、新しいリワード動画広告ユニットを作成します。
  3. [広告フォーマット] で [リワード] を選択します。

7672f41ec611101b.png

  1. 広告ユニットの名前は任意で指定できます。次に、報酬の数を 1 に、報酬アイテムを 「ヒント」に設定します(これらはアプリが現在ユーザーに提供している報酬です)。[広告ユニットを作成] をクリックして、新しいリワード動画広告ユニットを作成します。

6d067814a2c38264.png

  1. 正常に作成されると、次のような手順が表示されます。

4bc1b3b341a5a81c.png

  1. Unity プロジェクトに戻り、AdMob アプリ ID と広告ユニット ID の定数を、前の手順で作成した ID に更新します。

Ads/AdManager.cs

namespace AwesomeDrawingQuiz.Ads {
    public class AdManager {

        public const string APP_ID_IOS = "YOUR_ADMOB_APP_ID";
        
        ...

        #elif UNITY_IOS
        private const string APP_ID = APP_ID_IOS;
        public const string AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";

        ...
    }
}

4. Google Mobile Ads Unity プラグインを追加する

プラグインをインポートする

Unity アプリで AdMob 広告を配信するには、Google Mobile Ads Unity プラグインをプロジェクトに追加する必要があります。

  1. Google Mobile Ads Unity プラグイン 3.18.1 パッケージをダウンロードします。(この Codelab は、プラグインの他のバージョンと互換性がない場合があります)。
  2. Awesome Drawing Quiz Unity プロジェクト。プロジェクトで、[Assets] > [Import Package] > [Custom Package] を選択します。
  3. ダウンロードしたプロジェクトに GoogleMobileAds.unitypackage をインポートします。

AdMob アプリ ID を設定する

Unity Editor で、メニューから [Assets](アセット)> [Google Mobile Ads](Google モバイル広告)> [Settings](設定)を選択します。

44fc84fe88235c1f.png

[Google AdMob] セクションの [Enabled](有効)チェックボックスをオンにして、AdMob を有効にします。次に、AdMob アプリ ID を次のように入力します。

  • Android: ca-app-pub-3940256099942544~3048611032
  • iOS: ca-app-pub-3940256099942544~2753522596

a6ad7402d4daf330.png

5. Firebase プロジェクトを設定する

Firebase コンソールから新しいプロジェクトを作成する

  1. Firebase コンソールに移動します。
  2. [プロジェクトを追加] を選択し、プロジェクトに「Awesome Drawing Quiz」という名前を付けます。

Unity アプリを追加する

  1. 新しいプロジェクトの概要画面で、[Unity アプリに Firebase を追加] をクリックします。
  2. [iOS アプリとして登録] チェックボックスをオンにします。
  3. iOS バンドル ID を「com.codelab.awesomedrawingquiz.unity」と入力します。
  4. アプリのニックネームを「Awesome Drawing Quiz (Unity on iOS)」のように入力します。
  5. [Android アプリとして登録] チェックボックスをオンにします。
  6. Android パッケージ名として「com.codelab.awesomedrawingquiz.unity」と入力します。
  7. アプリのニックネームを「Awesome Drawing Quiz (Unity on Android)」のように指定します。
  8. [Register App] を選択して、Android アプリと iOS アプリの両方を登録します。

Unity プロジェクトに Firebase 構成ファイルを追加する

次に、アプリに必要なすべての Firebase メタデータを含む構成ファイルをダウンロードできる画面が表示されます。google-service.json ファイルと GoogleService-Info.plist ファイルをダウンロードし、両方を Unity プロジェクトの android_studio_folder.pngAssets フォルダに移動します。

331c165d80ba105e.png

Firebase アナリティクス SDK を追加する

  1. Firebase Unity SDK 5.5.0 をダウンロードし、適切な場所で解凍します。
  2. Awesome Drawing Quiz Unity プロジェクトを開き、[Assets] > [Import Package] > [Custom Package] の順に選択します。
  3. 解凍した SDK の中から Remote Config SDK(dotnet4/FirebaseAnalytics.unitypackage)をインポートします。
  4. [Import Unity package] ウィンドウで [Import] をクリックします。

6. AdMob を Firebase プロジェクトにリンクする

アプリを Firebase にリンクする手順は以下のとおりです。

  1. https://apps.admob.com から AdMob アカウントにログインします。
  2. サイドバーで [アプリ] をクリックします。
  3. [Awesome Drawing Quiz] を選択します。最近使ったアプリのリストに目的のアプリが表示されない場合は、[すべてのアプリを表示] をクリックし、AdMob に追加したすべてのアプリから目的のアプリを選択します。
  4. サイドバーで [アプリの設定] をクリックします。
  5. [Firebase にリンク] をクリックします。
  6. [既存の Firebase プロジェクトにリンクして、新しい Firebase アプリを作成する] オプションを選択します。プルダウン メニューから [Awesome Drawing Quiz] プロジェクトを選択します。
  7. [続行] ボタンをクリックすると、[Successfully linked](リンクが完了しました)というメッセージが表示されます。[完了] ボタンをクリックして終了します。

AdMob アプリを Firebase プロジェクトにリンクすると、AdMob と Firebase の両方のコンソールで、次のような追加機能が利用できるようになります。

収益カード(AdMob)

[収益] カードでは、考えられるすべての収益源を 1 か所で包括的に確認できます。サポートされている収益源は次のとおりです。

  • AdMob(推定値)
  • メディエーション広告ネットワーク(実際の値)
  • アプリ内購入
  • e コマース購入数

10fe118249e11150.png

ユーザー指標カード(AdMob)

ユーザー指標カードでは、広告エクスペリエンスの変更がユーザー行動にどのような影響を与えるかを確認できます。

5f56366f1b31d4a1.png

リワード広告レポート(AdMob)

リワード広告レポートでは、ユーザーがリワード広告にどのように関わっているかを把握するのに役立つさまざまな指標を確認できます。

658a2868777690ea.png

合計収益カード(Firebase)

AdMob アプリを Firebase にリンクすると、Firebase ダッシュボードの [合計収益] カードに、AdMob の収益とアプリ内購入、e コマースでの購入による収益が表示されます。

98cb283977b023a.png

広告イベントのレポート(Firebase)

広告固有のイベント(クリック、インプレッション、報酬イベント)は自動的に収集され、Firebase 向け Google アナリティクスで使用できます。

bf77bd8c00c1441b.png

7. プロジェクトを実行する

プロジェクトをコンパイルして実行すると、アプリの起動時に次の画面が表示されます。

f5fbf4565c5d8647.png

[START A GAME](ゲームを開始)をクリックすると、画面に絵が表示されます。ミッションは、上部に表示されるヒントを使用して絵の名前を推測することです。ヒントから、絵の名前の最初の文字と長さを推測できます。

bbdf4d23fb08a519.png ad82d7e657945c4d.png

絵の名前がわからない場合は、[SKIP] ボタンをクリックしてレベルをスキップできます。

答えを推測するのに役立つ追加のヒントが必要になる場合があります。[ヒント] ボタンをクリックして動画リワード広告を視聴すると、追加のヒントを得ることができます。広告の視聴が完了すると、報酬として 1 文字が追加で公開されます。

8c33687361f83a13.png b048d6587c10e9df.png

8. アプリイベントを追加する

Awesome Drawing Quiz のユーザー ジャーニーを深く理解するために、ゲーム内でのユーザーの行動をトラッキングするカスタム イベントをいくつか定義します。

イベント名

自動送信...

パラメータ

game_start

ユーザーが新しいゲームを開始したとき

なし

level_start

ユーザーがステージ内で新しいレベル(新しいお絵かきクイズ)を開始したとき。(1 つのステージに 6 つのレベルがあります)

level_name

level_wrong_answer

ユーザーが間違った回答を送信したとき

level_name

ad_reward_prompt

ユーザーがヒントボタンをタップし、リワード動画広告の視聴を促された場合

ad_unit_id

ad_reward_impression

ユーザーがリワード動画広告の視聴を開始したとき

ad_unit_id

level_success

ユーザーが正解を送信したとき(レベルをクリアしたとき)

level_name、number_of_attempts、elapsed_time_sec、hint_used

level_fail

ユーザーがレベルをスキップしたとき

level_name、number_of_attempts、elapsed_time_sec、hint_used

game_complete

ゲームが終了したとき

number_of_correct_answers

各イベントに関連付けられた各パラメータの説明は次のとおりです。

イベント名

パラメータ名

説明

level_start

level_name

レベルに表示される絵の名前(例: 「banana」)

level_wrong_answer

level_name

レベルに表示される絵の名前(例: 「banana」)

ad_reward_prompt

ad_unit_id

リワード動画広告の表示に使用される広告ユニット ID

ad_reward_impression

ad_unit_id

リワード動画広告の表示に使用される広告ユニット ID

level_success

level_name

レベルに表示される絵の名前(例: 「banana」)

level_success

number_of_attempts

レベルをクリアしようとした回数

level_success

elapsed_time_sec

レベルをクリアするまでの経過時間(秒)

level_success

hint_used

ユーザーがヒント(動画リワード広告を視聴)を使用してレベルをクリアしたかどうか(1: ヒントを使用 / 0: ヒントなしでレベルをクリア)

level_fail

level_name

レベルに表示される絵の名前(例: 「banana」)

level_fail

number_of_attempts

レベルをクリアしようとした回数

level_fail

elapsed_time_sec

レベルをクリアするまでの経過時間(秒)

level_fail

hint_used

ユーザーがヒント(動画リワード広告を視聴)を使用してレベルをクリアしたかどうか(1: ヒントを使用 / 0: ヒントなしでレベルをクリア)

game_complete

number_of_correct_answers

ゲームでクリアしたレベルの数

カスタム イベントをロギングするためのヘルパークラスを作成する

分析イベントを簡単に記録するために、カスタム イベントを管理するヘルパークラスを作成します。

まず、Assets/Scripts フォルダの下に新しいフォルダを作成し、Analytics という名前を付けます。次に、Analytics フォルダに新しい C# スクリプトを作成し、QuizAnalytics.cs という名前を付けます。

QuizAnalytics.cs ファイルに次のコードを追加します。

Analytics/QuizAnalytics.cs

using Firebase.Analytics;

namespace AwesomeDrawingQuiz.Analytics {

    public class QuizAnalytics {

        private const string EVENT_AD_REWARD_PROMPT = "ad_reward_prompt";

        private const string EVENT_AD_REWARD_IMPRESSION = "ad_reward_impression";

        private const string EVENT_LEVEL_FAIL = "level_fail";

        private const string EVENT_LEVEL_SUCCESS = "level_success";

        private const string EVENT_LEVEL_WRONG_ANSWER = "level_wrong_answer";

        private const string EVENT_GAME_START = "game_start";

        private const string EVENT_GAME_COMPLETE = "game_complete";

        private const string PARAM_AD_UNIT_ID = "ad_unit_id";

        private const string PARAM_ELAPSED_TIME_SEC = "elapsed_time_sec";

        private const string PARAM_HINT_USED = "hint_used";

        private const string PARAM_NUMBER_OF_ATTEMPTS = "number_of_attempts";

        private const string PARAM_NUMBER_OF_CORRECT_ANSWERS = "number_of_correct_answers";

        public const string SCREEN_MAIN = "main";

        public const string SCREEN_GAME = "game";

        public static void LogGameStart() {
            FirebaseAnalytics.LogEvent(EVENT_GAME_START);
        }

        public static void LogLevelStart(string levelName) {
            FirebaseAnalytics.LogEvent(FirebaseAnalytics.EventLevelStart, 
                FirebaseAnalytics.ParameterLevelName, levelName);
        }

        public static void LogLevelWrongAnswer(string levelName) {
            FirebaseAnalytics.LogEvent(EVENT_LEVEL_WRONG_ANSWER, 
                FirebaseAnalytics.ParameterLevelName, levelName);
        }

        public static void LogAdRewardPrompt(string adUnitId) {
            FirebaseAnalytics.LogEvent(EVENT_AD_REWARD_PROMPT, PARAM_AD_UNIT_ID, adUnitId);
        }

        public static void LogAdRewardImpression(string adUnitId) {
            FirebaseAnalytics.LogEvent(EVENT_AD_REWARD_IMPRESSION, PARAM_AD_UNIT_ID, adUnitId);
        }

        public static void LogLevelSuccess(
            string levelName, int numberOfAttemps, int elapsedTimeInSec, bool hintUsed
        ) {
            FirebaseAnalytics.LogEvent(EVENT_LEVEL_SUCCESS, new Parameter[] {
                new Parameter(FirebaseAnalytics.ParameterLevelName, levelName),
                new Parameter(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttemps),
                new Parameter(PARAM_ELAPSED_TIME_SEC, elapsedTimeInSec),
                new Parameter(PARAM_HINT_USED, hintUsed ? 1 : 0)
            });
        }

        public static void LogLevelFail(
            string levelName, int numberOfAttempts, int elapsedTimeInSec, bool hintUsed
        ) {
            FirebaseAnalytics.LogEvent(EVENT_LEVEL_FAIL, new Parameter[] {
                new Parameter(FirebaseAnalytics.ParameterLevelName, levelName),
                new Parameter(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts),
                new Parameter(PARAM_ELAPSED_TIME_SEC, elapsedTimeInSec),
                new Parameter(PARAM_HINT_USED, hintUsed ? 1 : 0)
            });
        }

        public static void LogGameComplete(int numberOfCorrectAnswers) {
            FirebaseAnalytics.LogEvent(EVENT_GAME_COMPLETE, 
                PARAM_NUMBER_OF_CORRECT_ANSWERS, numberOfCorrectAnswers);
        }

        public static void SetScreenName(string screenName) {
            FirebaseAnalytics.SetCurrentScreen(screenName, null);
        }
    }
}

ゲームでアナリティクス イベントをログに記録する

Assets/Scripts/Scenes フォルダの Game.cs ファイルを開きます。AwesomeDrawingQuiz.Analytics 名前空間にある QuizAnalytics クラスを使用するには、次のように using ディレクティブを追加します。

Scenes/Game.cs

using AwesomeDrawingQuiz.Ads;

// TODO: Import AwesomeDrawingQuiz.Analytics (101)
using AwesomeDrawingQuiz.Analytics;

...

namespace AwesomeDrawingQuiz.Scene {
   ...
}

次に、Start() 関数で QuizAnalytics.SetScreenName() を呼び出して、現在の画面の名前を変更します。また、QuizAnalytics.LogGameStart() を呼び出して、ゲームが開始されたことを示します。

Scenes/Game.cs

void Start () {
    // TODO: Log screen name (101)
    QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_GAME);

    ...

    SetHintButtonEnabled(false);

    // TODO: Log game_start event (101)
    QuizAnalytics.LogGameStart();
    
    ...
}

次に、コールバック関数で、次のようにカスタム イベントをログに記録する呼び出しを追加します。

Scenes/Game.cs

public void OnClickHint() {
    // TODO: Log ad_reward_prompt event (101)
    QuizAnalytics.LogAdRewardPrompt(AdManager.AD_UNIT_ID);

    ...
}

...
  
public void OnAdStarted(object sender, EventArgs args) {
    // TODO: Log ad_reward_impression event (101)
    QuizAnalytics.LogAdRewardImpression(AdManager.AD_UNIT_ID);
}

...

public void OnGameOver(object sender, GameOverEventArgs args) {
    // TODO: Log game_complete event (101)
    QuizAnalytics.LogGameComplete(args.NumCorrectAnswers);

    ...
}

public void OnLevelCleared(object sender, LevelClearEventArgs args) {
    // TODO: Log level_success event (101)
    QuizAnalytics.LogLevelSuccess(
        args.Drawing.word, args.NumAttempts, args.ElapsedTimeInSeconds, args.IsHintUsed);

    ...
}

public void OnLevelSkipped(object sender, LevelSkipEventArgs args) {
    // TODO: Log level_fail event (101)
    QuizAnalytics.LogLevelFail(
        args.Drawing.word, args.NumAttempts, args.ElapsedTimeInSeconds, args.IsHintUsed);
}

public void OnNewLevel(object sender, NewLevelEventArgs args) {
    // TODO: Log level_start event (101)
    QuizAnalytics.LogLevelStart(args.Drawing.word);

    ...
}

public void OnWrongAnwser(object sender, WrongAnswerEventArgs args) {
    // TODO: Log level_wrong_answer event (101)
    QuizAnalytics.LogLevelWrongAnswer(args.Drawing.word);

    ...
}

最後に、Assets/Scripts/Scenes フォルダの Main.cs ファイルを更新します。Firebase SDK のメソッドを呼び出す前に、Firebase の準備ができているかどうかを確認する必要があります。

Scenes/Main.cs

using AwesomeDrawingQuiz.Ads;

// TODO: Import AwesomeDrawingQuiz.Analytics (101)
using AwesomeDrawingQuiz.Analytics;

...

namespace AwesomeDrawingQuiz.Scene {
    public class Main : MonoBehaviour {

        ...

        void Start () {
            Screen.sleepTimeout = SleepTimeout.SystemSetting;

            #if UNITY_ANDROID
            // Disable 'Start a game' button until
            // Firebase dependencies are ready to use on the Android
            buttonStartGame.interactable = false;

            // TODO: Check Google Play Services on Android (101)
            // Check Google Play Services on Android device is up to date
            Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
                var dependencyStatus = task.Result;
                if (dependencyStatus == Firebase.DependencyStatus.Available) {
                    Debug.Log("All Firebase services are available");
                    
                    // TODO: Set screen name (101)
                    QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_MAIN);
                } else {
                    throw new System.InvalidOperationException(System.String.Format(
                        "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                }
            }).ContinueWith(task => {
                // Enable 'Start a game' button
                UnityMainThreadDispatcher.Instance()
                    .Enqueue(() => buttonStartGame.interactable = true);
            });
            #else
            
            // TODO: Set screen name (101)
            QuizAnalytics.SetScreenName(QuizAnalytics.SCREEN_MAIN);
            #endif
        }

        ...
    }
}   

9. 分析イベントをデバッグする

DebugView を使用して、イベントが正しくログに記録されていることを確認できます。DebugView を使用すると、開発デバイス上のアプリによってロギングされる生のイベントデータをほぼリアルタイムで見ることができます。

開発のインストゥルメンテーション フェーズにおける検証に役立ち、アナリティクスの実装でのエラーを検出するのにも便利です。

Android でデバッグモードを有効にする

一般的に、アプリでロギングされるイベントは、約 1 時間の周期でバッチ処理され、まとめてアップロードされます。アナリティクスの実装をその場で検証するには、開発デバイスでデバッグモードを有効にして、最小限の遅延でイベントをアップロードする必要があります。

まず、Android Studio でターミナル ツールを開きます。下部のツールバーにあります。

c8dc1b4f08a224b8.png

次に、次のコマンドを実行します(テスト用の Android デバイスがパソコンに接続されているか、Android Emulator が実行されていることを確認してください)。

adb shell setprop debug.firebase.analytics.app com.google.codelab.awesomedrawingquiz

この動作は次のコマンドを実行してデバッグモードを明示的に無効にするまで継続します。

adb shell setprop debug.firebase.analytics.app .none.

iOS でデバッグモードを有効にする

開発用デバイスでアナリティクスのデバッグモードを有効にするには、Xcode で次のコマンドライン引数を指定します。

-FIRDebugEnabled

この動作は次のコマンドライン引数を指定して、デバッグモードを明示的に無効にするまで継続します。

-FIRDebugDisabled

DebugView でアナリティクス イベントをデバッグする

テストデバイスでデバッグモードを有効にしたら、Firebase コンソールに移動し、メニューから [DebugView] を選択します。次に、テストデバイスでゲームをプレイして、イベントがログに記録され、DebugView レポートに表示されることを確認します。

827059255d09ac00.png

イベント名をクリックすると、各イベントの詳細情報にアクセスできます。たとえば、次のスクリーンショットは、level_start イベントに関連付けられたパラメータの詳細を示しています。

475db00d05d03ab8.png

詳しくは、DebugView のヘルプセンター記事をご覧ください。

10. パラメータ レポートを有効にする

Firebase 向け Google アナリティクスでは、イベント数の合計がデフォルトで収集されますが、カスタム パラメータのレポートは、対象となるイベント パラメータごとに明示的にオンにする必要があります。この設定を有効にすると、Firebase 向け Google アナリティクスにカスタム パラメータの統計情報を表示するカードが追加されます。

イベントのカスタム パラメータを登録するには:

  1. Firebase コンソールに移動し、先ほど作成した Awesome Drawing Quiz プロジェクトを選択します。
  2. ナビゲーション メニューで [イベント] をクリックします。
  1. 変更するイベントの行で、73afe611adf58774.png> [パラメータ レポートを編集] をクリックします。

aad40de06ee0c3ad.png

  1. 登録するパラメータの名前を [パラメータ名を入力] 欄に入力します。

注: 一致するものがない場合は、パラメータ名を入力して [追加] をクリックします。e066c761aae4797f.png 5. 下の表を参照して、[タイプ] 欄を [テキスト] または [数値] に設定します。数値パラメータの場合は、[測定単位] フィールドも設定してください。6. [保存] ボタンをクリックして、設定を完了します。

以下の各イベントでパラメータ レポートを有効にします。

イベント名

パラメータ名

パラメータの型

測定単位

level_start

level_name

テキスト

なし

level_wrong_answer

level_name

テキスト

なし

level_success

level_name

テキスト

なし

level_success

number_of_attempts

数値

標準

level_success

elapsed_time_sec

数値

level_success

hint_used

数値

標準

level_fail

level_name

テキスト

なし

level_fail

number_of_attempts

数値

標準

level_fail

elapsed_time_sec

数値

level_fail

hint_used

数値

標準

game_complete

number_of_correct_answers

数値

標準

次の例は、level_success イベントのカスタム パラメータ レポートの設定を示しています。

6d569c8c27df2914.png

パラメータ レポートの設定が完了すると、パラメータ レポートが有効になっている各イベントに関連付けられたパラメータを確認できるようになります。

d1a37589d54bca6b.png

11. イベント レポートから分析情報を取得する

ゲームにいくつかのイベントを追加したので、ゲームのユーザー行動に関する質問に答えられるはずです。Firebase イベント レポートから得られる分析情報の例を次に示します。

どのレベルの不正解数が最も多いですか?

この質問に答えるには、各レベルでトリガーされた level_wrong_answer イベントの数を調べる必要があります。

イベント レポートで level_wrong_answer をクリックします。level_wrong_answer イベント レポートで、level_name カードを見つけます。そのカードには、level_name パラメータに関連付けられた値が次のように表示されます。

25da426bbc0c612c.png

上のスクリーンショットから、horizon の不正解数が最も多いことがわかります。これは、他のレベルと比較してユーザーにとって難しいことを意味します。

この分析情報に基づいて、初心者ユーザーには難しいレベルを提供しないことで、高いリテンション率を維持できます。

レベルをクリアするまでに平均何回試行されましたか?

Awesome Drawing Quiz では、ユーザーは各レベルの答えを何度でも送信できます。

level_success イベントの number_of_attempts パラメータでパラメータ レポートを有効にしているため、そのパラメータの詳細な指標を確認できます。

イベント レポートで level_success イベントをクリックします。level_success イベント レポートで、number_of_attemps カードを見つけます。カードには、次のように平均試行回数が表示されます。

43de290f9f1a0ac9.png

この分析情報を基に、ゲームの難易度を平均的に最適化できます。たとえば、平均試行回数が 1 に近い場合は、ゲームの難易度を少し上げることを検討してください。

ユーザーは、最終的にレベルをクリアできなかったとしても、ヒントを得て問題を解決しようとしましたか?

ユーザーがレベルをスキップすると、level_fail イベントがトリガーされます。ユーザーが決定した理由はさまざまです。

ただし、ゲームではリワード動画広告を視聴した後にヒントが表示されるため、ユーザーがヒントを利用してレベルをクリアしようとしたかどうかを把握することが重要です。

イベント レポートで level_fail イベントをクリックします。level_fail イベント レポートで、hint_used カードを見つけます。hint_used イベント パラメータの平均数が表示されます。ヒントが使用された場合は 1 に設定され、ヒントが使用されなかった場合は 0 に設定されます。

313814372cd7c8a4.png

hint_used カードの数値が 0 に近い場合、報酬(ヒント)がユーザーにとって魅力的ではないことを示しています。また、動画リワード広告による収益を増やす機会も失われています。

そのため、ユーザーにとってより役立つリワードにすることを検討する必要があります。そうすることで、ユーザーはゲームに深く関与し、リワード動画広告からの収益も増加します。

各ゲームでクリアされたレベルの平均数はどのくらいですか?

Awesome Drawing Quiz の各ゲームには、合計 6 つのレベルがあります。ユーザーが 6 つのレベルを終了すると(各レベルをクリアしたか失敗したかに関係なく)、number_of_correct_answers をパラメータとして game_complete イベントがトリガーされます。

number_of_correct_answers はユーザーがクリアしたレベル数(正解した数)を示すため、number_of_correct_answers パラメータの指標を確認することで答えを見つけることができます。

イベント レポートで game_complete イベントをクリックします。game_complete イベント レポートで、number_of_correct_answers カードを見つけます。number_of_correct_answers イベント パラメータの平均数が表示されます。

d9eeaa019d1bceb4.png

クリアされたレベルの平均数が少なすぎる場合は、ユーザーがレベルをクリアできるようにゲームを再構成することを検討してください。そうすることで、ユーザーは興味を失うことなくゲームをプレイし続けることができます。

12. 完了

AdMob と Firebase の基本 Unity Codelab が完了しました。この Codelab の完成したコードは、android_studio_folder.png101-complete_and_102-base フォルダにあります。

AdMob+Firebase Codelab の次のパートでは、ファネルを使用してアプリのイベントフローを可視化する方法を学びます。また、Remote Config と A/B テストを使用して、アプリを更新せずにゲーム内のパラメータ値を最適化する方法についても説明します。