Firebase Remote Config を使用して Unity ゲームを計測可能にする

1. はじめに

Firebase Remote Config を使用すると、アプリ内で Key-Value ペア(パラメータ)を定義し、その値をクラウドで更新できます。これにより、アプリのアップデートを配布しなくても、アプリの外観や動作を変更できます。

この新機能をサンプルゲーム MechaHamster: Level Up with Firebase Edition に追加します。このサンプルゲームは従来の Firebase ゲーム MechaHamster の新しいバージョンであり、組み込みの Firebase 機能の大部分が削除されており、Firebase の新しい使用方法を実装できます。

アプリが意図したとおりに動作するように、サンプル ゲームコードで値のデフォルト構成を設定します。これらの値は、Firebase コンソールの Remote Config で設定した値でオーバーライドできます。

学習内容

  • クラウドで Remote Config の値を設定して取得する方法
  • Unity C# コードをインストルメント化して、取得した値を自動的に使用する方法
  • 複合値/オブジェクトを JSON 値として格納、計測、オーバーライドする方法
  • Remote Config の条件を使用して、ユーザー グループごとに異なる値のバリエーションを提供する方法

必要なもの

  • iOS または Android のビルドをサポートする Unity 2019.1.0f1 以降
  • ゲームをビルドして実行するための物理的な Android/iOS デバイスまたはシミュレータ/エミュレータ

2. 開発環境を設定する

以下のセクションでは、Level Up with Firebase コードをダウンロードして Unity で開き、Firebase プロジェクトを追加する方法について説明します。この Level Up with Firebase サンプルゲームは、Firebase と Unity の他の Codelab で使用されているため、このセクションのタスクをすでに完了している可能性があります。その場合は、この手順をスキップして「Unity 用 Firebase SDK を追加する」に進み、Remote Config をサンプルゲームコードに追加できます。

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

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

git clone https://github.com/firebase/level-up-with-firebase

Git がインストールされていない場合は、リポジトリを ZIP ファイルとしてダウンロードできます。

Unity エディタで [Level Up with Firebase] を開きます

  1. Unity Hub を起動し、[Projects] タブで [Open] の横にあるプルダウン矢印をクリックします。
  2. [ディスクからプロジェクトを追加] をクリックします。
  3. コードが含まれているディレクトリに移動し、[OK] をクリックします。
  4. プロンプトが表示されたら、使用する Unity エディタのバージョンとターゲット プラットフォーム(Android または iOS)を選択します。
  5. プロジェクト名 [level-up-with-firebase] をクリックすると、Unity エディタでプロジェクトが開きます。
  6. エディタが自動的に開かない場合は、Unity エディタの [Project] タブで [Assets] > [Hamster] を開き、MainGameScene を開きます。

Unity のインストールと使用方法について詳しくは、Unity での操作をご覧ください。

3. Firebase を Unity プロジェクトに追加する

Firebase プロジェクトを作成する

  1. Firebase コンソールで [プロジェクトを追加] をクリックします。
  2. 新しいプロジェクトを作成するには、目的のプロジェクト名を入力します。
    これにより、プロジェクト ID(プロジェクト名の下に表示される)もプロジェクト名に基づいて設定されます。必要に応じて、プロジェクト ID の編集アイコンをクリックして、さらにカスタマイズできます。
  3. Firebase の利用規約が表示されたら、内容を読み、同意します。
  4. [続行] をクリックします。
  5. [このプロジェクトの Google アナリティクスを有効にする] オプションを選択し、[続行] をクリックします。
  6. 使用する既存の Google アナリティクス アカウントを選択するか、[新しいアカウントを作成] を選択して新しいアカウントを作成します。
  7. [プロジェクトの作成] をクリックします。
  8. プロジェクトが作成されたら、[続行] をクリックします。

