Инструментируйте свою игру Unity с помощью Firebase Remote Config

1. Введение

Вы можете использовать Firebase Remote Config для определения пар «ключ-значение» , также известных как параметры, в своем приложении и обновления их значений в облаке, что позволяет вам изменять внешний вид и поведение вашего приложения без распространения обновления приложения.

Вы добавите эту новую функциональность в пример игры MechaHamster: Level Up with Firebase Edition . Этот пример игры представляет собой новую версию классической игры MechaHamster для Firebase, в которой удалена большая часть встроенного функционала Firebase, что позволяет вам реализовать новые возможности Firebase.

Чтобы убедиться, что ваше приложение работает так, как задумано, вы зададите конфигурации по умолчанию для значений в примере кода игры, и эти значения могут быть переопределены значениями, которые вы зададите в Remote Config в консоли Firebase .

Чему вы научитесь

  • Как установить значения Remote Config в облаке и получить их
  • Как настроить код Unity C# для автоматического использования полученных значений
  • Как хранить, инструментировать и переопределять составные значения/объекты как значения JSON
  • Как использовать условия удаленной настройки для предоставления различных вариантов значений разным группам пользователей

Что вам понадобится

  • Unity 2019.1.0f1 или выше с поддержкой сборки на iOS и/или Android
  • Физическое устройство Android/iOS или симулятор/эмулятор для сборки и запуска игры

2. Настройте среду разработки

В следующих разделах описывается, как загрузить код Level Up with Firebase , открыть его в Unity и добавить проект Firebase. Этот пример игры Level Up with Firebase используется в нескольких других лабораторных работах Firebase + Unity, поэтому вы, возможно, уже выполнили задания из этого раздела. Если это так, вы можете пропустить эти шаги и перейти к разделу «Добавление Firebase SDK для Unity», чтобы добавить Remote Config в код примера игры.

Загрузите код

Клонируйте репозиторий GitHub этой кодовой лаборатории из командной строки:

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

Кроме того, если у вас не установлен git, вы можете загрузить репозиторий в виде ZIP-файла .

Откройте Level Up с помощью Firebase в редакторе Unity

  1. Запустите Unity Hub и на вкладке «Проекты» щелкните стрелку раскрывающегося списка рядом с кнопкой «Открыть» .
  2. Нажмите Добавить проект с диска .
  3. Перейдите в каталог, содержащий код, и нажмите кнопку OK .
  4. При появлении запроса выберите версию редактора Unity и целевую платформу (Android или iOS).
  5. Щелкните имя проекта, level-up-with-firebase , и проект откроется в редакторе Unity.
  6. Если ваш редактор не открывает его автоматически, откройте MainGameScene в разделе Assets > Hamster на вкладке Project редактора Unity.

Дополнительную информацию об установке и использовании Unity см. в разделе Работа в Unity .

3. Добавьте Firebase в свой проект Unity

Создать проект Firebase

  1. Войдите в консоль Firebase, используя свою учетную запись Google.
  2. Нажмите кнопку, чтобы создать новый проект, а затем введите имя проекта (например, LevelUpWithFirebase ).
  3. Нажмите «Продолжить» .
  4. При появлении соответствующего запроса ознакомьтесь с условиями Firebase и примите их, а затем нажмите кнопку «Продолжить» .
  5. (Необязательно) Включите помощь ИИ в консоли Firebase (так называемая «Gemini в Firebase»).
  6. Для этой практической работы вам понадобится Google Analytics для оптимального использования продуктов Firebase, поэтому включите опцию Google Analytics. Следуйте инструкциям на экране, чтобы настроить Google Analytics.
  7. Нажмите «Создать проект» , дождитесь завершения подготовки проекта, а затем нажмите «Продолжить» .

Зарегистрируйте свое приложение в Firebase

  1. Откройте консоль Firebase и в центре страницы обзора проекта щелкните значок Unity, чтобы запустить рабочий процесс настройки, или, если вы уже добавили приложение в свой проект Firebase, щелкните Добавить приложение , чтобы отобразить параметры платформы.
  2. Выберите для регистрации цели сборки Apple (iOS) и Android.
  3. Введите идентификатор(ы) платформы вашего проекта Unity. Для этой лабораторной работы введите следующее:
  4. При желании введите псевдонимы, специфичные для платформы вашего проекта Unity.
  5. Нажмите «Зарегистрировать приложение» и перейдите в раздел «Загрузить файл конфигурации» .
  6. Повторите процесс для каждой цели сборки, которую вы не выполнили в первый раз.

