Unity ゲームを Firebase Remote Config とインストルメント化する

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 の条件を使用して、ユーザー グループごとに異なる値のバリアントを提供する方法

必要なもの

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

2. 開発環境を設定する

以下のセクションでは、Level Up with Firebase コードをダウンロードし、Unity で開いて、Firebase プロジェクトを追加する方法について説明します。この「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 Editor の [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 構成ファイルを追加する

[アプリの登録] をクリックすると、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 学習パスウェイを修了することを検討してください。
  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. Firebase の初期化を MainGame.cs Start() メソッドに追加します。既存の InitializeCommonDataAndStartGame() メソッドを、現在実装されていないメソッド InitializeFirebaseAndStartGame() に置き換えます。
    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 を実行してログを表示します。エディタで [Play] を押して Unity でコードを実行すると、[Console] タブにログが表示されます。

  1. アプリを再ビルドして実行します(エディタ内でデバイスまたはシミュレータを使用)。
  2. ゲームのメインメニューが表示されたら、ゲームのログ出力を確認します。ログ出力には、FetchRemoteConfigActivateRetrievedRemoteConfigValuesDebug.Log が生成したログが含まれているはずです。「データを取得しています...」と「リモートデータが読み込まれ、準備完了です」というメッセージが表示されます。これらのメッセージの先頭にあるタイムスタンプに注意してください。
  3. ゲームで [License] を押します。
  4. [OK] を押します。
  5. ゲームのメインメニューが表示されるまで待ちます。
  6. ゲームのログ出力を確認します。このログ出力は、前のステップのログ出力と同様のものです。新しいタイムスタンプ(ゲームを実行しているシステム クロックに設定された時刻と一致します)を付けます。
  7. ゲームで [プレイ] を押します。
  8. [Let's Roll] を押します。
  9. キーボードの矢印キーを使用してボールを目標まで動かすと、レベル完了メニューが開きます。
  10. [Levels] を押します。
  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(加速度タイルの力)

    Number

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

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

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

条件の一般的な用途の一つとして、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 の残りの部分でそれを使用します。[新しい条件の定義] ダイアログを使用して\niOS 固有の条件を定義する
  6. [次の場合に適用] で [選択...] プルダウンをクリックし、[プラットフォーム] を選択します。次に、適切なプラットフォームを選択します。[新しい条件を定義] エディタを使用して\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 を実装する

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

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

構成更新イベントを使用する最初のステップは、構成更新イベントをリッスンできるメソッドを作成することです。次のメソッドを 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 の条件を使用してさまざまな値のバリアントを提供する方法

次のステップ

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