unity порядок выполнения скриптов
Специальные папки и порядок компиляции скриптов
По большей части, вы можете выбирать любые имена для папок вашего проекта. Однако в Unity зарезервированы некоторые имена, которые указывают на то, что содержащийся в папках контент имеет специальное назначение. Некоторые из них влияют на порядок компиляции скриптов. По сути, у компиляции скриптов есть четыре отдельные фазы и порядок их компилирования определяется родительской папкой.
Это имеет большое значение в случае, если скрипт должен обратится к классам, определенным в других скриптах. Основное правило заключается в том, чтобы не было ссылок на скрипты, компилирующиеся в фазе после. Все, что компилируется в текущей или ранее выполненной фазе, должно быть полностью доступно.
Другая ситуация бывает когда скрипт, написанный на одном языке, должен ссылаться на класс, определенный на другом языке(например, скрипт на языке UnityScript объявляет переменные класса, определенные в C# скрипте). В этом случае класс, на который ссылаются, должен быть скомпилирован в более ранней фазе.
Есть следующие фазы компиляции:-
Фаза 1: Выполняются скрипты из папок с именами Standard Assets, Pro Standard Assets и Plugins.
Фаза 1: Выполняются скрипты из папок с именами Standard Assets, Pro Standard Assets и Plugins.
Фаза 3: Все прочие скрипты, не находящиеся в папке Editor.
Фаза 4: Все оставшиеся скрипты (т.е. находящиеся в папке Editor).
Дополнительно, любой скрипт, находящийся в папке WebPlayerTemplates, в самом верху папки Assets, вообще не будет скомпилирован. Это поведение немного отличается для вложенных папок с другими именами (например, Scripts/Editor работает как папка для скриптов редактора и Scripts/WebPlayerTemplates не помешает компиляции).
Note. Standard Assets work only in the Assets root folder.
Порядок выполнения функций событий
В скриптинге Unity есть некоторое количество функций события, которые исполняются в заранее заданном порядке по мере исполнения скрипта. Этот порядок исполнения описан ниже:
Редактор
Первая загрузка сцены
Эти функции вызываются при запуске сцены (один раз для каждого объекта на сцене).
Учтите, что для объектов, добавленных в сцену сразу, функции Awake и OnEnable для всех скриптов будут вызваны до вызова Start, Update и т.д. Естественно, для объектов вызванных во время игрового процесса такого не будет.
Перед первым обновлением кадра
Для объектов добавленных на сцену, функция Start будет вызываться во всех скриптах до функции Update. Естественно, это не может быть обеспечено при создании объекта непосредственно во время игры.
Между кадрами
Порядок обновления
Update: Update вызывается раз за кадр. Это главная функция для обновлений кадров.
Рендеринг
Сопрограммы
Нормальные обновления сопрограмм запускаются после завершения из функции Update. Сопрограмма это функция, которая приостанавливает своё исполнение (yield), пока данные YieldInstruction не завершатся. Разные способы использования сопрограмм:
Когда объект разрушается
При выходе
Эти функции вызываются во всех активных объектах в вашей сцене:
Блок-схема жизненного цикла скрипта
Следующая диаграмма совмещает порядок и повтор функций событий в течение жизни скрипта.
Настройка порядка выполнения скриптов
По умолчанию, функции Awake, OnEnable и Update расположенные в разных скриптах вызываются в том порядке, в котором загружаются сами скрипты (т.е. в неопределенном). Тем не менее, существует возможность изменить этот порядок при помощи настройки порядка выполнения скриптов ( Script Execution Order ).
Добавить скрипты в инспектор можно при помощи кнопки плюс “+” и перетягивания для изменения их относительного порядка. Обратите внимание, что существует возможность переместить скрипт как выше, так и ниже полоски Default Time (время по умолчанию); те, что над ней, будут выполнены до “времени по умолчанию”, а те, что ниже, выполнятся после. Порядок расположения скриптов в диалоговом окне сверху вниз определяет их порядок выполнения. Все остальные скрипты, не указанные в диалоговом окне, будут выполнены в момент “времени по умолчанию” и в неопределенном (случайном) порядке.
Числа, расположенные рядом с каждым скриптом, являются фактическими значениями по которым определяется порядок выполнения. В момент, когда скрипт передвинут в новую позицию, число рядом с этим скриптом автоматически изменяется соответственно. Когда происходит ручное или автоматическое изменение числа, то в мета файл этого скрипта вносятся изменения. По этой причине, чем меньше чисел изменяется при модификации порядка, тем лучше. Именно поэтому, вместо того, чтобы присваивать новые значение всем скриптам, изменения происходят, по возможности, только в тех скриптах, которые были перемещены.
Русские Блоги
Жизненный цикл скрипта Unity и порядок выполнения
Каталог статей
В Unity сценарий можно понимать как код инструкции, прикрепленный к игровому объекту для определения поведения игрового объекта. Должен быть привязан к игровому объекту, чтобы начать его жизненный цикл. Игровой объект можно понимать как контейнер, который может содержать различные компоненты.Все компоненты игрового объекта вместе определяют поведение объекта и производительность в игре.
Жизненный цикл скрипта
Общие неизбежные события в скриптах Unity показаны в следующей таблице.
имя | Время срабатывания | использовать |
---|---|---|
Awake | Вызывается при создании экземпляра скрипта | Используется для инициализации игровых объектов, обратите внимание, что выполнение Awake происходит раньше, чем функция Start всех скриптов. |
OnEnable | Вызывается, когда объект становится доступным или активным | использовать |
Start | Функция обновления вызывается перед первым запуском | Используется для инициализации игровых объектов |
Update | Вызывается один раз за кадр | Используется для обновления игровой сцены и статуса |
FixedUpdate | Вызывается один раз через каждый фиксированный физический временной интервал | Используется для обновления физического статуса |
LateUpdate | Вызывается один раз за кадр (вызов после обновления) | Используется для обновления игровой сцены и состояния, и здесь обычно размещаются обновления, связанные с камерой. |
OnGUI | Рендеринг и обработка событий OnGUI | использовать |
OnDisable | Вызывается, когда текущий объект недоступен или неактивен | использовать |
OnDestroy | Вызывается, когда текущий объект уничтожается | использовать |
Следующий код будет смотреть на время этих неизбежных событий.
Создайте новый сценарий C #, добавьте следующий код и повесьте его на любой игровой объект.
Результат печати следующий:
Можно обнаружить, что функции Awake и Start вызываются один раз при создании игрового объекта.
Когда видимое состояние скрипта регулируется во время игры, функции OnEnable и OnDisable будут вызываться соответственно, а Awake и Start больше не будут вызываться, что означает, что после монтирования скрипта, Пробуждение и запуск имеют и будут выполнены только один раз.
Функции Update, FixedUpdate, LateUpdate, OnGUI вызываются несколько раз во время игры (число в правой части окна журнала указывает, сколько раз было напечатано сообщение журнала).
Наконец, когда игровой объект будет уничтожен, по очереди будут вызываться функции OnDisable и OnDestory.
Диаграмма жизненного цикла MonoBehavior
Далее поместите диаграмму жизненного цикла, нарисованную иностранным другом.
Порядок выполнения скрипта
При разработке игр неизбежно будет использоваться множество скриптов, так как же определить порядок вызова между разными скриптами?
Добавьте приведенный выше код в сценарии Test1, Test2 и Test3 по очереди (измените распечатанный журнал соответствующим образом) и установите их на различные игровые объекты.
Порядок установки: сначала смонтировать Test3, затем Test2 и, наконец, Test1.
Результат печати показан на рисунке ниже.
Результатом печати будет печать сначала Test1, затем Test2 и, наконец, Test3.
Фактически, порядок выполнения скрипта связан с порядком подключения к игровому объекту. Первый, который будет смонтирован, выполняется последним, а последний, который будет смонтирован, выполняется первым (если читатели сомневаются, вы можете постоянно настраивать порядок монтирования скрипта, чтобы видеть, соответствует ли печать журнала приведенному выше заключению).
Следует отметить, что независимо от порядка выполнения нескольких сценариев, функция Awake всех сценариев будет выполняться перед всеми функциями запуска, и все функции запуска также должны выполняться перед всеми функциями обновления. Функция жизненного цикла аналогична (вы также можете увидеть информацию журнала на приведенном выше рисунке).
Заказ индивидуального исполнения
Нажмите «+», чтобы добавить скрипт, установите для него значение заказа, чем меньше значение заказа, первое выполнение, чем больше значение заказа, тем позже выполнение
Русские Блоги
Порядок выполнения и порядок компиляции скриптов в Unity3D
Многие сценарии могут быть созданы в Unity одновременно и могут быть связаны с различными игровыми объектами, каждый из которых работает в своем собственном жизненном цикле. Скрипты связаны с компиляцией и выполнением. В этой статье будет рассмотрена проблема порядка компиляции и выполнения скриптов в Unity.
Порядок выполнения функции события
Позвольте мне сначала поговорить о порядке исполнения.
Последовательность выполнения функций событий в официальном скрипте показана ниже:
Мы можем сделать небольшой эксперимент, чтобы проверить это:
Создайте три игровых объекта в представлении «Иерархия» и три сценария в представлении «Проект», как показано на следующем рисунке, а затем привяжите сценарии к соответствующим игровым объектам по порядку:
Коды трех сценариев абсолютно одинаковы, за исключением небольшой разницы в названии:
public class Scring0 : MonoBehaviour
Debug.Log( «Script0 ======= Awake» );
bool isUpdate = false ;
Debug.Log( «Script0 ======= Update» );
bool isLateUpdate = false ;
Debug.Log( «Script0 ======= LateUpdate» );
Сыграйте в игру и посмотрите, как они исполняются. Как показано на следующем рисунке, Awake, Update и LateUpdate, независимо от того, сколько раз игра запускалась, порядок их выполнения одинаков.
public class Script0 : MonoBehaviour
Debug.Log( «Script0 ========= Awake» );
// bool isUpdate = false;
bool isLateUpdate = false ;
Debug.Log( «Script0 ========= LateUpdate» );
Запустите игру еще раз и посмотрите ее результаты. Порядок выполнения сценария точно такой же, как и раньше. Даже если Script0 удалит метод Update, он не будет напрямую выполнять метод LateUpdate. Вместо этого он ожидает выполнения методов Update в Script1 и Script2, а затем выполняет все методы Update.
С помощью этих двух примеров мы можем четко определить, как фон Unity выполняет сценарий. Awake, Start, Update, LateUpdate, FixedUpdate и т. Д. Каждого сценария, все методы будут объединены в фоновом режиме:
Пробуждение () в фоновом режиме
// Здесь мы временно будем следовать порядку выполнения скрипта на рисунке выше. Мы поговорим о порядке, в котором порядок может быть настроен позже.
Пробудитесь () в сценарии 2;
Пробудитесь () в скрипте 1;
Пробудитесь () в скрипте 0;
Фоновые методы Awake, Update, LateUpdate и т. Д. Все в порядке. После завершения выполнения Awake в скрипте для всех игровых объектов выполняются методы Start, Update и LateUpdate.
Обновление () в фоновом режиме
// Здесь мы временно будем следовать порядку выполнения скрипта на рисунке выше. Мы поговорим о порядке, в котором порядок может быть настроен позже.
Update () в сценарии 2;
Update () в скрипте 1;
Update () в скрипте 0;
Порядок выполнения скрипта
Затем давайте посмотрим на эту ситуацию: создайте объект куба в методе Awake сценария 0, а затем получите объект куба в методе Awake сценария 2. Код выглядит следующим образом:
public class Script0 : MonoBehaviour
public class Script2 : MonoBehaviour
GameObject go = GameObject.Find( «Cube» );
Если порядок выполнения сценария сначала Script0, то Script2, затем Awake в Script2 может правильно получить объект куба, но если порядок выполнения сценария сначала Script2, а затем Script0, то Script2 обязательно сообщит Нулевой указатель неверен.
Тогда в самом проекте очень много сценариев, и мы не знаем порядок их выполнения (некоторые люди говорят, что они выполняются в соответствии со структурой стека, то есть сценарии, привязанные к игровому объекту, выполняются первыми. Это можно сделать из приведенного выше. Получено в примере, но чиновник так и не сказал, и дальнейшие исследования необходимы). Но в общем случае рекомендуется создать игровой объект или объект Resources.Load (Prefab) в методе Awake, а затем получить игровой объект или компонент в методе Start, поскольку порядок выполнения функций событий фиксирован, что позволяет обеспечить защиту от дурака.
Кроме того, Unity также предоставляет метод для установки порядка выполнения скрипта.В пункте меню «Правка-> Параметры проекта-> Порядок выполнения скрипта», вы можете увидеть следующий рисунок на панели «Инспектор» шоу:
Нажатие «+» в правом нижнем углу откроет выпадающее окно, включающее все скрипты в игре. После добавления сценариев вы можете использовать мышь для перетаскивания сценариев для сортировки сценариев. Чем меньше число после имени сценария, тем выше сценарий, тем раньше он будет выполнен. Время по умолчанию указывает порядок выполнения тех сценариев, чей порядок выполнения не установлен.
В соответствии с настройками на картинке выше, давайте снова посмотрим на вывод консоли, чтобы подтвердить, работают ли наши настройки (примечание: раскомментируйте метод Update в скрипте Script0):
Порядок компиляции скриптов
Последовательность компиляции сценария является головной болью, официальное заявление немного расплывчато, см. Официальное объяснение:
Поскольку последовательность компиляции сценариев включает в себя специальные папки, такие как вышеупомянутые стандартные папки ресурсов, такие как плагины, редактор и стандартные активы, размещение сценариев очень важно. Вот пример, иллюстрирующий порядок компиляции скриптов в разных папках:
На самом деле, если вы будете осторожны, вы обнаружите, что если вы создадите иерархию папок, как показано на рисунке выше, после компиляции проекта, некоторые проекты со словами Editor и firstpass в имени файла будут сгенерированы в папке проекта. файл. Например, согласно приведенной выше структуре папок, давайте откроем папку проекта, чтобы увидеть, как выглядит сгенерированный файл проекта?
Давайте подробнее рассмотрим, что означают эти слова. Как они связаны с порядком компиляции скриптов?
1. С точки зрения типов языков сценариев Unity3d поддерживает 3 языка сценариев, которые будут скомпилированы в библиотеки CLI.
Скриптовый язык в проекте | Инженерный префикс | Инженерный суффикс |
C# | Assembly-CSharp | csproj |
UnityScript | Assembly-UnityScript | unityproj |
Boo | Assembly-Boo | booproj |
Если в проекте присутствуют все три сценария, Unity сгенерирует проекты с 3 типами префиксов.
2. Для каждого языка сценариев в соответствии с местом размещения сценария (на самом деле он также частично основан на роли сценария, например сценария расширения редактора, который должен быть помещен в папку редактора), Unity создаст проект с 4 суффиксами. Первый проход означает компиляцию первым, а редактор означает сценарии, помещенные в папку редактора.
В приведенном выше примере мы получили два набора файлов разработки проекта: используемые Virtual Studio и MonoDevelop соответственно (пакет суффиксов не содержит vs). Для простоты мы анализируем только vs project. Полученный список файлов выглядит следующим образом:
Assembly-CSharp-filepass-vs.csproj
Assembly-CSharp-Editor-filepass-vs.csproj
Assembly-CSharp-vs.csproj
Assembly-CSharp-Editor-vs.csproj
Согласно официальному объяснению, порядок их составления следующий:
(1) Все сценарии в папке «Стандартные активы», «Стандартные активы Pro» или «Плагины» будут создавать файл Assembly-CSharp-filepass-vs.csproj и сначала его компилировать;
(2) Все сценарии в папке Стандартные активы / Редактор, Стандартные активы Pro / Редактор или Плагины / Редактор создают файл проекта Assembly-CSharp-Editor-filepass-vs.csproj, затем сборник;
(3) Все файлы сценариев вне Активов / Редактора, а не в (1), (2) (обычно эти сценарии являются сценариями расширения без редактирования, которые мы пишем сами) Создайте файл проекта Assembly-CSharp-vs.csproj и скомпилируйте его;
(4) Все сценарии в Assets / Editor генерируют файл проекта Assembly-CSharp-Editor-vs.csproj, который компилируется.
Причина, по которой проект построен таким образом и скомпилирован в этом порядке, также определяется наличием зависимостей между библиотеками DLL.
Хорошо, пока мы можем легко определить порядок компиляции скриптов в приведенном выше примере (на самом деле, я написал порядок в имени файла скрипта)
Небольшие упражнения
Сколько файлов проекта может быть сгенерировано в проекте Unity3d?