Автор Тема: События Unity3D  (Прочитано 8661 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Август 16, 2014, 16:55:05 pm
Прочитано 8661 раз

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Скриптовые события Unity3d
источник

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

 Данная функция вызывается каждый раз перед отображением очередного кадра. Самая используемая для расчетов игровых параметров. Но категорически не рекомендуется использовать в ней расчет физических показателей.
Update()


 Данная функция вызывается каждый раз при расчете физических показателей. Все расчеты физики следует проводить именно в ней.
FixedUpdate()


 Данная функция вызывается после выполнения сценария функции Update().
LateUpdate()


Зоной триггера является объект, для которого установлено свойство isTrigger в значении true.
GameObject.collider.isTrigger = true;
При указании данного свойства объект игнорируется физическим движком и используется лишь в качестве инициализации событий.
 Все функции, связанные с соприкосновением объектов, или пересечении объектом зоны триггера принимают в качестве параметра объект класса Collider, содержащий информацию об объекте, с которым произошло взаимодействие.

 Данная функция вызывается всякий раз при входе физического тела в зону триггера.
OnTriggerEnter(collider:Collider)


 Данная функция вызывается каждый раз при выходе физического тела из зоны триггера.
OnTriggerExit(collider:Collider)


 Данная функция вызывается постоянно, пока физическое тело находится внутри зоны триггера.
OnTriggerStay(collider:Collider)


 Данная функция вызывается каждый раз при входе одного физического тела в другое физическое тело.
OnCollisionEnter(collider:Collider)


 Данная функция вызывается каждый раз при выходе одного физического тела из другого физического тела.
OnCollisionExit(collider:Collider)


 Данная функция вызывается постоянно, до тех пор пока одно физическое тело находится внутри другого физического тела.
OnCollisionStay(collider:Collider)


 Данная функция вызывается до инициализации всех остальных скриптов. Обычно используется для установки определенных параметров и инициализации переменных.
Awake()


 Данная функция вызывается перед первым запуском любых Update функций, но после выполнения функции Awake().
Start()


 Данная функция вызывает сброс значений на значения по умолчанию. Используется лишь в режиме редактирования.
Reset()


 Данная функция вызывается при входе курсора мыши на игровой объект, или на экземпляр объекта GUIElement (игровой интерфейс).
OnMouseEnter()


 Данная функция вызывается при уходе курсора мыши с игрового объекта или экземляра объекта GUIElement.
OnMouseExit()


 Данная функция вызывается постоянно, пока курсор мыши находится на игровом объекте, или на элементе игрового интерфейса.
OnMouseOver()


 Данная функция вызывается при нажатии кнопки мыши на игровом объекте или элементе игрового интерфейса.
OnMouseDown()


 Данная функция вызывается при отпускании кнопки мыши, после нажатия ее на игровом объекте или элементе игрового интерфейса.
OnMouseUp()


 Данная функция вызывается, если игрок уведет курсор мыши с объекта или элемента игрового интерфейса, после того, как зажал кнопку мыши.
OnMouseUpAsButton()


 Данная функция вызывается при нахождении курсора мыши с зажатой кнопкой на игровом объекте или элементе игрового интерфейса.
OnMouseDrag()


 Физическая связь между объектами обычно используется для создания подвижных соединений между объектами.
 Вызывается при разрыве физической связи между игровыми объектами. После разрыва связи — она автоматически удаляется из игры. Получает в качестве параметра силу, вызвавшую разрыв соединения в виде числа с плавающей точкой.
OnJointBreak(force:float)


 Данная функция вызывается при загрузке игрового уровня (сцены). Получает в качестве параметра порядковый номер загруженной сцены, в виде целого числа.
OnLevelWasLoaded(level:int)


 Данная функция вызывается если объект находится в поле зрения хотя бы одной камеры. Удобно использовать для отключения не видных игроку игровых объектов в целях оптимизации. Разумеется если нет необходимости продолжать выполнение действий даже если объект скрыт.
OnBecameVisible()


 Данная функция вызывается если объект не находится в поле зрения ни одной камеры.
OnBecameInvisible()


 Данная функция вызывается при активации (включении) объекта.
OnEnable()


 Данная функция вызывается при отключении объекта.
OnDisable()


 Данная функция вызывается при уничтожении объекта.
OnDestroy()


 Данная функция вызывается перед определением списка объектов, которые будут рендериться в кадре.
OnPreCull()


 Данная функция вызывается перед рендерингом сцены в кадре.
OnPreRender()


 Данная функция вызывается после рендеринга сцены в кадре.
OnPostRender()


 Данная функция вызывается в момент рендеринга текущего игрового объекта в сцене.
OnRenderObject()


 Данная функция вызывается лишь один раз для каждой камеры при первом рендеринге игрового объекта.
OnWillRenderObject()


 Данная функция используется для отрисовки элементов игрового интерфейса и вызова событий, связанных с ним.
OnGUI()


 Данная функция позволяет отправить всем игровым объектам сигнал паузы. Принимает в качестве параметра булево значение, определяющее состояние паузы.
OnApplicationPause(pause:boolean)


 Данная функция вызывается при получении или потере фокуса игрового окна. Получает в качестве параметра булево значение, определяющее текущее состояние.
OnApplicationFocus(focus:boolean)


 Данная функция вызывается при выходе из игры.
OnApplicationQuit()

Это ещё неполный список событий Unity3d.
Раздел официальной справки Unity3d, по MonoBehaviour
http://docs.unity3d.com/ScriptReference/MonoBehaviour.html
« Последнее редактирование: Март 30, 2015, 21:51:50 pm от Mimi Neko »

Август 16, 2014, 17:01:05 pm
Ответ #1

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
зарезервировано

Август 16, 2014, 17:12:12 pm
Ответ #2

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Порядок событий в Unity3D
источник


Предисловие переводчика
Но, перед началом официальной справки, хочу отметить, что события в Unity3D делятся на три большие группы:
События, вызываемые по событиям масло масляное (загрузка сцены, выход пользователя)
Данная группа событий выполняется на нерегулярной основе
События, вызываемые при прорисовке кадра
В этом случае все используемые скрипты вызываются в цикле прорисовки экрана, а значит, будут непосредственно влиять на FPS (частоту кадров в секунду). Поэтому здесь нужно очень аккуратно работать с функциями, которые требуют много времени на обработку.
События, вызываемые при расчёте физики
И последняя группа. Для расчёта физики создаётся отдельная, независимая нить, события в которой вызываются с определённым интервалом времени. Размер этого интервала можно настроить в пункте меню: Edit -> Project Settings -> Time -> Fixed Timestep.

 Зная эту разбивку Вы уже можете принимать решения о том, где какой код лучше расположить.
 Однако, все вычисления, производимые как при расчёте физики, так и при прорисовке, влияют на «отзывчивость» игры. Поэтому, при разработке приложения, наиболее ресурсоёмкие вычисления желательно оформлять в сопрограммах (Coroutine).



 Теперь перейдём непосредственно к переводу раздела справки.
---------------------------------------------------------------------------------------

Порядок выполнения функций событий
В Unity3D, существует целый ряд событий, выполняемых в определенном порядке. Этот порядок мы опишем ниже:

Первая загрузка сцены
Эти функции вызываются, когда сцена стартует (по одному разу для каждого объекта в кадре).
Awake: Эта функция всегда вызывается до начала любых функций, а также сразу после инициализации префаба.
OnEnable: (вызывается, если объект является активным): Эта функция вызывается только после того, как объект будет включен.

До первого обновления кадров
Start: вызывается перед прорисовкой первого фрейма, только если сценарий определён.

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

Порядок обновления
Для отслеживания логики игры, взаимодействия и анимации объектов, положения камеры и т.д., есть несколько различных событий, которые Вы можете использовать. Общий механизм для выполнения большинства задач находится в функции Update(), но есть и другие функции.
FixedUpdate: FixedUpdate() не зависит от Update(), и может вызываться как чаще него так и реже (обычно вызывается реже, если FPS достаточно высок). Это событие может быть вызвано несколько раз в кадре, если FPS низкий а может быть и вообще не вызвано между кадрами, если FPS высокий. Все физические расчеты движка и обновление происходит сразу после FixedUpdate(). При применении расчетов движения внутри FixedUpdate(), вам не нужно умножать ваше значение на Time.deltaTime. Это потому, что FixedUpdate() вызывается из таймера, независимого от частоты кадров.
Update: Update() вызывается один раз за кадр. Это основное событие для прорисовки кадра.
LateUpdate: LateUpdate() вызывается один раз в кадре, после завершения Update(). Любые расчеты, которые осуществляются в Update() будет завершены, при вызове LateUpdate(). Основным использованием LateUpdate() обычно является слежение за камерой от третьего лица. Если Вы осуществите движение Вашего персонажа в событии Update(), то движения камеры и расчётов её месторасположения можете вести в событии LateUpdate(). Это будет гарантировать, что персонаж прошел полностью перед камерой, и закрепил свое расположение.


Отрисовка сцены (Rendering)
OnPreCull: Вызывается перед сборкой сцены на камере. Сборка определяет, какие объекты видны камере. OnPreCull вызывается, только если будет происходить «обрезка» сцены от невидимых объектов.
OnBecameVisible / OnBecameInvisible: Вызывается, когда объект становится видимым / невидимым для любой камеры.
OnWillRenderObject: Вызывается один раз для каждой камеры, если объект является видимым.
OnPreRender: Вызывается перед тем, как на камеру начинается отрисовка сцены
OnRenderObject: Вызывается, когда все объекты сцены прорисованы. Вы можете использовать функции GL или Graphics.DrawMeshNow, что-бы создать свои рисунки на этой камере.
OnPostRender: Вызывается после завершения отрисовки сцены на камере.
OnRenderImage (только Pro версия): Вызывается после прорисовки сцены, для постобработки изображения на экране.
OnGUI: вызывается несколько раз в кадре в ответ на события интерфейса. События расположения и заполнения цветом обрабатываются в первую очередь, а затем события ввода с клавиатуры / мыши.
OnDrawGizmos: Используется для рисования Gizmo на сцене.

Сопрограммы
Обычно вызов сопрограммы выполняется после возвращения функции Update(). Сопрограмма это функция, которая может приостановить исполнение (yield), пока не будет выполнена. Различные виды использования Сопрограмм:
yield: сопрограмма будет продолжена после всех функций Update(), которые будут вызваны в следующем кадре.
yield WaitForSeconds(2): Продолжить после указанного времени задержки, когда все функции Update() уже были вызваны в кадре
yield WaitForFixedUpdate(): Продолжается, когда все функции FixedUpdate() уже были вызваны
yield WWW: Продолжается, когда загрузка WWW-контента завершена.
yield StartCoroutine(MyFunc): Связи сопрограмм, вызов сопрограммы будет ожидать завершения функции MyFunc.

Разрушение объектов
OnDestroy: Эта функция вызывается для последнего кадра существования объекта (объект может быть уничтожен в ответ на Object.Destroy или при закрытии сцены).

При выходе
Эти функции вызываются для всех активных объектов в сцене:
OnApplicationQuit: Эта функция вызывается для всех игровых объектов перед закрытием приложения. В редакторе это происходит, когда пользователь прекращает PlayMode. В веб-плеер это происходит при закрытии веб-плеера.
OnDisable: Эта функция вызывается, когда объект отключается или становится неактивным.

 Таким образом, происходит такой порядок выполнения скриптов:
Все события Awake
Все события Start
цикл (с шагом в переменной delta time)
Все функции FixedUpdate
отработка физического движка
события триггеров OnEnter/Exit/Stay
события столкновений OnEnter/Exit/Stay
Rigidbody преобразования, согласно transform.position и вращения
OnMouseDown/OnMouseUp др. события ввода
Все события Update()
Анимация, смешение и трансформация
Все события LateUpdate
Прорисовка (Rendering)

Советы
Если Вы запускаете сопрограммы в LateUpdate, то они также будут вызваны после LateUpdate непосредственно перед рендерингом.
 Сопрограммы выполняются после всех функций Update().


------------------------------------------------------------------------
Послесловие переводчика
Это моя первая статья на хабре, и мой первый перевод тех.документации.
 Так-же прошу все предложения и замечания (конструктивные) в комменты.
 Надеюсь, этот пост окажется кому-нибудь полезным =)

 P.S. дополнение от пользователя Leopotam
 Coroutine — это просто кусок кода, выполняемый в основном потоке. Это очень важно понимать, потому что просто вынести тяжелый расчет в сопрограмму и посчитать, что все будет хорошо — в корне неверно, вычисления просто забьют поток точно так же, как и если бы они выполнялись в Update или еще где-то в стандартных методах. Нужно разбивать вычисления на итерации так, чтобы при повторной итерации процесс продолжился бы. Весь смысл сопрограмм — автоматизация вызова этих итераций на каждом цикле отрисовки.
 Например:
IEnumerator FindBozons() {
    var isFound = false;
    var colliderSectionID = 0;
    var colliderSectionCount = 10;
    while (!isFound) {
        // Обрабатываем только одну секцию за раз, чтобы снизить нагрузку
        isFound = ProcessDataFromSection(colliderSectionID);
        colliderSectionID = (colliderSectionID ++) % colliderSectionCount;
        yield return null;
    }
    // Покупаем яхты / пароходы
    // Сопрограмма завершается
}

void Start() {
    StartCoroutine(FindBozons());
}


 Механизм сопрограмм обеспечит автоматическое сохранение состояние контекста исполнения функции и возврат в место прерывания (yield).
« Последнее редактирование: Август 16, 2014, 17:15:55 pm от Mimi Neko »

Август 16, 2014, 17:25:28 pm
Ответ #3

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Визуальные схемы основных событий Unity3d

Октябрь 28, 2014, 22:18:19 pm
Ответ #4

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Описание событий, на оффсайте Unity3d по русски:
http://docs.unity3d.com/ru/current/Manual/ExecutionOrder.html

Сериализация в эдиторе:
« Последнее редактирование: Октябрь 28, 2014, 22:20:10 pm от Mimi Neko »