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

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

この Codelab について

subject最終更新: 8月 23, 2023
account_circle作成者: Joe Spiro, Arthur Thompson

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 プロジェクトを追加する方法について説明します。この 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 エディタで 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. Unity プロジェクトに Firebase を追加する

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 構成ファイルを追加する

[アプリを登録] をクリックすると、2 つの構成ファイル(ビルド ターゲットごとに 1 つの構成ファイル)をダウンロードするよう求められます。Firebase に接続するには、Unity プロジェクトにこれらのファイル内の 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. [パッケージをインポート] ダイアログで、解凍した SDK を含むディレクトリに移動し、FirebaseAnalytics.unitypackage を選択して [開く] をクリックします。
  5. 表示された [Import Unity Package] ダイアログで、[Import] をクリックします。
  6. 上記の手順を繰り返して、次の 2 つのパッケージをインポートします。
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics は軽量なリアルタイムのクラッシュ レポートツールで、アプリの品質を低下させる安定性の問題を追跡し、優先順位を付け、修正するのに役立ちます。まだ使用したことがない場合は、Unity 向け Crashlytics 学習プログラムを完了することを検討してください。
  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 コールバックとして渡すことです。[レベル選択] メニューでも同じことができます。

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

アプリでこれを有効にするには、メインメニューとレベル選択ファイルで関連するメソッドを完了します。これにより、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; を追加して、リモート構成をインポートします。
    • 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}}

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

10. Remote Config の条件を使用してバリエーションを配信する

ユーザーが使用する言語、場所、時刻、プラットフォームに基づいて、アプリの操作性をユーザーに合わせて調整できます。Remote Config の条件を使用すると、これらの属性やその他の属性を個別に、または組み合わせて使用し、ユーザーに異なる値(バリアント)を提供できます。

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

  1. Firebase コンソールで、プロジェクトの [Remote Config] タブを開きます。
  2. subtitle_override. の編集ボタンをクリックします。
  3. 左下の [新規作成] をクリックします。
  4. 表示されたプルダウンで [条件値] にカーソルを合わせ、[新しい条件を作成] をクリックします。Remote Config パラメータ エディタ: 条件値オプション
  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. 「Updated keys」で始まるログが表示された場合は、アプリが変更された値を受け取ったことを示します。
  4. どちらも見つからない場合は、残りのログを確認してから、Config 更新ハンドラを作成するの手順を再確認し、テストを再実行してログを再確認し、問題がないか確認します。

12. お疲れさまでした

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

学習した内容

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

次のステップ

パラメータ値の優先順位について確認し、条件やローカリティが原因で複数の値を持つパラメータを使用する場合に、アプリ インスタンスがどの値を取得するかのロジックを理解します。