Примечание: Unity Remote Config теперь доступен как пакет предварительного просмотраПакет предварительного просмотра* находится в разработке и еще не готов к работе . Предварительный просмотр пакета может находиться на любой стадии разработки, от начальных до практически завершенных.
См. в Словарь. Remote Config — это улучшенное предложение, которое позволяет вам изменить поведение и внешний вид вашей игры, не требуя нового двоичного файла. Вы можете удаленно включать или отключать функции, изменять особенности своей игры для целевой аудитории или проводить специальные мероприятия, планируя выпуски нового контента.*
Используйте класс Unity Scripting API RemoteSettings для доступа к удаленным настройкам в коде. Класс RemoteSettings
предоставляет функции для доступа к вашим удаленным настройкам, например RemoteSettings.GetString()
, а также события, которые вы можете использовать для запуска функций при получении или обновлении ваших настроек.
Событие | Цель |
---|---|
BeforeFetchFromServer | Отправляется непосредственно перед тем, как класс RemoteSettings делает свой сетевой запрос на получение ваших удаленных настроек. |
Completed | Отправляется, когда сетевой запрос завершен. Completed отправляется всегда, даже если сетевой запрос завершается неудачно и если нет изменений в удаленных настройках. Вы можете использовать код serverResponse , переданный вашей функции делегата, чтобы определить, был ли запрос успешным или нет. Параметр содержит один из стандартных кодов ответа HTTP, например 200 для успешного выполнения. |
Updated | Отправляется после успешного завершения сетевого запроса, но ТОЛЬКО если ваши удаленные настройки изменились с момента предыдущей проверки.
Примечание. До Unity 2018.1 событие |
Вы должны зарегистрировать свои функции-обработчики для этих событий как можно раньше во время запуска приложения, например, в функции Awake()
MonoBehaviour, загруженного в ваш первый Unity sceneСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь.
Поскольку для получения настроек требуется сетевая транзакция, объект RemoteSettings
отправляет свои события асинхронно. Ваши функции-обработчики могут не вызываться в том же порядке, что и другие события на каждой платформе или даже при каждом запуске одной и той же платформы. Всегда инициализируйте переменные конфигурации разумными значениями по умолчанию и допускайте возможность вызова обработчиков событий в разное время во время запуска приложения.
Пример кода
В следующем примере показан класс, который определяет ряд свойств для настройки сложности игры и обновляет эти свойства на основе удаленных настроек:
using UnityEngine;
public class RemoteTuningVariables : MonoBehaviour {
public float DefaultSpawnRateFactor = 1.0f;
public float DefaultEnemySpeedFactor = 1.0f;
public float DefaultEnemyStrengthFactor = 1.0f;
public static float SpawnRateFactor{ get; private set; }
public static float EnemySpeedFactor{ get; private set; }
public static float EnemyStrengthFactor{ get; private set; }
void Start () {
SpawnRateFactor = DefaultSpawnRateFactor;
EnemySpeedFactor = DefaultEnemySpeedFactor;
EnemyStrengthFactor = DefaultEnemyStrengthFactor;
RemoteSettings.Completed += HandleRemoteSettings;
}
private void HandleRemoteSettings(bool wasUpdatedFromServer, bool settingsChanged, int serverResponse){
SpawnRateFactor
= RemoteSettings.GetFloat ("SpawnRateFactor", DefaultSpawnRateFactor);
EnemySpeedFactor
= RemoteSettings.GetFloat ("EnemySpeedFactor", DefaultEnemySpeedFactor);
EnemyStrengthFactor
= RemoteSettings.GetFloat ("EnemyStrengthFactor", DefaultEnemyStrengthFactor);
}
}
Обратите внимание, что класс предоставляет значения по умолчанию в вызовах метода RemoteSettings.GetFloat()
. Если объект RemoteSettings
не может найти указанный ключ (например, если вы неправильно написали имя ключа), то метод по-прежнему присваивает значения по умолчанию для переменных настройки. В противном случае методы GetFloat()
и GetInt()
присваивают числам ноль, GetString( )
присваивает пустую строку строкам, а GetBool()
присваивает значение false логическим переменным.
Класс также присваивает те же значения по умолчанию свойствам в методе Start()
на случай, если другой класс получит доступ к настройкам до того, как будут получены удаленные настройки, и нет ранее кэшированной конфигурации. доступен локально. Назначение значений по умолчанию в методе Start()
гарантирует, что свойства всегда будут иметь разумные значения.
Обеспечение согласованности настроек
Если в вашей игре есть несколько классов, которые обращаются к удаленным настройкам в разное время, возможно, что некоторые объекты получат доступ к вашим настройкам до завершения асинхронного сетевого запроса, а некоторые получат доступ к настройкам позже, что может привести к несогласованным значениям настроек. Чтобы избежать этой проблемы несогласованности, вам нужно либо дождаться завершения асинхронного сетевого запроса, прежде чем получить доступ к каким-либо настройкам, либо вы можете просто использовать существующие настройки, которые у вас есть в начале текущего сеанса. В последнем случае локальные настройки обновляются в фоновом режиме, и игрок увидит их в следующей сессии.
Метод | Преимущества | Недостатки |
---|---|---|
Wait for request completion | – Значения настроек согласованы - Всегда использовать последние настройки |
– Неопределенная задержка в настройке доступности - Сложность асинхронного кода |
Use current settings | – Значения настроек согласованы - Настройки доступны сразу |
- Новые значения настроек не используются до второго сеанса - При первом запуске игры настройки недоступны. (Используйте значения по умолчанию.) |
В следующем примере показан класс поставщика, который назначает свои свойства на основе последней версии удаленных настроек, полученных из Analytics Аббревиатура от Unity Analytics
См. в сервисе Словарь. Класс RemoteSettings
по-прежнему обновляет параметры в фоновом режиме, поэтому любые изменения параметров используются в следующем сеансе (а не в текущем сеансе). В следующем примере используется одноэлементный шаблон, поэтому все части игры, использующие эти настройки, получают одинаковые значения независимо от того, когда класс RemoteSettings
получает удаленное обновление.
using UnityEngine;
public class RemoteSettingProvider : MonoBehaviour {
public float DefaultSpawnRateFactor = 1.0f;
public float DefaultEnemySpeedFactor = 1.0f;
public float DefaultEnemyStrengthFactor = 1.0f;
public float SpawnRateFactor{ get; private set; }
public float EnemySpeedFactor{ get; private set; }
public float EnemyStrengthFactor{ get; private set; }
// Singleton pattern
private static RemoteSettingProvider _instance;
public static RemoteSettingProvider Instance
{
get { return _instance; }
}
void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(this.gameObject);
return;
}
_instance = this;
DontDestroyOnLoad(this.gameObject);
//Use the current settings, before remote update, or default values if
//the settings don't exist (yet)
SpawnRateFactor
= RemoteSettings.GetFloat("SpawnRateFactor", DefaultSpawnRateFactor);
EnemySpeedFactor
= RemoteSettings.GetFloat("EnemySpeedFactor", DefaultEnemySpeedFactor);
EnemyStrengthFactor
= RemoteSettings.GetFloat("EnemyStrengthFactor", DefaultEnemyStrengthFactor);
}
}
При использовании этого метода настройки по умолчанию всегда используются при первом запуске игры после установки.
Вы также можете использовать гибридный подход, который проверяет наличие локальных настроек с помощью RemoteSettings.GetCount()
. Если настройки существуют локально, вы можете использовать их немедленно, но если нет, то вы добавляете обработчик событий для ожидания события настроек Updated
:
SpawnRateFactor
= RemoteSettings.GetFloat("SpawnRateFactor", DefaultSpawnRateFactor);
EnemySpeedFactor
= RemoteSettings.GetFloat("EnemySpeedFactor", DefaultEnemySpeedFactor);
EnemyStrengthFactor
= RemoteSettings.GetFloat("EnemyStrengthFactor", DefaultEnemyStrengthFactor);
if(RemoteSettings.GetCount() == 0){
//If there are no settings, get them from remote
RemoteSettings.Updated += HandleRemoteSettings;
Ready = false;
} else {
Ready = true;
}
Другие классы, использующие ваши удаленные настройки, должны проверить свойство Ready
вашего класса поставщика, чтобы определить, безопасно ли обращаться к настройкам. В следующем примере показан класс, ожидающий настройки, а также использующий настраиваемый тайм-аут:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RemoteSettingConsumer : MonoBehaviour {
public float SpeedFactor = 0;
public float StrengthFactor = 0;
public float SpawnRateFactor = 0;
public float Timeout = 0.125f;
void Start () {
StartCoroutine(GetRemoteSettings(Time.time));
}
IEnumerator GetRemoteSettings(float startTime){
while(!RemoteSettingProvider.Instance.Ready && (Time.time - startTime) < Timeout)
yield return null;
SpeedFactor = RemoteSettingProvider.Instance.EnemySpeedFactor;
StrengthFactor = RemoteSettingProvider.Instance.EnemyStrengthFactor;
SpawnRateFactor = RemoteSettingProvider.Instance.SpawnRateFactor;
}
}
Если время ожидания истекло до того, как настройки удаленного доступа станут доступны, используются значения по умолчанию. Использование тайм-аута позволяет игре получать самые последние настройки в обычном случае, когда сетевая транзакция завершается за очень короткий промежуток времени, при этом не задерживая запуск без необходимости, ожидая истечения времени ожидания самого запроса в случае сбоя сети. р>