Сценарий в Unity не похож на традиционную идею программы, в которой код непрерывно выполняется в цикле, пока не завершит свою задачу. Вместо этого Unity периодически передает управление сценарию, вызывая определенные функции, объявленные в нем. После завершения выполнения функции управление возвращается в Unity. Эти функции известны как функции событий, поскольку они активируются Unity в ответ на события, происходящие во время игры. Unity использует схему именования, чтобы определить, какую функцию вызывать для определенного события. Например, вы уже видели функцию Update (вызывается перед обновлением кадра) и функцию Start (вызывается непосредственно перед обновлением первого кадра объекта). В Unity доступно гораздо больше функций обработки событий; полный список можно найти на странице справочника по сценариям для класса MonoBehaviour вместе с подробностями их использования. Ниже приведены некоторые из наиболее распространенных и важных событий.
Регулярные обновления
Игра больше похожа на анимацию, где кадры анимации генерируются на лету. Ключевой концепцией программирования игр является внесение изменений в положение, состояние и поведение объектов в игре непосредственно перед визуализацией каждого кадра. Функция Update — основное место для такого кода в Unity. Update вызывается перед визуализацией кадра, а также перед расчетом анимации.
void Update() {
float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * distance);
}
физический движокСистема, которая имитирует аспекты физических систем, чтобы объекты могли правильно ускоряться и подвергаться воздействию столкновений, гравитации и другие силы. Подробнее
См. в Словарь также обновляется в дискретных шагах по времени в аналогичен отрисовке кадраПроцесс отрисовки графики на экран (или отрисовки текстуры). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь. Отдельная функция события, называемая FixedUpdate, вызывается непосредственно перед каждым обновлением физики. Поскольку обновления физики и кадра происходят с разной частотой, вы получите более точные результаты из физического кода, если поместите его в функцию FixedUpdate, а не в Update.
void FixedUpdate() {
Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
rigidbody.AddForce(force);
}
Иногда бывает полезно иметь возможность вносить дополнительные изменения после вызова функций Update и FixedUpdate для всех объектов в сценеСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь после расчета всех анимаций. Например, камераКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
See in Словарь должен оставаться обученным на целевом объекте; регулировка ориентации камеры должна производиться после перемещения целевого объекта. Другой пример — когда код скрипта должен переопределять эффект анимации (например, чтобы голова персонажа смотрела на целевой объект в сцене). В подобных ситуациях можно использовать функцию LateUpdate.
void LateUpdate() {
Camera.main.transform.LookAt(target.transform);
}
События инициализации
Часто полезно иметь возможность вызывать код инициализации перед любыми обновлениями, происходящими во время игры. Функция Start вызывается перед первым кадром или физическим обновлением объекта. Функция Awake вызывается для каждого объекта в сцене во время загрузки сцены. Обратите внимание, что хотя функции Start и Awake различных объектов вызываются в произвольном порядке, все Awakes завершатся до вызова первого Start. Это означает, что код в функции запуска может использовать другие инициализации, ранее выполненные на этапе пробуждения.
События графического интерфейса
В Unity есть система рендеринга элементов управления графическим интерфейсом для основного действия в сцене и реагирования на щелчки по этим элементам управления. Этот код обрабатывается несколько иначе, чем обычное обновление фрейма, поэтому его следует поместить в функцию OnGUI, которая будет вызываться периодически.
void OnGUI() {
GUI.Label(labelRect, "Game Over");
}
Вы также можете обнаруживать события мыши, происходящие над GameObjectфундаментальным объектом в сценах Unity, который может представлять персонажей, реквизит , пейзажи, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Посмотрите в Словарь, как он появляется на сцене. Это можно использовать для наведения оружия или отображения информации о персонаже, который в данный момент находится под указателем мыши. Набор функций события OnMouseXXX (например, OnMouseOver, OnMouseDown ) позволяет сценарию реагировать на действия пользователя с помощью мыши. Например, если кнопка мыши нажата, когда указатель находится над определенным объектом, будет вызвана функция OnMouseDown в сценарии этого объекта, если она существует.
Физические события
Физический движок будет сообщать о столкновенияхСтолкновение происходит, когда физический движок обнаруживает, что коллайдеры двух игровых объектов соприкасаются или перекрываются. , когда хотя бы один имеет компонент Rigidbody и находится в движении. Подробнее
Просмотреть в Словарь относительно объекта, вызвав функции события на сценарий этого объекта. OnCollisionEnter, OnCollisionStay и OnCollisionExit будут вызываться при установлении, удержании и разрыве контакта. Соответствующие OnTriggerEnter, OnTriggerStay и OnTriggerExit будут вызываться, когда коллайдерневидимая форма объекта используется для обработки физических столкновений объекта. Коллайдер не обязательно должен быть точно такой же формы, как сетка объекта — грубое приближение часто бывает более эффективным и неразличимым в игровом процессе. Подробнее
См. в Словарь настроен как триггер (т. е. коллайдер, который просто обнаруживает когда что-то входит в него, а не реагирует физически). Эти функции могут вызываться несколько раз подряд, если во время обновления физики обнаружено более одного контакта, поэтому в функцию передается параметр, предоставляющий сведения о столкновении (положение, идентификатор входящего объекта и т. д.).
void OnCollisionEnter(otherObj: Collision) {
if (otherObj.tag == "Arrow") {
ApplyDamage(10);
}
}