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 のコードを開き、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. エディタが自動的に開かない場合は、[Assets] > [MainGameScene] を開きます。Unity Editor の [Project] タブで [Hamster] を選択します。

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

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

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

  1. Firebase コンソールで [プロジェクトを追加] をクリックします。
  2. 新しいプロジェクトを作成するには、目的のプロジェクト名を入力します。
    これにより、プロジェクト ID(プロジェクト名の下に表示)もプロジェクト名に基づいて設定されます。必要に応じて、プロジェクト 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 構成ファイルを追加する

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

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

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

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 学習プログラムを完了することをおすすめします。
  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](レベル選択)メニューでも同じことができます。

アプリの起動時に初期読み込みが行われると、メインメニューを経由するメニュー ナビゲーションは最初の処理によって処理されます。また、[レベル選択] メニューに再びアクセスすると、更新も行われます。レベル選択メニューへの最初のエントリは、メインメニューからのみアクセスできるため、すでにカバーされているため問題ありません。

アプリでこれを有効にするには、メインメニューとレベル選択ファイルで関連するメソッドを完了します。これにより、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 を実行してログを表示します。エディタで再生ボタンを押して Unity でコードを実行すると、[コンソール] タブにログが表示されます。

  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}}

    \nacceleration_tile_force が入力された 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 の残りの部分で使用します。[新しい条件を定義] ダイアログを使用して iOS 固有の条件を定義する
  6. [適用条件...] で [選択...] プルダウンをクリックし、[プラットフォーム] を選択します。次に、適切なプラットフォームを選択します。[新しい条件を定義] エディタを使用して iOS プラットフォームを選択する
  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 更新ハンドラを作成する

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. 「Error occurred while listening」で始まるログ メッセージが表示された場合は、残りの部分を読み、出力されたエラー メッセージでデバッグしてみてください。
  3. 「更新されたキー」で始まるログがある場合は変更された値をアプリが受け取っています。
  4. どちらも表示されない場合は、残りのログを調べてから、構成更新ハンドラを作成するの手順を再確認し、ログを再度テストし、問題がないか確認します。

12. 完了

Remote Config を使用して、アプリ内で値を取得し、条件を使用してさまざまなバリエーションを提供することによって、ゲーム内値をリモートで制御しました。

学習した内容

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

次のステップ

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