Перезагрузка домена сбрасывает состояние вашего сценария и включена по умолчанию. Он предоставляет вам совершенно новое состояние сценария и сбрасывает все статические поля и зарегистрированные обработчики каждый раз, когда вы входите в игровой режим. Это означает, что каждый раз, когда вы входите в игровой режим в редакторе Unity, ваш проект начинает воспроизводиться так же, как при первом запуске в сборке.
Перезагрузка домена требует времени, и это время увеличивается с увеличением количества и сложности скриптовфрагмента кода, который позволяет создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Подробнее
См. Словарь в вашем проекте. Когда для входа в игровой режим требуется много времени, становится сложнее быстро выполнять итерации в вашем проекте. Именно поэтому Unity предоставляет возможность отключить перезагрузку домена.
Отключение перезагрузки домена
Чтобы отключить перезагрузку домена:
- Выберите «Правка» > «Настройки проекта» > «Редактор».
- Убедитесь, что включен параметр "Войти в параметры игрового режима".
- Отключить перезагрузку домена
Дополнительную информацию см. в разделе Как настроить Play Mode
Когда перезагрузка домена отключена, вход в игровой режим происходит быстрее, поскольку Unity не сбрасывает состояние сценария каждый раз. Однако затем вы сами должны убедиться, что состояние вашего сценария сбрасывается при входе в игровой режим. Для этого вам нужно добавить код, который сбрасывает состояние вашего сценария при запуске игрового режима.
Если функция перезагрузки домена отключена, Unity по-прежнему обновляет состояние сценария при его обновлении или повторном импорте в соответствии с вашими настройками автоматического обновления.
Изменение скриптов для правильной работы при отключенной перезагрузке домена:
Чтобы обеспечить правильный сброс состояний сценариев в игровом режиме, вам необходимо внести изменения в статические поля и обработчики статических событий в ваших сценариях.
Статические поля
Если функция перезагрузки домена отключена, значения статических полей в вашем коде не сбрасываются автоматически до исходных значений. Вам нужно добавить код, который явно делает это.
В следующем примере кода есть поле статического счетчика, которое увеличивается, когда пользователь нажимает кнопку перехода. Когда включена перезагрузка домена, счетчик автоматически сбрасывается на ноль при входе в игровой режим. Когда перезагрузка домена отключена, счетчик не сбрасывается; он сохраняет свое значение в режиме воспроизведения и вне его. Это означает, что при втором запуске вашего проекта в редакторе счетчик может быть не на нуле, если он изменился при предыдущем запуске.
using UnityEngine;
public class StaticCounterExample : MonoBehaviour
{
// this counter will not reset to zero when Domain Reloading is disabled
static int counter = 0;
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Jump"))
{
counter++;
Debug.Log("Counter: " + counter);
}
}
}
Чтобы счетчик сбрасывался даже при отключенной перезагрузке домена, необходимо использовать атрибут [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] и явно сбросить значение:
using UnityEngine;
public class StaticCounterExampleFixed : MonoBehaviour
{
static int counter = 0;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
Debug.Log("Counter reset.");
counter = 0;
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Jump"))
{
counter++;
Debug.Log("Counter: " + counter);
}
}
}
Статические обработчики событий
Если функция перезагрузки домена отключена, Unity не будет отменять регистрацию методов в обработчиках статических событий при выходе из режима воспроизведения. Это может привести к осложнениям, если у вас есть код, который регистрирует методы с помощью статических обработчиков событий. Например, при первом воспроизведении вашего проекта в редакторе методы будут зарегистрированы как обычно. Однако при втором воспроизведении вашего проекта эти методы будут зарегистрированы во второй раз в дополнение к первому, в результате чего эти методы будут вызываться дважды при возникновении события.
Например, этот код регистрирует метод со статическим обработчиком событий Application.quitting
. При включенной перезагрузке домена Unity автоматически сбрасывает обработчик событий при запуске режима воспроизведения, поэтому метод регистрируется только один раз. Однако при отключенной перезагрузке домена обработчик события не очищается, поэтому при втором запуске вашего проекта в редакторе метод регистрируется второй раз и вызывается дважды при возникновении события, что обычно нежелательно. р>
using UnityEngine;
public class StaticEventExample : MonoBehaviour
{
void Start()
{
Debug.Log("Registering quit function");
Application.quitting += Quit;
}
static void Quit()
{
Debug.Log("Quitting!");
}
}
Когда перезагрузка домена отключена, в приведенном выше примере снова добавляется метод Quit
каждый раз, когда вы входите в игровой режим. Это приводит к появлению дополнительного сообщения «Выход» каждый раз, когда вы выходите из игрового режима.
Чтобы обеспечить сброс обработчика событий даже при отключенной перезагрузке домена, необходимо использовать атрибут [RuntimeInitializeOnLoadMethod] и явно отменить регистрацию метода, чтобы он не добавлялся дважды.
using UnityEngine;
public class StaticEventExampleFixed : MonoBehaviour
{
[RuntimeInitializeOnLoadMethod]
static void RunOnStart()
{
Debug.Log("Unregistering quit function");
Application.quitting -= Quit;
}
void Start()
{
Debug.Log("Registering quit function");
Application.quitting += Quit;
}
static void Quit()
{
Debug.Log("Quitting the Player");
}
}
Для сценариев времени выполнения необходимо использовать атрибут [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
для сброса статических полей и обработчиков событий.
Для сценариев редактора, таких как настраиваемые окна редактора или инспекторыокно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройки проекта, позволяющие просматривать и редактировать значения. Дополнительная информация
См. в Словарь, где используется статика, необходимо использовать [InitializeOnEnterPlayMode]
для сброса статических полей и обработчиков событий.