アプリを Firebase に登録する

  1. Firebase コンソールを開き、プロジェクトの概要ページの中央にある Unity アイコンをクリックして設定ワークフローを起動します。または、すでに Firebase プロジェクトにアプリを追加している場合は、[アプリを追加] をクリックしてプラットフォームのオプションを表示します。
  2. Apple(iOS)と Android の両方のビルド ターゲットを登録する場合に選択します。
  3. Unity プロジェクトのプラットフォーム固有の ID を入力します。この Codelab では、次のように入力します。
    • Apple(iOS)の場合 - [iOS バンドル ID] フィールドに「com.google.firebase.level-up」と入力します。
    • Android の場合 - [Android パッケージ名] フィールドに「com.google.firebase.level_up」と入力します。
  4. 必要に応じて、Unity プロジェクトのプラットフォーム固有のニックネームを入力します。
  5. [アプリを登録] をクリックし、[構成ファイルのダウンロード] セクションに進みます。
  6. 最初に行わなかったビルド ターゲットについて、この手順を繰り返します。

Firebase 構成ファイルを追加する

[Register app] をクリックすると、2 つの構成ファイル(ビルド ターゲットごとに 1 つの構成ファイル)をダウンロードするよう求められます。Unity プロジェクトで Firebase に接続するには、これらのファイルに Firebase メタデータを含める必要があります。

  1. 使用可能な両方の構成ファイルをダウンロードします。
    • Apple(iOS): GoogleService-Info.plist をダウンロードします。
    • Android の場合: google-services.json をダウンロードします。
  2. Unity プロジェクトの [Project] ウィンドウを開き、両方の構成ファイルを [Assets] フォルダに移動します。
  3. Firebase コンソールの設定ワークフローに戻り、[次へ] をクリックして「Firebase SDK for Unity を追加する」に進みます。

注: プロジェクトの全般設定を開き、[マイアプリ] セクションまで下にスクロールして、目的の構成ファイルのダウンロード ボタンをクリックすると、これらのファイルをいつでも再ダウンロードできます。

Unity 用の Firebase SDK を追加する

  1. Firebase コンソールで [Firebase Unity SDK をダウンロード] をクリックします。
  2. 適切な場所で SDK を解凍します。
  3. 開いている Unity プロジェクトで、[Assets] > [Import Package] > [Custom Package] に移動します。
  4. [Import package] ダイアログで、解凍した SDK を含むディレクトリに移動し、[FirebaseAnalytics.unitypackage] を選択して [Open] をクリックします。
  5. 表示された [Import Unity Package] ダイアログで、[Import] をクリックします。
  6. 上記の手順を繰り返して、次の 2 つのパッケージをインポートします。
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics は軽量なリアルタイム クラッシュ レポーターです。アプリの品質を損なう安定性の問題を追跡し、優先順位を付け、修正するのに役立ちます。これまでにご利用になったことがない場合は、Unity 向け Crashlytics Learning Pathway を受講することをご検討ください。
  7. Firebase コンソールに戻り、設定ワークフローで [次へ] をクリックします。

Unity プロジェクトに Firebase SDK を追加する方法について詳しくは、その他の Unity インストール オプションをご覧ください。

4. Remote Config のデフォルト値を設定して新しい値をフェッチする

この Codelab では、コードで定義された値や Unity エディタでシリアル化されたオブジェクトを更新し、Remote Config で計測された値を使用します。SetDefaultsAsync を使用して各パラメータのデフォルト値を構成することで、アプリが Remote Config バックエンドに接続する前に意図したとおりに動作できるようにします。Remote Config から新しい値をフェッチして有効化し、コード内で使用可能にすることで、アプリを最新の状態に保つことができます。

