Быстрый вход в игровой режим в Unity 2019.3

Режим Play Mode лежит в основе того, что делает работу с Unity интересной. Но по мере усложнения проектов может потребоваться время, чтобы начать работу. Чем быстрее вы сможете входить и выходить из режима Play Mode, тем быстрее вы сможете вносить и тестировать изменения. Именно поэтому мы вводим настраиваемый режим Enter Play Mode в Unity 2019.3 beta в качестве экспериментальной функции.
В настоящее время, когда вы входите в режим игры в редакторе, Unity делает две вещи: сбрасывает состояния сценария (Domain Reload) и перезагружает сцену. Это требует времени, и чем сложнее становится ваш проект, тем дольше нужно ждать, чтобы протестировать новые изменения в режиме Play Mode. Однако начиная с бета-версии Unity 2019.3 у вас появится возможность отключить одно из действий "Перезагрузка домена" и "Перезагрузка сцены" или оба.
По результатам наших тестов, это может сэкономить до 50-90 % времени ожидания, в зависимости от вашего проекта.

Когда вы включите опцию Enter Play Mode Options в меню File > Project Settings > Editor, вы увидите, что стали доступны опции перезагрузки домена и перезагрузки сцены. Подробнее о настройке режима Play Mode читайте в документации.

Эти опции позволяют отключить перезагрузку домена и/или сцены из процесса Enter Play Mode, когда нет изменений в коде. Вы также можете получить доступ к этой функции через API и обратный вызов, если хотите сбросить состояние игры перед входом в режим игры.
На схеме ниже показан процесс Enter Play Mode до и после отключения функций Reload Domain и Reload Scene:

Более подробную информацию о процессах, происходящих в Unity при переходе в режим Play Mode, можно найти в документации.
Обратите внимание, что эта функция в настоящее время является экспериментальной, и не все пакеты Unity проверены для работы с отключенными Domain и Scene Reloading. Пожалуйста, сообщите нам на форуме, если у вас возникнут какие-либо проблемы!
Как видите, избежать перезагрузки домена очень просто, но за это приходится платить. Вам необходимо внести изменения в статические поля и обработчики статических событий в ваших сценариях, чтобы обеспечить корректный сброс состояний сценария при переходе в режим воспроизведения.
В следующем примере кода есть счетчик, который увеличивается, когда игрок нажимает кнопку прыжка. Если включена функция перезагрузки домена, счетчик автоматически обнуляется при переходе в режим воспроизведения. После отключения перезагрузки домена счетчик не сбрасывается; он сохраняет свое значение в режиме игры и вне его. Это означает, что при втором запуске вашего проекта в редакторе счетчик может оказаться не на нуле, если он изменился в предыдущем запуске.
public class StaticCounterExample : MonoBehaviour
{
//этот счетчик не обнуляется, когда перезагрузка домена отключена
статический int counter = 0;
// Обновление вызывается один раз за кадр
void Update()
{
if (Input.GetButtonDown("Jump"))
{
контр++;
Debug.Log("Счетчик: " + счетчик);
}
}
}
Используйте атрибут [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] и сбросьте значение явно, чтобы убедиться, что счетчик правильно сбрасывается, когда перезагрузка домена отключена. Пример:
используя UnityEngine;
public class StaticCounterExampleFixed : MonoBehaviour
{
статический int counter = 0;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
Debug.Log("Счетчик сброшен.");
счетчик = 0;
}
// Обновление вызывается один раз за кадр
void Update()
{
if (Input.GetButtonDown("Jump"))
{
контр++;
Debug.Log("Счетчик: " + счетчик);
}
}
}
После отключения перезагрузки доменов Unity не будет отменять регистрацию методов из статических обработчиков событий при выходе из режима игры. Это может привести к осложнениям, если у вас есть код, который регистрирует методы со статическими обработчиками событий. Например, при первом воспроизведении проекта в редакторе методы будут зарегистрированы как обычно. Однако во второй игре вашего проекта эти методы будут зарегистрированы во второй раз в дополнение к первому и, следовательно, будут вызываться дважды при наступлении события.
Следующий код регистрирует метод в статическом обработчике события Application.quitting:
используя UnityEngine;
public class StaticEventExample : MonoBehaviour
{
void Start()
{
Debug.Log("Регистрация функции выхода из игры");
Application.quitting += Quit;
}
static void Quit()
{
Debug.Log("Выход из игры!");
}
}
Если перезагрузка домена отключена, приведенный выше пример добавляет метод `Quit` каждый раз, когда вы входите в режим воспроизведения. Это приводит к появлению дополнительного сообщения "Выход" при каждом выходе из режима воспроизведения.
Используйте атрибут [RuntimeInitializeOnLoadMethod] и снимите метод с регистрации явно, чтобы он не добавлялся дважды:
используя UnityEngine;
public class StaticEventExampleFixed : MonoBehaviour
{
[RuntimeInitializeOnLoadMethod]
static void RunOnStart()
{
Debug.Log("Unregistering quit function");
Application.quitting -= Quit;
}
void Start()
{
Debug.Log("Регистрация функции выхода из игры");
Application.quitting += Quit;
}
static void Quit()
{
Debug.Log("Выход из проигрывателя");
}
}
Более подробную информацию о модификации ваших скриптов для корректной работы при отключенной перезагрузке домена вы найдете в нашей документации.
Мы хотели бы убедиться, что популярные пакеты Asset Store работают с отключенными Domain и Scene Reloading. Вы можете помочь нам, сообщая о любых проблемах, с которыми вы столкнулись в своих проектах, издателям пакетов активов.
Мы уверены, что если ваш проект медленно переходит в режим Play Mode, эта функция значительно ускорит процесс. Присоединяйтесь к бета-версии Unity 2019.3 и опробуйте ее, мы с нетерпением ждем ваших мнений на форуме! Поскольку эта функция является экспериментальной, вы все еще можете помочь нам сформировать ее так, чтобы она соответствовала вашим потребностям. Мы с нетерпением ждем информации о любых проблемах, с которыми вы столкнулись.
Огромная благодарность пользователям форума @Sini, @chrisk, @Peter77 и @Baste, которые уже помогли всему сообществу, протестировав эту функцию и предоставив бесценные отзывы.