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 ).

unity порядок выполнения скриптов

Добавить скрипты в инспектор можно при помощи кнопки плюс “+” и перетягивания для изменения их относительного порядка. Обратите внимание, что существует возможность переместить скрипт как выше, так и ниже полоски Default Time (время по умолчанию); те, что над ней, будут выполнены до “времени по умолчанию”, а те, что ниже, выполнятся после. Порядок расположения скриптов в диалоговом окне сверху вниз определяет их порядок выполнения. Все остальные скрипты, не указанные в диалоговом окне, будут выполнены в момент “времени по умолчанию” и в неопределенном (случайном) порядке.

Числа, расположенные рядом с каждым скриптом, являются фактическими значениями по которым определяется порядок выполнения. В момент, когда скрипт передвинут в новую позицию, число рядом с этим скриптом автоматически изменяется соответственно. Когда происходит ручное или автоматическое изменение числа, то в мета файл этого скрипта вносятся изменения. По этой причине, чем меньше чисел изменяется при модификации порядка, тем лучше. Именно поэтому, вместо того, чтобы присваивать новые значение всем скриптам, изменения происходят, по возможности, только в тех скриптах, которые были перемещены.

Источник

Русские Блоги

Жизненный цикл скрипта Unity и порядок выполнения

Каталог статей

В Unity сценарий можно понимать как код инструкции, прикрепленный к игровому объекту для определения поведения игрового объекта. Должен быть привязан к игровому объекту, чтобы начать его жизненный цикл. Игровой объект можно понимать как контейнер, который может содержать различные компоненты.Все компоненты игрового объекта вместе определяют поведение объекта и производительность в игре.

Жизненный цикл скрипта

Общие неизбежные события в скриптах Unity показаны в следующей таблице.

имяВремя срабатыванияиспользовать
AwakeВызывается при создании экземпляра скриптаИспользуется для инициализации игровых объектов, обратите внимание, что выполнение Awake происходит раньше, чем функция Start всех скриптов.
OnEnableВызывается, когда объект становится доступным или активнымиспользовать
StartФункция обновления вызывается перед первым запускомИспользуется для инициализации игровых объектов
UpdateВызывается один раз за кадрИспользуется для обновления игровой сцены и статуса
FixedUpdateВызывается один раз через каждый фиксированный физический временной интервалИспользуется для обновления физического статуса
LateUpdateВызывается один раз за кадр (вызов после обновления)Используется для обновления игровой сцены и состояния, и здесь обычно размещаются обновления, связанные с камерой.
OnGUIРендеринг и обработка событий OnGUIиспользовать
OnDisableВызывается, когда текущий объект недоступен или неактивениспользовать
OnDestroyВызывается, когда текущий объект уничтожаетсяиспользовать

Следующий код будет смотреть на время этих неизбежных событий.
Создайте новый сценарий C #, добавьте следующий код и повесьте его на любой игровой объект.

Результат печати следующий:

unity порядок выполнения скриптов

Можно обнаружить, что функции Awake и Start вызываются один раз при создании игрового объекта.
Когда видимое состояние скрипта регулируется во время игры, функции OnEnable и OnDisable будут вызываться соответственно, а Awake и Start больше не будут вызываться, что означает, что после монтирования скрипта, Пробуждение и запуск имеют и будут выполнены только один раз.
Функции Update, FixedUpdate, LateUpdate, OnGUI вызываются несколько раз во время игры (число в правой части окна журнала указывает, сколько раз было напечатано сообщение журнала).
Наконец, когда игровой объект будет уничтожен, по очереди будут вызываться функции OnDisable и OnDestory.

Диаграмма жизненного цикла MonoBehavior

Далее поместите диаграмму жизненного цикла, нарисованную иностранным другом.

unity порядок выполнения скриптов

Порядок выполнения скрипта

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

