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 で使用されているため、このセクションのタスクをすでに完了している可能性があります。すでに追加されている場合は、この手順をスキップして、Firebase SDK for Unity を追加する手順に進み、サンプルゲーム コードに Remote Config を追加します。

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

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

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

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

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

  1. Unity Hub を起動し、[プロジェクト] タブで [開く] の横にあるプルダウン矢印をクリックします。
  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] フォルダに移動します。<ph type="x-smartling-placeholder">
  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 コンソールに移動し、設定ワークフローで [次へ] をクリックします。

Firebase SDK を Unity プロジェクトに追加する方法について詳しくは、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 によって生成されたログが含まれているはずです。「データの取得中...」と「リモートデータの読み込みが完了しました」というメッセージが表示されます。これらのメッセージの冒頭にあるタイムスタンプをメモします。
  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. アプリで定義し、次の表に記載されているパラメータごとに、[パラメータを追加] をクリックしてパラメータ名(キー)を貼り付け、表に記載されているデータ型を選択し、[アプリ内デフォルトを使用する] を無効にして、新しいデフォルト値を貼り付けます。

    パラメータ名(キー)

    データ型

    デフォルト値

    acceleration_tile_force

    数値

    100

    subtitle_override

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

12. 完了

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

学習した内容

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

次のステップ

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