C++ で Firebase を使ってみる

1. 概要

この Codelab では、Google アナリティクスを例として、サンプル Android ゲームに C++ Firebase Games SDK を統合する方法を学びます。必要な機能を追加したり、プレーヤーの進捗状況を測定するための基本的な分析ロジックを統合したり、テスターとゲームを共有して早期のフィードバックを得たりすることができます。

チュートリアル

この Codelab を作成者と一緒に進めたい場合は、こちらの動画をご覧ください。

学習内容

  • Android CMake ベースのゲームに Firebase を追加する方法。
  • 必要な C++ 依存関係と Gradle 依存関係を特定する方法。
  • アナリティクス イベントをログに記録する方法。
  • 分析イベントをデバッグする方法。
  • App Distribution でゲームを共有する方法。

必要なもの

  • Android Studio
  • サンプルコード
  • Google Play 開発者サービスを備えたテストデバイスまたはエミュレータ

2. サンプルコードを取得する

GitHub からチェックアウトまたはダウンロードします。

git clone https://github.com/FirebaseExtended/cmake-way-for-firebase.git

Firebase SDK をダウンロードする

macOS/Linux:

sh download.sh

Windows(PowerShell から):

./download.ps1

SDK を手動でダウンロードすることもできます。この場合、Firebase C++ SDK は /third_party に抽出する必要があります。firebase_cpp_sdk という名前のフォルダに、Firebase SDK のルート CMakeLists.txt が含まれるようにします。

3. サンプルゲームを実行する

まず、サンプルゲームをプレイして、すべてが動作することを確認します。手続き型で生成されたレベルと、ジャンプ用のボタンが 1 つだけあるシンプルなエンドレス ランナーです。

  1. [File] > [New] > [Import Project] を選択します(または、スプラッシュ画面で [Import Project] を選択します)。
  2. リポジトリに含まれている proj.android/ フォルダを開きます。
  1. [省略可] proj.android/gradle.properties を開き、PROP_APP_ABI を見つけます。ビルド時間を短縮するために、ターゲット アーキテクチャ以外のすべてを削除できます。PROP_APP_ABI=x86 はエミュレータ専用にビルドします。PROP_APP_ABI=armeabi-v7a はほとんどのスマートフォン向けにビルドします。
  2. [デバッグ] ボタン fa7d6449514b13c3.png をクリックして、ゲームをビルドして実行します。Cocos2dx ゲームエンジンのビルドには時間がかかります。

4. Firebase コンソールの設定

  1. Firebase コンソールで新しいプロジェクトを作成します。5d2552e8450338d3.png
  2. 「Popsicle Runner」などの名前を付けます。
  3. アナリティクスを有効にする 255468f27832bb18.png
  4. アナリティクスのアカウントを追加または作成する c7fa1b1004135be3.png
  5. プロジェクトに新しい Android アプリを追加する 984b9f20cd590597.png
  6. パッケージ名として「com.firebase.popsiclerunner」を追加します。

fda079aab5b185d4.png

  1. google-services.json をダウンロードして proj.android/app 95aae8dd12033335.png にコピーします。
  1. Firebase SDK を追加する手順は無視して、[次へ] をクリックします。
  2. インストールを確認するよう求められたら、[このステップをスキップ] をクリックできます。

5. ゲームに Firebase を追加する

CMakeLists.txt に Firebase SDK を追加する

ルートレベルの CMakeLists.txt を開きます。このコードの先頭付近に次のコードがあります。

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)

set(APP_NAME popsiclerunner)

project(${APP_NAME})

CMakeLists.txt ファイルの末尾に次の行を追加します。

CMakeLists.txt

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/firebase_cpp_sdk)
target_link_libraries(${APP_NAME} firebase_analytics firebase_app)

add_subdirectory には Firebase C++ SDK が含まれており、このゲームで使用できるようになっています

target_link_libraries Android 向けにビルドされた Firebase の C++ ライブラリにゲームをフックします。

Google サービス プラグインを追加する

Firebase SDK をフックするには、gradle ビルド スクリプトに Google サービス プラグインを追加する必要があります。これを行うには、プロジェクト レベルの build.gradle ファイル(proj.android フォルダにあります)を開きます。また、ビルド スクリプトの依存関係として classpath 'com.google.gms:google-services:4.3.3' を追加します。