Remote Config から新しい値をフェッチするには、Assets/Hamster/Scripts/MainGame.cs ファイルに未実装のメソッドがいくつかありますが、これらを完了する必要があります。

  1. 次の using ステートメントを MainGame.cs に追加します。
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    Firebase.Extensions モジュールには、C# Tasks API の拡張機能が含まれています。これにより、コールバックを使用した初期化プロセスの管理が簡単になります。
  2. 既存の InitializeCommonDataAndStartGame() メソッドを現在実装されていないメソッド InitializeFirebaseAndStartGame() に置き換えて、Firebase の初期化を MainGame.cs Start() メソッドに追加します。
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. MainGame.csInitializeFirebaseAndStartGame() を見つけます。次のようにアプリ変数を宣言し、メソッドの実装を上書きします。
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
       Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
       .ContinueWithOnMainThread(
          previousTask =>
          {
             var dependencyStatus = previousTask.Result;
             if (dependencyStatus == Firebase.DependencyStatus.Available) {
             // Create and hold a reference to your FirebaseApp,
             app = Firebase.FirebaseApp.DefaultInstance;
             // Set the recommended Crashlytics uncaught exception behavior.
             Crashlytics.ReportUncaughtExceptionsAsFatal = true;
             SetRemoteConfigDefaults();
             } else {
             UnityEngine.Debug.LogError(
                $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
                "Firebase Unity SDK is not safe to use here");
             }
          });
    }
    
  4. Firebase の初期化が成功すると、SetRemoteConfigDefaults を呼び出してアプリ内のデフォルト値が設定されます。未実装の SetRemoteConfigDefaults メソッドを次のように置き換えます。
    private void SetRemoteConfigDefaults()
    {
       var defaults = new System.Collections.Generic.Dictionary < string, object > ();
       defaults.Add(
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceKey,
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceDefault);
       defaults.Add(
          Hamster.States.MainMenu.SubtitleOverrideKey,
          Hamster.States.MainMenu.SubtitleOverrideDefault);
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.SetDefaultsAsync(defaults).ContinueWithOnMainThread(
          previousTask =>
          {
             FetchRemoteConfig(InitializeCommonDataAndStartGame);
          }
       );
    }
    

5. 新しい値をフェッチして有効にする(必要に応じて)

次に、既存の FetchRemoteConfig メソッドを完成させる必要があります。これにより、onFetchAndActivateSuccessful という名前のコールバック パラメータを使用して、Remote Config のメソッド FetchAsync(Remote Config から新しい値をフェッチする)と ActivateAsync(取得した値をアクティブ化してコードで使用できるようにする)の呼び出しが連結されます。

前の手順で追加した起動コードは、シーケンスの最後にゲームを開始するために、コールバックとして InitializeCommonDataAndStartGame を指定して FetchRemoteConfig を呼び出します。FetchRemoteConfig に代替コールバックを渡して、異なる結果でフェッチを呼び出すことができます。例(後で実装)は、Remote Config の値に依存する新しい UI メニューを開くメソッドを渡しています。これにより、これらの値が取得されてアクティブになった場合にのみメニューが開きます。

  1. 以下のコードを FetchRemoteConfig に貼り付けます。
    public void FetchRemoteConfig(System.Action onFetchAndActivateSuccessful)
    {
       if(app==null)
       {
          Debug.LogError($"Do not use Firebase until it is properly initialized by calling {nameof(InitializeFirebaseAndStartGame)}.");
          return;
       }
    
       Debug.Log("Fetching data...");
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.FetchAsync(System.TimeSpan.Zero).ContinueWithOnMainThread(
          previousTask=>
          {
             if (!previousTask.IsCompleted)
             {
             Debug.LogError($"{nameof(remoteConfig.FetchAsync)} incomplete: Status '{previousTask.Status}'");
             return;
             }
             ActivateRetrievedRemoteConfigValues(onFetchAndActivateSuccessful);
          });
    }
    
  2. 次に、渡されたコールバック onFetchAndActivateSuccessful を受け取る ActivateRetrievedRemoteConfigValues メソッドを完成させます。有効化が完了すると、指定されたコールバックが呼び出されます。
    private void ActivateRetrievedRemoteConfigValues(System.Action onFetchAndActivateSuccessful)
    {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var info = remoteConfig.Info;
       if(info.LastFetchStatus == LastFetchStatus.Success)
       {
          remoteConfig.ActivateAsync().ContinueWithOnMainThread(
             previousTask =>
             {
             Debug.Log($"Remote data loaded and ready (last fetch time {info.FetchTime}).");
             onFetchAndActivateSuccessful();
             });
       }
    }
    