Добавьте приведенный выше код в сценарии Test1, Test2 и Test3 по очереди (измените распечатанный журнал соответствующим образом) и установите их на различные игровые объекты.
Порядок установки: сначала смонтировать Test3, затем Test2 и, наконец, Test1.
Результат печати показан на рисунке ниже.
unity порядок выполнения скриптов

Результатом печати будет печать сначала Test1, затем Test2 и, наконец, Test3.
Фактически, порядок выполнения скрипта связан с порядком подключения к игровому объекту. Первый, который будет смонтирован, выполняется последним, а последний, который будет смонтирован, выполняется первым (если читатели сомневаются, вы можете постоянно настраивать порядок монтирования скрипта, чтобы видеть, соответствует ли печать журнала приведенному выше заключению).

Следует отметить, что независимо от порядка выполнения нескольких сценариев, функция Awake всех сценариев будет выполняться перед всеми функциями запуска, и все функции запуска также должны выполняться перед всеми функциями обновления. Функция жизненного цикла аналогична (вы также можете увидеть информацию журнала на приведенном выше рисунке).

Заказ индивидуального исполнения

unity порядок выполнения скриптов

Нажмите «+», чтобы добавить скрипт, установите для него значение заказа, чем меньше значение заказа, первое выполнение, чем больше значение заказа, тем позже выполнение

Источник

Русские Блоги

Порядок выполнения и порядок компиляции скриптов в Unity3D

Многие сценарии могут быть созданы в Unity одновременно и могут быть связаны с различными игровыми объектами, каждый из которых работает в своем собственном жизненном цикле. Скрипты связаны с компиляцией и выполнением. В этой статье будет рассмотрена проблема порядка компиляции и выполнения скриптов в Unity.

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

Позвольте мне сначала поговорить о порядке исполнения.
Последовательность выполнения функций событий в официальном скрипте показана ниже:
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, независимо от того, сколько раз игра запускалась, порядок их выполнения одинаков.
unity порядок выполнения скриптов

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 порядок выполнения скриптов

С помощью этих двух примеров мы можем четко определить, как фон 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 также предоставляет метод для установки порядка выполнения скрипта.В пункте меню «Правка-> Параметры проекта-> Порядок выполнения скрипта», вы можете увидеть следующий рисунок на панели «Инспектор» шоу:
unity порядок выполнения скриптов

Нажатие «+» в правом нижнем углу откроет выпадающее окно, включающее все скрипты в игре. После добавления сценариев вы можете использовать мышь для перетаскивания сценариев для сортировки сценариев. Чем меньше число после имени сценария, тем выше сценарий, тем раньше он будет выполнен. Время по умолчанию указывает порядок выполнения тех сценариев, чей порядок выполнения не установлен.
unity порядок выполнения скриптов

В соответствии с настройками на картинке выше, давайте снова посмотрим на вывод консоли, чтобы подтвердить, работают ли наши настройки (примечание: раскомментируйте метод Update в скрипте Script0):
unity порядок выполнения скриптов

Порядок компиляции скриптов

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

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

unity порядок выполнения скриптов

На самом деле, если вы будете осторожны, вы обнаружите, что если вы создадите иерархию папок, как показано на рисунке выше, после компиляции проекта, некоторые проекты со словами Editor и firstpass в имени файла будут сгенерированы в папке проекта. файл. Например, согласно приведенной выше структуре папок, давайте откроем папку проекта, чтобы увидеть, как выглядит сгенерированный файл проекта?
unity порядок выполнения скриптов

Давайте подробнее рассмотрим, что означают эти слова. Как они связаны с порядком компиляции скриптов?

1. С точки зрения типов языков сценариев Unity3d поддерживает 3 языка сценариев, которые будут скомпилированы в библиотеки CLI.

Скриптовый язык в проектеИнженерный префиксИнженерный суффикс
C#Assembly-CSharpcsproj
UnityScriptAssembly-UnityScriptunityproj
BooAssembly-Boobooproj

Если в проекте присутствуют все три сценария, 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?

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *