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

1. Введение

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

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

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

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

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

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

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

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

В следующих разделах описано, как загрузить код Level Up с Firebase , открыть его в Unity и добавить проект Firebase. Этот пример игры Level Up с Firebase используется несколькими другими лабораториями разработки Firebase + Unity, поэтому, возможно, вы уже выполнили задачи в этом разделе. Если да, вы можете пропустить эти шаги и перейти к разделу «Добавление SDK Firebase для 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. Перейдите в каталог, содержащий код, и нажмите «ОК» .
  4. При появлении запроса выберите версию редактора Unity, которую вы хотите использовать, и целевую платформу (Android или iOS).
  5. Нажмите на имя проекта level-up-with-firebase , и проект откроется в редакторе Unity.
  6. Если ваш редактор не открывает его автоматически, откройте MainGameScene в разделе «Ресурсы» > «Hamster» на вкладке «Проект» редактора Unity.

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

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

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

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

Зарегистрируйте свое приложение в 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, затем переместите оба файла конфигурации в папку «Ресурсы» .
  3. Вернувшись в консоль Firebase, в рабочем процессе настройки нажмите «Далее» и перейдите к разделу «Добавление SDK Firebase для Unity».

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

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

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

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

4. Установите значения по умолчанию для Remote Config и получите новые значения.

В этой лаборатории кода вы обновите объекты, которые используют значения, определенные в коде или сериализованные в редакторе Unity, для использования значений, инструментированных с помощью Remote Config. Вы настроите значения по умолчанию для каждого параметра с помощью SetDefaultsAsync , чтобы ваше приложение работало должным образом до того, как оно подключится к серверной части Remote Config. Ваше приложение будет оставаться актуальным, получая новые значения из Remote Config и активируя их, чтобы их можно было использовать в коде.

Чтобы получить новые значения из Remote Config, в файле Assets/Hamster/Scripts/MainGame.cs уже присутствует ряд нереализованных методов, которые необходимо выполнить.

  1. Добавьте в MainGame.cs следующие инструкции using :
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    Модуль Firebase.Extensions содержит некоторые расширения API задач C# , которые помогут упростить управление процессом инициализации с помощью обратных вызовов.
  2. Добавьте инициализацию Firebase в метод MainGame.cs Start() , заменив существующий метод 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 . Это объединит вызовы методов Remote Config FetchAsync (который извлекает новые значения из Remote Config) и ActivateAsync (который активирует полученные значения, чтобы сделать их доступными в коде) с использованием параметра обратного вызова с именем 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. Отладка/проверка поведения выборки

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

Информация будет распечатана как часть журналов вашего симулятора, устройства или редактора. Для 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 ) и выберите ключ параметра в качестве аргумента. Это возвращает 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;
    }
    
    . Благодаря этому изменению величина силы, передаваемая плиткой ускорения, будет изменена на силу, полученную из 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. Для каждого параметра, который вы определили в своем приложении и перечислили в следующей таблице, нажмите «Добавить параметр» , вставьте имя параметра (ключ), выберите тип данных, указанный в таблице, отключите параметр «Использовать по умолчанию в приложении» и вставьте его. новое значение по умолчанию:

    Имя параметра (ключ)

    Тип данных

    Значение по умолчанию

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

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

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

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

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

Чтобы прослушивать обновления, ваше приложение должно реализовать метод, который подписывается на событие 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 для удаленного управления внутриигровыми значениями, получая их в своем приложении и используя условия для обслуживания различных вариантов!

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

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

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

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