初期化コンテキストから SetRemoteConfigDefaults によってダウンストリームで呼び出されると、ActivateRetrievedRemoteConfigValues は前の開始点である InitializeCommonDataAndStartGame を呼び出し、メインメニューを開いてゲームを開始します。

6. Remote Config の読み込み方法を設定する

アプリの使用中に値をフェッチして有効化するには、これらの関数を再度呼び出す必要があります。また、いずれかのオブジェクトが値をキャッシュに保存している場合は、更新を実行するよう通知する必要があります。Remote Config の値を再フェッチする戦略を策定するには、新しい値が必要なタイミングと、新しい値のフェッチと有効化をいつ開始して使用中に変更されないようにするのかを検討します。

現在実装されているように、Remote Config の値はアプリの起動時にフェッチされ、有効になります。メニューの変更中は取得が非表示になり、移行中は操作がブロックされることがあります。また、多くの場合、このタイミングが新しい値を取得するのに最も適しています。なぜなら、多くの場合、メニューの状態の変化はプレーヤーの「どこに」かを把握し、値が使用されることを予測するためにも使用されます。

Mechahamster のメニュー システムを見ると、UI ブロッキング メニューの更新を追加する最も簡単な方法は、メインメニューが再開される前(具体的には、別のメニューから戻ってアクセスしたとき)に呼び出し、UI 表示メソッドを onFetchAndActivateSuccessful コールバックとして渡すことです。[Level Select](レベル選択)メニューでも同じことができます。

アプリ起動時の初期読み込みでは、メインメニューを通過するメニュー ナビゲーションは、これらの最初のメニューによって処理されますが、[Level Select] メニューが再度表示されると更新も行われます。レベル選択メニューへの最初の入口は重要ではありません。メインメニューからしかアクセスできないため、すでに説明されています。

アプリでこれを有効にするには、メインメニューとレベル選択ファイルで関連するメソッドを完了します。これにより、FetchAsyncActivateAsync が完了するまで UI の表示がブロックされます。

  1. Assets/Hamster/Scripts/States/MainMenu.cs を開き、既存の Resume メソッドを次のように置き換えます。
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true);
       CommonData.mainGame.FetchRemoteConfig(InitializeUI);
    }
    
  2. ファイルを保存します。
  3. Assets/Hamster/Scripts/States/BaseLevelSelect.cs を開き、既存の Resume メソッドを次のように置き換えます。
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.FetchRemoteConfig(ShowUI);
    }
    
  4. ファイルを保存します。

7. 取得動作のデバッグ/検証

この時点で、診断/検証チェックを行うと便利です。次の手順では、アプリを手動でテストし、Remote Config の値をフェッチして有効にする方法をテストできます。