build.gradle

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
    }
}

次に、モジュール レベルの build.gradle ファイル(proj.android/app フォルダにあります)にプラグインを追加します。apply plugin: 'com.android.application' の下に apply plugin: 'com.google.gms.google-services' を追加します。

build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

Gradle で C++ SDK を見つける

Gradle に Firebase C++ SDK の場所を伝えるには、settings.gradle ファイルの末尾に次の行を追加します。

settings.gradle

gradle.ext.firebase_cpp_sdk_dir = "$settingsDir/../third_party/firebase_cpp_sdk/"
includeBuild "$gradle.ext.firebase_cpp_sdk_dir"

Android の依存関係を追加する

Firebase の Android 依存関係をフックするには、popsicle_runnerproj.android/app/build.gradle 内)のモジュール レベルの Gradle ファイルを開き、末尾の一般的な dependences { セクションの直前に次の行を追加します。

build.gradle

apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
firebaseCpp.dependencies {
    analytics
}

AndroidX と Jetifier

gradle.properties を開き、末尾に以下を追加して、AndroidX と Jetifier のサポートを追加します。

gradle.properties

android.useAndroidX = true
android.enableJetifier = true

ゲームで Firebase を初期化する

Classes/AppDelegate.cpp を開いて、ゲームで Firebase を初期化します。次の #include ディレクティブを先頭に追加します。

AppDelegate.cpp

#include <firebase/app.h>
#include <firebase/analytics.h>

次に、App::Create を追加して、必要な Firebase 機能を初期化します。そのためには、AppDelegate::applicationDidFinishLaunching を検索して、auto scene = MainMenuScene::createScene() の前に次のコードを追加します。

AppDelegate.cpp

{
    using namespace firebase;
    auto app = App::Create(JniHelper::getEnv(), JniHelper::getActivity());
    analytics::Initialize(*app);
}

ゲームをデバッグして Firebase ダッシュボードを更新すると、1 分ほどで新しいユーザーが 1 人表示されます。

6. アナリティクスを追加する

開発の初期段階でも、アナリティクスはベータ版テスターがゲームをどのように利用しているかを測定するのに役立つツールです。定着率レポートなど、自動的に収集される分析情報もありますが、特定のゲームに合わせてカスタム イベントを追加すると便利です。

まず、プレーヤーがレベルを開始したときに分析イベントを記録することをおすすめします。レベル開始イベントの数を使用すると、プレーヤーがセッション内でゲームをリプレイする頻度を把握できます。

4b5df08c0f6b6938.png

また、プレーヤーが死亡したときに、どこまで進んだかを記録するイベントもログに記録します。これにより、変更が 1 回のセッションの長さにどのように影響するかを確認し、プレイヤーが短くて難しいゲームを好むか、長くて簡単なゲームを好むかを判断できます。

アナリティクスのヘッダーを追加する

Classes/PopsicleScene.cpp を開き、Firebase ヘッダーを先頭に追加して、分析呼び出しを行えるようにします。

PopsicleScene.cpp

#include <firebase/analytics.h>
#include <firebase/analytics/event_names.h>

Level Start イベントを記録する

この Scene が Cocos2dx Director によってステージングされたときにイベントをログに記録するには、スタブ関数 PopsicleScene::onEnter() を見つけます。ここに次のコードを入力して、Level Start イベントを記録します。

PopsicleScene.cpp

using namespace firebase;
analytics::LogEvent(analytics::kEventLevelStart);

レベル終了イベントをログに記録する

プレーヤーの進捗状況を確認するため、プレーヤーが死亡したときの進行状況とともにレベル終了イベントを記録しましょう。そのためには、PopsicleScene::gameOver() を見つけて、_gameOver = true; を設定する前に if(!_gameOver) { ブロックの末尾に次のコードを追加します。

PopsicleScene.cpp

{
    using namespace firebase;
    analytics::LogEvent(analytics::kEventLevelEnd, "distance", _lastDistance);
}

kEventLevelEnd はレベル終了イベントです。一方、"distance" は「イベント パラメータ」です。ここでは、最後に記録された距離を追加しています。これは、プレイヤーが死亡するまでに移動した距離を近似するのに適しています。

7. テストイベント

[デバッグ] fa7d6449514b13c3.png をクリックできるようになりましたが、イベントがアナリティクス ダッシュボードに報告されるまでには時間がかかります。これには 2 つの理由があります。1 つ目は、バッテリーを節約するためにイベントがバッチ処理され、1 時間に 1 回程度アップロードされること、2 つ目は、レポートが 24 時間ごとに生成されることです。

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

デバイスをデバッグモードにすることで、アナリティクス イベントをデバッグすることは可能です。

まず、Android Debug Bridge(ADB)がインストールされ、セットアップされていることを確認します。adb devices と入力すると、テストするデバイスが表示されます。

$ adb devices
List of devices attached
emulator-5554   device

次の adb shell コマンドを実行します。

adb shell setprop debug.firebase.analytics.app com.firebase.popsiclerunner

これにより、Firebase 向け Google アナリティクスにイベントを直ちに記録するよう指示し、テスト時にライブイベントが汚染されないように、通常のレポートから自動的に除外します。後でこの操作を元に戻す場合は、次のように入力します。

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

イベントの表示

Firebase コンソールで [DebugView] を開きます。84472ac3a7ad9aff.png

[デバッグ] fa7d6449514b13c3.png をクリックしてゲームをプレイします。新しいイベントは、ゲーム内で発生するとほぼ同時に表示されます。5e81dfa682497414.png

level_end イベントを展開すると、記録したカスタムの「距離」パラメータも表示されます。4451be4a6a97399c.png

8. テスターを見つける

次に、スタジオの内部、親しい友人、コミュニティなど、ゲームをプレイしてもらうユーザーを確保します。Firebase App Distribution を使用すると、プレーヤーをゲームに簡単に招待できます。

スタンドアロン バイナリのビルド

まず、[Build] > [Build Bundles(s) / APK(s)] > [Build APK(s)] 14c6bd5549cdb57a.png から共有するスタンドアロン APK をビルドします。

Android Studio に、ビルドされたファイルの場所を指定できるダイアログ ボックスが表示されます。見逃した場合は、[イベントログ] をクリックしてリンクを再度取得できます。ac730e3428689c4c.png

Firebase App Distribution にアップロードする

  1. App Distribution を開き、[始める] をクリックします。dcdafea94e4c1c15.png
  2. [.apk をここにドラッグして新しいリリースを作成します] と表示されているボックスに .apk ファイルをドラッグ&ドロップします。4b6f94a05391c63f.png
  3. 最初のテスターとしてメールアドレスを入力します。ce047d710befa44a.png
  4. [次へ] をクリックします。
  5. 説明を追加して [配信] をクリックする

テスターを招待する

メールアドレスを手動で入力する代わりに、招待リンクを作成できます。この招待リンクでユーザーをキャプチャする際に、テスターのグループに追加することもできます。たとえば、内部テスターと外部テスターを分離できます。

  1. [テスターとグループ] 7e380773faff4eb7.png をクリックします。
  2. 新しいグループ 6b046c010b14adaf.png を作成し、「Android テスター」などの名前を付けます。
  3. [招待リンク] a7fc2c8b01b6883e.png をクリックします。
  4. [新しい招待リンク] をクリックします。
  5. プルダウンからグループを設定します。d1b289e825d93d40.png
  6. [リンクを作成] をクリックします。
  7. [リンクをコピー] をクリックして、任意の手段で共有します。

9. 完了

C++ ベースのゲームにアナリティクスを追加し、友人を招待してプレイしてもらい、Android 開発で一般的な CMake ベースと Gradle ベースのビルドシステムで Firebase ライブラリを見つけてリンクする方法を学びました。

学習した内容

  • Android CMake ベースのゲームに Firebase を追加する方法。
  • 必要な C++ 依存関係と Gradle 依存関係を特定する方法。
  • アナリティクス イベントをログに記録する方法。
  • 分析イベントをデバッグする方法。
  • App Distribution でゲームを共有する方法。

次のステップ

  • ユーザーを匿名でログインさせ、ハイスコアを Realtime Database に保存してみましょう。
  • 独自のゲームでアナリティクス イベントをログに記録します。
  • iOS ゲームにアナリティクスを追加してみましょう。

詳細

  • ゲーム固有のイベントのリストを確認し、それらがご自身のゲームにどのように適合するかを検討してください。