Добавить файлы конфигурации Firebase

После нажатия кнопки «Зарегистрировать приложение» вам будет предложено загрузить два файла конфигурации (по одному для каждой целевой сборки). Для подключения к Firebase вашему проекту Unity потребуются метаданные Firebase из этих файлов.

  1. Загрузите оба доступных файла конфигурации:
    • Для Apple (iOS) : загрузите GoogleService-Info.plist .
    • Для Android : загрузите google-services.json .
  2. Откройте окно проекта Unity, затем переместите оба файла конфигурации в папку Assets .
  3. Вернитесь в консоль Firebase, в рабочем процессе настройки нажмите кнопку Далее и перейдите к добавлению пакетов SDK Firebase для Unity.

Примечание: Вы всегда можете повторно загрузить эти файлы позднее, открыв общие настройки своего проекта, прокрутив вниз до раздела Ваши приложения , а затем нажав кнопку загрузки нужного файла конфигурации.

Добавьте Firebase SDK для Unity

  1. Нажмите «Загрузить Firebase Unity SDK» в консоли Firebase.
  2. Распакуйте SDK в удобное место.
  3. В открытом проекте Unity перейдите в раздел Assets > Import Package > Custom Package .
  4. В диалоговом окне Импорт пакета перейдите в каталог, содержащий распакованный SDK, выберите FirebaseAnalytics.unitypackage и нажмите Открыть .
  5. В открывшемся диалоговом окне «Импорт пакета Unity» нажмите кнопку «Импорт» .
  6. Повторите предыдущие шаги для импорта следующих двух пакетов:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics — это лёгкий инструмент для отчётности о сбоях в режиме реального времени, который помогает отслеживать, приоритизировать и устранять проблемы со стабильностью, снижающие качество вашего приложения. Если вы ещё не использовали его, рекомендуем пройти курс обучения Crashlytics для Unity .
  7. Вернитесь в консоль Firebase и в рабочем процессе настройки нажмите кнопку Далее .

Дополнительную информацию о добавлении Firebase SDK в проекты Unity см. в разделе Дополнительные параметры установки Unity .

4. Установите значения по умолчанию для удаленной конфигурации и получите новые значения.

В этой лабораторной работе вы обновите объекты, использующие значения, заданные в коде или сериализованные в редакторе 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 содержит некоторые расширения API задач C#, которые помогут упростить управление процессом инициализации с помощью обратных вызовов.
  2. Добавьте инициализацию Firebase в метод Start() файла MainGame.cs , заменив существующий метод InitializeCommonDataAndStartGame() на нереализованный в настоящее время метод 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 . Это позволит связать вызовы методов FetchAsync (который извлекает новые значения из Remote Config) и ActivateAsync (который активирует полученные значения, делая их доступными в коде) класса Remote Config, используя параметр обратного вызова onFetchAndActivateSuccessful .

Код запуска, добавленный на предыдущем шаге, вызывает FetchRemoteConfig с обратным вызовом InitializeCommonDataAndStartGame для запуска игры в конце последовательности. Вы можете передать FetchRemoteConfig альтернативные обратные вызовы для вызова выборки с различными результатами. Пример (который вы реализуете позже) — передача метода, открывающего новые меню пользовательского интерфейса, зависящие от значений Remote Config. Это приведет к тому, что меню будут открываться только после получения и активации этих значений.

  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. Затем завершите метод ActivateRetrievedRemoteConfigValues , который получает переданный обратный вызов onFetchAndActivateSuccessful . После завершения активации будет вызван указанный обратный вызов:
    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 извлекаются и активируются при запуске приложения. Извлечение данных может быть скрыто во время изменения меню, а также блокировать взаимодействие во время перехода. Кроме того, это часто наиболее подходящий момент для получения новых значений, поскольку изменение состояния меню часто позволяет определить, «куда» перемещается игрок, и предсказать, будет ли использовано то или иное значение.

При рассмотрении системы меню Mechahamster самый простой способ добавить блокировку обновления пользовательского интерфейса — вызвать его до возобновления отображения главного меню (в частности, при выходе из другого меню) и передать метод отображения пользовательского интерфейса в качестве обратного вызова onFetchAndActivateSuccessful . То же самое можно сделать и для меню выбора уровня .