この情報は、シミュレータ、デバイス、またはエディタのログの一部として出力されます。iOS の場合、Xcode でデバイスとシミュレータのログを表示できます。Android の場合は、adb logcat を実行してログを表示します。エディタで [Play] を押して Unity でコードを実行すると、[Console] タブにログが表示されます。

  1. アプリを再ビルドして実行します(エディタで、デバイスまたはシミュレータを使用します)。
  2. ゲームのメインメニューが表示されたら、ゲームのログ出力を確認します。このログには、FetchRemoteConfigActivateRetrievedRemoteConfigValuesDebug.Log によって生成されたログが含まれています。「Fetching data...」と「Remote data load and ready」というメッセージが表示されます。これらのメッセージの冒頭にあるタイムスタンプに注意してください。
  3. ゲーム内で [ライセンス] を押します。
  4. [OK] を押します。
  5. ゲームのメインメニューが表示されるまで待ちます。
  6. ゲームのログ出力を確認します。ログ出力は、前の手順と同様に、新しいタイムスタンプ(ゲームを実行しているシステム クロックで設定された時間と一致)で確認します。
  7. ゲームで [プレイ] を押します。
  8. [Let's Roll] を押します。
  9. キーボードの矢印キーを使用してボールをゴールまで動かすと、レベルクリア メニューが開きます。
  10. [レベル] を押します。
  11. [レベル選択] メニューが読み込まれるまで待ちます。
  12. ゲームのログ出力をもう一度確認します。これは、前のステップのログメッセージと、より新しいタイムスタンプ(ゲームを実行しているシステム クロックで設定された時刻)と一致しているはずです。

いずれかがアプリに表示されない場合は、取得と有効化のフローの一部(またはデバイス)が誤って設定されている可能性があります。最初のログが表示されない場合、ゲームが起動していない可能性があります。プロジェクト/環境に関する警告やエラーがないか、エディタのコンソールやデバイス/エミュレータのログで確認し、調査します。問題はインターネットに接続するだけで済む場合もあります。

メニューを読み込んだときに最初のログが表示されても、後続のログのいずれかが表示されない場合は、Assets/Hamster/Scripts/States/MainMenu.csAssets/Hamster/Scripts/States/BaseLevelSelect.csResume メソッドを調査または再実装します。

8. コードをインストルメント化する

SetDefaultsAsync() でアプリ内パラメータ値を設定し、FetchAsync()ActivateAsync() で最新バージョンを利用できるようにしました。次は、これらの値をコードで参照して使用します。

Remote Config バックエンドで値を設定し、フェッチして有効にすると(または両方を一度に)、それらの値をアプリで使用できるようになります。これらの値を使用するには、GetValue(string key) を呼び出し、引数としてパラメータキーを選択します。これは ConfigValue を返します。これには、サポートされているさまざまな型(stringboollongdouble)として値にアクセスするためのプロパティがあります。このプロジェクトとほとんどのゲームのユースケースでは、最後の 2 つのタイプをより慣用的な intfloat にキャストする必要があります。これらの変換が問題を引き起こさないようにするには、Remote Config で設定された初期値が、アプリコードで使用するタイプの有効な範囲内にあることを確認してください。

  1. 次のファイルの先頭に using Firebase.RemoteConfig; を追加して、Remote Config をインポートします。
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. AccelerationTile.csStart メソッドを置き換えます。
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    この変更により、アクセラレーション タイルによって付加される力の強さが、Remote Config から受け取る力に変更されます。
  3. MainMenu.csInitializeUI メソッドの本文を編集します。
    private void InitializeUI() {
       if (menuComponent == null) {
          menuComponent = SpawnUI<Menus.MainMenuGUI>(StringConstants.PrefabMainMenu);
       }
    
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var subtitleOverride = JsonUtility.FromJson<Menus.MainMenuGUI.SubtitleOverride>(
          remoteConfig.GetValue(SubtitleOverrideKey).StringValue);
       // Only sets values if all fields of the override are non-default.
       if(subtitleOverride != null && subtitleOverride.IsValidOverride())
       {
          menuComponent.MenuSubtitleText.text = subtitleOverride.text;
          menuComponent.MenuSubtitleText.fontSize = subtitleOverride.fontSize;
          menuComponent.MenuSubtitleText.color = subtitleOverride.textColor;
       }
       ShowUI();
    }
    
    ここでは、クラウド内のすべてのフィールドが型のデフォルト値以外の値に設定されている場合に、subtitleOverride はメインメニュー画面のサブタイトルを変更するように設定されています。

9. パラメータ値をリモートで設定

アプリが完全に計測可能になったので、Remote Config サーバーでパラメータと値を構成する準備が整いました。この Codelab では、Firebase コンソールを使用してこれを設定します。

  1. Firebase コンソールでプロジェクトを開きます。
  2. メニューから [Remote Config] を選択して Remote Config ダッシュボードを表示します。
  3. アプリで定義した下記の表に記載されているパラメータごとに、[Add parameter] をクリックし、パラメータ名(キーを貼り付け)を貼り付けて、表にリストされている [Data type] を選択して、[Use in-app default] を無効にして、新しいデフォルト値を貼り付けます。

    パラメータ名(キー)

    データ型

    デフォルト値

    acceleration_tile_force

    数値

    100

    字幕のオーバーライド

    JSON

    {"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}

    acceleration_tile_force が\n 入力された Remote Config パラメータ エディタ
  4. [保存] をクリックして、変更を保存します。
  5. [公開] をクリックして新しい構成を公開し、新しい値をゲームで使用できるようにします。
  6. これらのリモート パラメータを設定した後、アプリを再度実行し、元のデフォルト設定がオーバーライドされる様子を確認します。デバッグ\n メニューを有効にした Mechahamster のメイン画面

10. Remote Config の条件を使用してバリアントを提供する

ユーザーが話す言語、ユーザーの所在地、時間帯、使用しているプラットフォームに応じて、そのユーザー向けにアプリのエクスペリエンスをカスタマイズすることをおすすめします。Remote Config の条件によって、これらの属性と他の属性を個別に、または組み合わせて使用して、異なる値(バリエーションと呼ばれる)をユーザーに表示できます。

条件の一般的な用途の 1 つは、iOS プラットフォームと Android プラットフォームの間でコンテンツを変更することです。以下の手順に沿って、使用しているプラットフォームに応じて subtitle_override に異なる値を提供する条件を実装します。

  1. Firebase コンソールでプロジェクトの [Remote Config] タブを開きます。
  2. subtitle_override. の編集ボタンをクリックします
  3. 左下の [新しく追加] をクリックします。
  4. 表示されたプルダウンで、[条件値] にカーソルを合わせ、[新しい条件を作成] をクリックします。Remote Config パラメータ エディタ:\n 条件値オプション
  5. プロンプトが表示されたら、iOS をターゲットとする場合は「is iOS」、Android をターゲットとする場合は「is Android」という条件に名前を付けます。両方をターゲットにする場合は、ここでいずれか 1 つを選択し、Codelab の残りの部分でそれを使用します。[Define a new condition] ダイアログを使用して\niOS 固有の条件を定義する
  6. [適用する...] で [選択...] プルダウンをクリックし、[プラットフォーム] を選択します。次に、適切なプラットフォームを選択します。[Define a new condition] エディタを使用して\niOS プラットフォームを選択する
  7. [条件を作成] をクリックして条件を作成します。[パラメータを編集] ダイアログが再表示され、値を設定できるようになります。
    • Android を対象としている場合は、[] を次のように設定します。
      {"text":"Level Up Android Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
    • iOS を対象としている場合は、[] を次のように設定します。
      {"text":"Level Up iOS Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
  8. [保存] をクリックして、変更を保存します。
  9. [公開] をクリックして新しい構成を公開し、新しい値をゲームで使用できるようにします。

ゲームを再度ビルドして実行すると、ゲームのサブタイトルがプラットフォーム固有のバリアントに置き換えられます。

11. リアルタイムで更新を受信するように Remote Config を構成する

Remote Config は、Remote Config テンプレートの更新をリアルタイムでリッスンして処理できるようになりました。アプリで新しいリアルタイム Remote Config API をサブスクライブして、構成の変更と更新された値をリッスンできます。

仕組み

更新をリッスンするには、OnConfigUpdateListener イベントにサブスクライブするメソッドをアプリに実装する必要があります。1 つ以上の構成更新リスナーがサブスクライブされると、新しい Remote Config テンプレートが自動的にフェッチされ、サブスクライブされたハンドラが呼び出されます。このハンドラは、新しい値をアクティブ化してアプリケーションの他の部分で使用できるようにするなど、レスポンスとしてロジックを実行するために使用できます。

リアルタイム Remote Config を実装する

これがゲーム内でどのように機能するかを説明するため、コードに次の変更を加えます。

構成更新ハンドラを作成する

Config Update イベントを使用するための最初のステップは、このイベントをリッスンできるメソッドを作成することです。次のメソッドを Assets/Hamster/Scripts/MainGame.cs に配置します。

   void ActivateValuesOnConfigUpdate( object sender, ConfigUpdateEventArgs args)
   {
      if (args.Error != RemoteConfigError.None) {
         Debug.Log($"Error occurred while listening: {args.Error}");
         return;
      }

      Debug.Log("Updated keys: " + string.Join(", ", args.UpdatedKeys));
      // Activate all fetched values and then logs.
      var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
      remoteConfig.ActivateAsync().ContinueWithOnMainThread(
         task => {
            Debug.Log($"Keys from {nameof(ActivateValuesOnConfigUpdate)} activated.");
         });
   }

このメソッドにより、新しい値が有効になると、更新されたキーのリストと成功メッセージがログに出力されます。

Update イベントに登録する

イベントが呼び出されたときに ActivateValuesOnConfigUpdate を有効にするには、イベントにサブスクライブします。Assets/Hamster/Scripts/MainGame.csInitializeCommonDataAndStartGame() メソッドを次のように置き換えます。

   void InitializeCommonDataAndStartGame()
   {
      CommonData.prefabs = FindObjectOfType<PrefabList>();
      CommonData.mainCamera = FindObjectOfType<CameraController>();
      CommonData.mainGame = this;

      Screen.orientation = ScreenOrientation.LandscapeLeft;

      musicPlayer = CommonData.mainCamera.GetComponentInChildren<AudioSource>();

      CommonData.gameWorld = FindObjectOfType<GameWorld>();

      // Set up volume settings.
      MusicVolume = PlayerPrefs.GetInt(StringConstants.MusicVolume, MaxVolumeValue);
      // Set the music to ignore the listeners volume, which is used for sound effects.
      CommonData.mainCamera.GetComponentInChildren<AudioSource>().ignoreListenerVolume = true;
      SoundFxVolume = PlayerPrefs.GetInt(StringConstants.SoundFxVolume, MaxVolumeValue);

      // Subscribes to on config update after first initial fetch and activate
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener += ActivateValuesOnConfigUpdate;

      stateManager.PushState(new States.MainMenu());
   }

新しい行(末尾が += ActivateValuesOnConfigUpdate;)は、イベント ハンドラをイベントに登録します。

ハンドラを所有するオブジェクトが破棄されたときに登録解除する

null 参照エラーを防ぐため、イベントにサブスクライブされているメソッドを含むオブジェクトは、破棄されたときにメソッドを登録解除する必要があります。次のメソッドを Assets/Hamster/Scripts/MainGame.cs に追加します。

   private void OnDestroy() 
   {
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ActivateValuesOnConfigUpdate;
   }

新機能をテストする

新しい機能を検証するには、ビルドしたアプリを試します。以下の手順を行うには、実際のデバイスを使用してログを読み取ってデバッグする必要があります。

acceleration_tile_force を変更して監視する

アプリを起動したら、Firebase コンソールの [Remote Config] セクションで次の操作を行います。

  1. acceleration_tile_force の横にある編集ボタンを押します。

dc602d4db54e50a4.png

  1. 値を「120」に変更し、[保存] をクリックします。

fcbc1df848f88009.png

  1. [変更を公開] ボタンをクリックします。

3785c1e00e7a6359.png

  1. ログを調べます。
  2. 「エラーが発生しました」で始まるログメッセージが表示された場合は、残りの部分を読み、出力されるエラー メッセージを使用してデバッグしてみてください。
  3. 「Updated keys」で始まるログがある場合、アプリは変更された値を受信しています。
  4. どちらも表示されない場合は、残りのログを調べてから、構成更新ハンドラを作成するの手順を再度確認し、ログを再度テストし、問題がないか確認します。

12. お疲れさまでした

これで、Remote Config を使用してゲーム内の値をアプリ内でフェッチし、さまざまなバリアントを提供するための条件を使用して、ゲーム内の値をリモートで制御できました。

学習した内容

  • Remote Config の値を設定および取得する方法
  • 取得した値を使用するように Unity C# コードをインストルメント化する方法
  • 複合値/オブジェクトを JSON 値として格納、計測、オーバーライドする方法
  • Remote Config の条件を使用して異なる値のバリエーションを提供する方法

次のステップ

アプリ インスタンスが(条件や局所性により)複数の値を持つパラメータを使用する場合に、どの値がどの値を取得するかのロジックについては、パラメータ値の優先度をご覧ください。