Firebase Remote Config を使用して Unity ゲームをインストルメント化する

1. はじめに

Firebase Remote Config を使用すると、アプリでキーと値のペア(パラメータとも呼ばれます)を定義し、クラウドでその値を更新できるため、アプリのアップデートを配布せずにアプリの外観と動作を変更できます。

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

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

コマンド ラインからこのコードラボの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 エディターの [プロジェクト]タブの[アセット] > [ハムスター]MainGameSceneを開きます。

Unity のインストールと使用の詳細については、 「Unity での作業」を参照してください。

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

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

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

アプリを Firebase に登録する

  1. Firebase コンソールを開き、プロジェクト概要ページの中央にある Unity アイコンをクリックしてセットアップ ワークフローを起動するか、すでにアプリを Firebase プロジェクトに追加している場合は、 [アプリを追加]をクリックしてプラットフォーム オプションを表示します。
  2. Apple (iOS) と Android の両方のビルド ターゲットを登録する場合に選択します。
  3. Unity プロジェクトのプラットフォーム固有の ID を入力します。このコードラボでは、次のように入力します。
  4. 必要に応じて、Unity プロジェクトのプラットフォーム固有のニックネームを入力します。
  5. [アプリの登録]をクリックし、 [構成ファイルのダウンロード]セクションに進みます。
  6. 初めて実行しなかったビルド ターゲットに対してこのプロセスを繰り返します。

Firebase設定ファイルを追加する

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

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

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

Unity 用の Firebase SDK を追加する

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

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

4. Remote Config のデフォルトを設定し、新しい値を取得します