Поскольку первоначальная загрузка является частью запуска приложения, любая навигация по главному меню будет осуществляться первым из них, а любой повторный вход в меню выбора уровня также приведёт к обновлению. Первоначальный вход в меню выбора уровня не имеет значения, так как доступ к нему возможен только из главного меню, и, следовательно, он уже реализован.

Чтобы включить это в приложении, завершите соответствующие методы в файлах главного меню и выбора уровня, которые заблокируют отображение пользовательского интерфейса до тех пор, пока не будут завершены FetchAsync и ActivateAsync :

  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. Отладка/проверка поведения выборки

На этом этапе полезно провести диагностику/проверку. Следующая процедура позволит вам вручную протестировать приложение и проверить, как оно получает и активирует значения удалённой конфигурации.

Информация будет выводиться в журналах симулятора, устройства или редактора. Для iOS вы можете просматривать журналы устройства и симулятора в Xcode. Для Android для просмотра журналов выполните adb logcat . Если вы запустите код в Unity, нажав кнопку «Воспроизвести» в редакторе, журналы появятся на вкладке «Консоль».

  1. Пересоберите и запустите приложение (в редакторе, с помощью устройства или симулятора).
  2. После открытия главного меню игры проверьте вывод журнала игры, который должен содержать записи, сгенерированные Debug.Log в FetchRemoteConfig и ActivateRetrievedRemoteConfigValues ​​. В них должны быть сообщения «Извлечение данных...» и «Удалённые данные загружены и готовы». Обратите внимание на временные метки в начале этих сообщений.
  3. В игре нажмите Лицензия .
  4. Нажмите «ОК» .
  5. Дождитесь появления главного меню игры.
  6. Проверьте выходные данные журнала игры, которые должны быть аналогичны тем, что были на предыдущем этапе, с новыми временными метками (соответствующими времени, установленному на системных часах, на которых запущена игра).
  7. В игре нажмите кнопку Play .
  8. Нажмите «Поехали» .
  9. Направьте мяч к воротам с помощью стрелок на клавиатуре, после чего откроется меню завершения уровня.
  10. Уровни прессования.
  11. Дождитесь загрузки меню выбора уровня .
  12. Перепроверьте вывод журнала игры. Он должен совпадать с сообщениями журнала, полученными на предыдущих этапах, с более новыми временными метками (соответствующими времени, установленному на системных часах, на которых запущена игра).

Если какой-либо из этих пунктов не появился в вашем приложении, возможно, какая-то часть процесса загрузки и активации (или ваше устройство) неправильно настроена. Если первый лог отсутствует, игра, вероятно, не запустится. Просмотрите консоль редактора или логи устройства/эмулятора на наличие предупреждений и ошибок, связанных с вашим проектом/средой, и проанализируйте их — проблема может быть просто связана с подключением к интернету.

Если начальные журналы загрузки меню появляются, а один из последующих — нет, исследуйте/перепишите методы Resume в Assets/Hamster/Scripts/States/MainMenu.cs и Assets/Hamster/Scripts/States/BaseLevelSelect.cs .

8. Инструментируйте свой код

Теперь, когда вы настроили значения параметров приложения в SetDefaultsAsync() и сделали самые последние версии доступными с помощью FetchAsync() и ActivateAsync() , вы будете ссылаться на эти значения и использовать их в коде.

После того, как вы зададите значения в бэкэнде Remote Config, получите их и активируете ( или сделаете и то, и другое одновременно ), эти значения станут доступны вашему приложению. Чтобы использовать эти значения, вызовите GetValue(string key ) и выберите параметр key в качестве аргумента. Это вернет ConfigValue со свойствами для доступа к значению в виде различных поддерживаемых типов: string , bool , long , double . В этом проекте и в большинстве игровых сценариев использования необходимо привести последние два типа к более идиоматичным int и float . Чтобы эти преобразования не вызывали проблем, убедитесь, что начальные значения, заданные в Remote Config, находятся в допустимом диапазоне типов, которые вы будете использовать в коде своего приложения.

  1. Импортируйте Remote Config, добавив using Firebase.RemoteConfig; в начало следующих файлов:
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. Замените метод Start в AccelerationTile.cs :
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    Благодаря этому изменению величина силы, передаваемой плиткой ускорения, будет изменена на величину, полученную от Remote Config.
  3. Отредактируйте тело метода InitializeUI файла MainMenu.cs :
    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

    subtitle_override

    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. Используйте условия удаленной конфигурации для обслуживания вариантов

