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

1. Введение

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

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

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

Что вы узнаете

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

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

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

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

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

Скачать код

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

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

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

Откройте Level Up with Firebase в редакторе Unity.

  1. Запустите Unity Hub и на вкладке «Проекты» нажмите стрелку раскрывающегося списка рядом с кнопкой «Открыть» .
  2. Нажмите «Добавить проект с диска» .
  3. Перейдите в каталог, содержащий код, и нажмите кнопку ОК .
  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 (в Firebase она называется "Gemini").
  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.

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

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

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

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

  1. В консоли Firebase нажмите «Загрузить Firebase Unity SDK» .
  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 и в процессе настройки нажмите «Далее» .

Для получения дополнительной информации о добавлении SDK Firebase в проекты 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. Настройте стратегию загрузки удаленной конфигурации.

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

В текущей реализации значения удаленной конфигурации загружаются и активируются при запуске приложения. Загрузка данных может быть скрыта во время смены меню, а также блокировать взаимодействие во время перехода. Кроме того, это часто наиболее подходящий момент для получения новых значений, поскольку изменение состояния меню часто позволяет понять, «куда» игрок направляется, и предсказать, какое значение будет использовано.

Рассматривая систему меню 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, нажав кнопку «Play» в редакторе, логи появятся на вкладке «Консоль».

  1. Пересоберите и запустите приложение (в редакторе, используя устройство или симулятор).
  2. После появления главного меню игры просмотрите вывод логов игры, который должен содержать записи, сгенерированные Debug.Log в FetchRemoteConfig и ActivateRetrievedRemoteConfigValues . В них должны отображаться сообщения "Получение данных..." и "Удаленные данные загружены и готовы". Обратите внимание на временные метки в начале этих сообщений.
  3. В игре нажмите «Лицензия» .
  4. Нажмите «ОК» .
  5. Дождитесь появления главного меню игры.
  6. Просмотрите лог вашей игры, который должен быть похож на лог предыдущего шага, но с новыми метками времени (соответствующими времени, установленному на системных часах в месте запуска игры).
  7. В игре нажмите кнопку «Играть» .
  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. Для импорта удаленной конфигурации добавьте строку 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;
    }
    
    В результате этого изменения величина силы, передаваемой элементом ускорения, будет заменена на силу, получаемую из удаленной конфигурации.
  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. Удалённая установка значений параметров.

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

  1. В консоли Firebase откройте свой проект.
  2. Чтобы просмотреть панель мониторинга удаленной конфигурации, выберите в меню пункт «Удаленная конфигурация».
  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}}

    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 в режиме реального времени . Приложения могут подписаться на новый API Remote Config, работающий в режиме реального времени, чтобы отслеживать изменения конфигурации и обновленные значения.

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

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

Реализация удаленной конфигурации в режиме реального времени.

Чтобы проиллюстрировать, как это работает в игре, внесите следующие изменения в свой код.

Создайте обработчик обновления конфигурации.

Первый шаг к использованию события 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 и понаблюдайте за результатом.

После запуска приложения в разделе «Удалённая конфигурация» консоли Firebase:

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

dc602d4db54e50a4.png

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

fcbc1df848f88009.png

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

3785c1e00e7a6359.png

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

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

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

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

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

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

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