このコードラボでは、コードで定義された値を使用するオブジェクト、または Remote Config で計測された値を使用するように Unity エディターでシリアル化されたオブジェクトを更新します。 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# タスク APIへの拡張機能がいくつか含まれています。
  2. 既存のStart()メソッドを現在未実装の InitializeFirebaseAndStartGame() メソッドに置き換えることにより、Firebase の初期化をMainGame.cs Start( InitializeFirebaseAndStartGame()メソッドに追加します
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. MainGame.csで、 InitializeFirebaseAndStartGame()を見つけます。アプリ変数を宣言し、次のようにメソッドの実装を上書きします:
    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コールバックとして渡すことです。レベル選択メニューでも同じことができます。

アプリ起動の一部としての初期ロードでは、メイン メニューを経由するメニュー ナビゲーションは最初のメニューによって処理されますが、レベル選択メニューに再度入ると更新も行われます。レベル選択メニューへの最初の入り口は、メイン メニューからのみアクセスでき、すでに説明されているため、重要ではありません。

アプリでこれを有効にするには、メイン メニューとレベル選択ファイルで関連するメソッドを完了します。これにより、 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. ゲームのメイン メニューが表示されたら、ゲームのログ出力を確認します。これには、 FetchRemoteConfigおよびActivateRetrievedRemoteConfigValuesDebug.Logによって生成されたログが含まれているはずです。これらには、「データを取得中...」および「リモート データがロードされ、準備ができました」というメッセージが表示されます。これらのメッセージの先頭にあるタイムスタンプに注目してください。
  3. ゲーム内で、 「ライセンス」を押します。
  4. [OK]を押します。
  5. ゲームのメインメニューが表示されるまで待ちます。
  6. ゲームのログ出力を確認します。これは、新しいタイムスタンプ (ゲームを実行しているシステム クロックに設定されている時刻と一致します) を使用して、前の手順のログ出力と同様である必要があります。
  7. ゲーム内で、 「Play」を押します。
  8. 「Let's Roll」を押します。
  9. キーボードの矢印を使用してボールをゴールまで移動すると、レベル完了メニューが開きます。
  10. [レベル]を押します。
  11. レベル選択メニューがロードされるまで待ちます。
  12. ゲームのログ出力をもう一度確認してください。これは、より新しいタイムスタンプ (ゲームを実行しているシステム クロックに設定されている時刻と一致する) を持つ、前の手順のログ メッセージと一致する必要があります。

これらのいずれかがアプリに表示されない場合は、フェッチおよびアクティブ化フローの一部 (またはデバイス) が正しく構成されていない可能性があります。最初のログが表示されない場合は、ゲームが起動しない可能性があります。エディター コンソールまたはデバイス/エミュレーターのログでプロジェクト/環境に関する警告とエラーを確認し、調査します。問題はインターネットへの接続と同じくらい単純である可能性があります。

メニューのロードによる最初のログが表示されるが、その後のログのいずれかが表示されない場合は、 Assets/Hamster/Scripts/States/MainMenu.csおよびAssets/Hamster/Scripts/States/BaseLevelSelect.csResumeメソッドを調査/再実装します。

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

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

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

  1. using Firebase.RemoteConfig;次のファイルの先頭に追加します。
    • 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 サーバーでパラメータと値を構成する準備が整いました。このコードラボでは、Firebase コンソールを使用してこれを設定します。

  1. Firebase コンソールで、プロジェクトを開きます。
  2. メニューから [Remote Config] を選択して、Remote Config ダッシュボードを表示します。
  3. アプリで定義し、次の表にリストされている各パラメーターについて、 「パラメーターの追加」をクリックし、パラメーター名 (キー) を貼り付け、表にリストされているデータ型を選択し、 「アプリ内デフォルトの使用」を無効にして、新しいデフォルト値:

    パラメータ名(キー)

    データ・タイプ

    デフォルト値

    加速タイル力

    番号

    100

    サブタイトル_オーバーライド

    JSON

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

    Remote Config Parameter editor with\nacceleration_tile_force populated
  4. 「保存」をクリックして変更を保存します。
  5. 「公開」をクリックして新しい構成を公開し、新しい値をゲームで使用できるようにします。
  6. これらのリモート パラメーターを設定した後にアプリを再度実行し、元のデフォルトがどのようにオーバーライドされるかを観察します。 Mechahamster main screen with Debug\nMenu enabled

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

ユーザーが話す言語、ユーザーがいる場所、時刻、または使用するプラットフォームに基づいて、ユーザーに合わせたアプリ エクスペリエンスを提供したい場合があります。 Remote Config 条件を使用すると、これらの属性とその他の属性を個別にまたは組み合わせて使用​​して、さまざまな値 (バリアントと呼ばれます) をユーザーに提供できます。

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

  1. Firebase コンソールでプロジェクトの [Remote Config] タブを開きます。
  2. subtitle_override.
  3. 左下隅にある[新規追加]をクリックします。
  4. 表示されるドロップダウンで、 「条件値」の上にマウスを置き、 「新しい条件の作成」をクリックします。 Remote Config parameter editor:\nConditional value option
  5. プロンプトが表示されたら、iOS をターゲットにする場合は「is iOS」、Android をターゲットにする場合は「is Android」という条件に名前を付けます。両方をターゲットにしている場合は、ここで 1 つを選択し、それをコードラボの残りの部分で使用します。 Using the Define a new condition\ndialog to define an iOS-specific condition
  6. [適用条件]で、 [選択]ドロップダウンをクリックし、 [プラットフォーム]を選択します。次に、適切なプラットフォームを選択します。 Using the Define a new condition\neditor to select the iOS platform
  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 テンプレートが自動的にフェッチされ、サブスクライブされたハンドラーが呼び出され、新しい値をアクティブにしてアプリケーションの残りの部分で使用できるようにするなど、応答としてロジックを実行するために使用できます。

リアルタイムのリモート設定を実装する

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

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

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.");
         });
   }

このメソッドは、新しい値をアクティブ化するときに、更新されたキーのリストと成功メッセージをログに出力します。

更新イベントを購読する

イベントが呼び出されたときに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. 「更新されたキー」で始まるログが表示された場合、アプリは変更された値を受信して​​います。
  4. これらのどちらも表示されない場合は、残りのログに目を通し、 「構成更新ハンドラーの作成」の手順を再確認し、ログを再テストして再チェックし、何か問題があるかどうかを判断します。

12. おめでとうございます!

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

私たちがカバーした内容

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

次のステップ

アプリ インスタンスが複数の値を持つパラメーターを使用する場合 (条件または局所性により)、どの値が取得されるかのロジックをより深く理解するには、パラメーター値の優先順位についてお読みください。