Возможно, вам захочется адаптировать приложение под пользователя с учётом его языка, местоположения, времени суток или используемой платформы. Условия удалённой конфигурации позволяют использовать эти и другие атрибуты по отдельности или в сочетании для предоставления пользователю различных значений (называемых вариантами).

Одним из распространённых применений условий является обмен контентом между платформами iOS и Android. Чтобы реализовать условие, которое будет использовать разные значения subtitle_override в зависимости от используемой платформы, выполните следующие действия.

  1. Откройте вкладку «Удаленная конфигурация» вашего проекта в консоли Firebase .
  2. Нажмите кнопку редактирования для subtitle_override.
  3. В левом нижнем углу нажмите Добавить новый .
  4. В появившемся раскрывающемся списке наведите указатель мыши на пункт Условное значение и нажмите Создать новое условие. Remote Config parameter editor:\nConditional value option
  5. При появлении запроса назовите условие «is iOS», если вы ориентируетесь на iOS, или «is Android», если вы ориентируетесь на Android. Если вы ориентируетесь на обе платформы, просто выберите один вариант и используйте его в оставшейся части работы. 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 в режиме реального времени . Приложения могут подписываться на новый API Remote Config в режиме реального времени, чтобы отслеживать изменения конфигурации и обновлённые значения.

Как это работает

Для прослушивания обновлений ваше приложение должно реализовать метод, подписывающийся на событие OnConfigUpdateListener . Пока один или несколько прослушивателей обновлений конфигурации подписаны, новые шаблоны 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 при вызове события, подпишите его на событие. Замените метод InitializeCommonDataAndStartGame() в Assets/Hamster/Scripts/MainGame.cs следующим кодом:

   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; ) подписывает обработчик событий на событие.

Отписаться, когда объект-владелец обработчика будет уничтожен

Чтобы предотвратить ошибки нулевых ссылок, объекты с методами, подписанными на события, должны отменять подписку на этот метод при уничтожении. Добавьте следующий метод в Assets/Hamster/Scripts/MainGame.cs :

   private void OnDestroy() 
   {
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ActivateValuesOnConfigUpdate;
   }

Протестируйте новую функциональность

Чтобы проверить новую функциональность, опробуйте созданное приложение. Для следующей процедуры требуется возможность чтения журнала и отладки на реальном устройстве .

Измените acceleration_tile_force и понаблюдайте.

После запуска приложения в разделе Remote Config консоли Firebase:

  1. Нажмите кнопку редактирования рядом с acceleration_tile_force .

dc602d4db54e50a4.png

  1. Измените значение на «120» и нажмите «Сохранить» .

fcbc1df848f88009.png

  1. Нажмите кнопку Опубликовать изменения .

3785c1e00e7a6359.png

  1. Проверьте журнал.
  2. Если вы видите сообщение журнала, которое начинается со слов «Произошла ошибка во время прослушивания», прочитайте его до конца и попробуйте выполнить отладку, используя выведенное в нем сообщение об ошибке.
  3. Если вы видите журнал, начинающийся с «Обновленные ключи», ваше приложение получило измененные значения.
  4. Если вы не видите ни одного из них, просмотрите остальные журналы, а затем еще раз изучите инструкции из раздела Создание обработчика обновлений конфигурации , повторите тестирование и еще раз проверьте журналы, чтобы определить, все ли в порядке.

12. Поздравляем!

Вы использовали Remote Config для удаленного управления внутриигровыми значениями, извлекая их в своем приложении и используя условия для обслуживания различных вариантов!

Что мы рассмотрели

  • Как установить и получить значения удаленной конфигурации
  • Как настроить код Unity C# для использования полученных значений
  • Как хранить, инструментировать и переопределять составные значения/объекты как значения JSON
  • Как использовать условия удаленной конфигурации для обслуживания различных вариантов значений

Следующие шаги

Ознакомьтесь с приоритетом значений параметров , чтобы лучше понять логику того, какие значения получает экземпляр приложения, когда он использует параметр с несколькими значениями (из-за условий или локальности).