Unity 6.3
0 онлайн 57 гостей 3 в системе
Вход
Программирование в Unity Шаг 22 из 210

Порядок выполнения функции события

Следующая схема даёт общее представление о порядке выполнения функций событий на протяжении жизненного цикла компонента-скрипта MonoBehaviour. Для наглядности схема ограничена ключевыми частями жизненного цикла скрипта; часть внутренних обновлений подсистем приведена для контекста. Полный цикл Player — более длинная и сложная последовательность обновлений конкретных систем и подсистем, выполняемых друг за другом в заданном порядке по умолчанию. Чтобы получить полный цикл Player со всеми его системами, воспользуйтесь PlayerLoop API. Вы также можете использовать этот API для настроить петлю Player последовательность, удаляя системы, добавляя свои собственные и изменяя порядок обновления.

Более подробную информацию о значении и ограничениях каждого индивидуального обратного вызова см. в разделе Сообщения справки MonoBehaviour API.

Порядок выполнения функций событий в течение жизненного цикла скрипта MonoBehaviour.
Порядок выполнения функций событий в течение жизненного цикла скрипта MonoBehaviour.

Перед сценой погрузка и разгрузка

На предыдущей диаграмме не показаны события SceneManager.sceneLoaded и SceneManager.sceneUnloaded, которые позволяют получать обратные вызова при загрузке и разгрузке сцены соответственно. Unity вызывает событие sceneLoaded после OnEnable, но перед Start для всех объектов в сцене. Для подробностей и примеров использования см. соответствующие справочные страницы API.

Диаграмму, которая включает загрузку сцены как часть потока выполнения, см. в Подробности отключения Домена и Scene перезагрузки

Запуск кода при запуске редактора

Иногда может быть полезно сделать так, чтобы части вашего кода запускались немедленно при запуске Unity Editor или runtime, без каких-либо дополнительных действий пользователя и без необходимости, чтобы код был частью скрипта MonoBehaviour. Вы можете запустить код при запуске Редактора без требования каких-либо действий пользователя, применив [InitializeOnLoad] атрибут к классу, у которого есть static constructor. В качестве альтернативы, вы можете применить [InitializeOnLoadMethod] Для получения дополнительной информации и примеров использования, обратитесь к API ссылкам на эти атрибуты.

Запуск кода при инициализации времени выполнения

Вы можете запустить код при инициализации приложения времени выполнения, применив к методам параметры [RuntimeInitializeOnLoadMethodAttribute]. Также вы можете указать параметр атрибута RunTimeInitializeLoadType для управления тем, где в цикле Player выполняется атрибутированный код. Дополнительную информацию о порядке выполнения методов, помеченных этим атрибутом, см. в справке API для RuntimeInitializeOnLoadMethodAttribute.

Внутреннее обновление анимации

На следующей диаграмме показан порядок выполнения обычного цикла обновления Animation и расширены узлы, помеченные Внутреннее обновление анимации на предыдущей диаграмме:

Порядок выполнения обычного цикла обновления Animation.
Порядок выполнения обычного цикла обновления Animation.

Следующие обратные вызова цикла Animation, показанные на диаграмме, вызываются в скриптах, которые производятся из MonoBehaviour:

Дополнительные функции событий, связанные с анимацией, вызываются в скриптах, полученных из StateMachineBehaviour:

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

Рендеринг

Этот порядок выполнения применяется только к Built-in Render Pipeline. Подробности порядка выполнения в конвейерах рендеринга, основанных на Scriptable Render Pipeline, см. в соответствующих разделах документации для Universal Render Pipeline или High Definition Render Pipeline. Если вы хотите выполнить работу непосредственно перед рендерингом, см. в Application.onBeforeRender.

  • OnPreCull: Вызывается перед тем, как камера вычеркнет сцену. Вычёркивание определяет, какие объекты видны камере. OnPreCull вызывается перед тем, как вычёркивание происходит.
  • OnBecameVisible/OnBecameInvisible: Вызывается, когда объект становится видимым/невидимым для любой камеры. OnBecameInvisible не показан на блок-схеме выше, поскольку объект может стать невидимым в любой момент.
  • OnWillRenderObject: Вызов один раз для каждой камеры, если объект видим.
  • OnPreRender: Вызывается перед тем, как камера начнет рендеринг сцены.
  • OnRenderObject: Вызывается после завершения обычного рендеринга сцены. Вы можете использовать GL class or Graphics.DrawMeshNow чтобы нарисовать настраиваемую геометрию в этом месте.
  • OnPostRender: Вызывается после того, как камера завершит рендеринг сцены.
  • OnRenderImage: Вызывается после завершения рендеринга сцены для последующей обработки изображения, см. Эффекты после обработки.
  • OnGUI: Вызывается несколько раз в кадре в ответ на события GUI. Сначала обрабатываются события Layout и Repaint, затем события Layout и клавиатура/мышь для каждого события ввода.
  • OnDrawGizmos Используется для рисования гаджетов в виде сцены для визуализации.

Примечание: OnPreCull, OnPreRender, OnPostRenderи OnRenderImage являются встроенными функциями событий Unity, которые вызываются в скриптах MonoBehaviour, но только если эти скрипты присоединены к тому же объекту, что и активированный компонент Camera. Если вы хотите получить эквивалентные обратные вызова для OnPreCull, OnPreRenderи OnPostRender на MonoBehaviour, присоединенном к другому объекту, вы должны использовать эквивалентные делегаты (обратите внимание на строчные буквы on в названиях) Camera.onPreCull, Camera.onPreRenderи Camera.onPostRender, как показано в примерах кода на соответствующих страницах справочника по скриптам.

Возобновление сопутствующих и асинхронных задач

Приостановленные сопроцедуры могут возобновляться в разных точках последовательности выполнения в зависимости от используемой инструкции yield. Например, сопроцедуры, использующие WaitForEndOfFrame, возобновляются в конце кадра, в то время как те, которые используют WaitForFixedUpdate, возобновляются в конце фиксированного шага обновления. Дополнительную информацию см. в Сопроцедуры.

Обычные .NET Задачи и асинхронные методы возобновляются в Update фаза. Подобно сопутствующим программам, пользовательские программы Unity Awaitable класс может продолжить работу с разных точек в зависимости от того, каким методом вы его ожидаете. Подробнее см. Асинхронное программирование с помощью класса Awaitable.

Примечание: Точный порядок выполнения между возобновляющимися сопутствующими процедурами и асинхронными задачами не гарантируется. Ожидаемые объекты группируются вместе и выполняются в порядке, в котором они ожидались.

Сочетание MonoBehaviours с субъектами

При использовании Объект Компонент Системы (ECS), Unity объединяет обновления системной группы ECS в цикл обновления Проигрывателя.

Вы можете использовать окно Системы Субъектов для просмотра порядка обновления системных групп ECS относительно полного цикла Проигрывателя. Дополнительные сведения см. в разделе Порядок обновления систем в документации пакета Entities.

Ограничения

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

Вы не можете указать порядок, в котором функция события вызвана для различных экземпляров одного и того же скрипта MonoBehaviour. Например, функция Update одного скрипта MonoBehaviour может быть вызвана до или после функции Update для того же скрипта MonoBehaviour на другом сценарии GameObject, включая его собственный родитель или дочерний скрипт GameObjects.

Чтобы настроить порядок выполнения между разными MonoBehaviour скриптами, см. Порядок выполнения скриптов.

Дополнительные ресурсы