Пользователь
0,0
рейтинг
22 сентября 2011 в 14:43

Разработка → Погружение в скрипты игрового движка Unity3d, ч.2

Доброго времени суток всем читателям! Не так давно мною была опубликована статья, охватывающая некоторые часто используемые скриптовые возможности движка 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()


В данном справочнике охвачены далеко не все скриптовые события, имеющиеся в игровом движке. Например события, связанные с сетью я оставил на одну из следующих статей, где будет охвачено описание работы с сетью.
Описания некоторых функций я брал из Script Reference, поэтому если вам оно покажется неверным — прошу написать мне об этом, я исправлю.

Спасибо что уделили время на прочтение статьи, я буду очень рад, если она кому-то помогла.
Абдуллин Дамир @damirazo
карма
49,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (12)

  • +2
    Могу только пожелать вам успехов в будущих статьях!

    Для себя нашёл несколько функций, невиданных мною раньше. В избранное
  • +1
    извиняюсь за повторный оффтопик,
    я в предыдущей теме задавал вопрос

    можно ли модифицировать один обьект другим обьектом с использованием булевой опреации?
    грубо говоря есть квадрат и окружность (пересекающаяся), надо получить обьект иллиюстрирующий булевую операцию «И»
    тоесть оставить только ту область где два обьекта пересекаются?

    ответ был что можно программно обработать вершины.

    я готов оплатить статью по данной теме, если вы ее напишите и снабдите загружаемым примером,
    если кто хочет присоеденится к спонсированию пишите в данной нити :)
    (правда не понятно пока сколько это может стоить)
    • +1
      Лично передо мной на данный момент не стояло подобных задач, поэтому я, честное слово, в замешательстве. :) Есть некоторые идеи по данному поводу, в ближайшие дни попробую поэкспериментировать, и если опыты приведут к положительному результату, то я добавлю об этом в статью. Но возможно кто-то, более опытный, возьмется написать про это. Я бы и сам с удовльствием почитал.
    • 0
  • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      Насколько мне известно, то вынесение части логики из Update в LateUpdate не ускорит отрисовку кадра. Если смотреть описание в Script Reference, то там рекомендовано использовать эту функцию для перемещения камер, следящих за объектами, которые могли быть перемещены в пределах функции Update. Что в принципе логично, так как до выполнения функции Update мы не можем узнать новую позицию объекта.
      • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          Думаю тут зависит от условия, при котором необходимо создавать объект. Функции, подобные Update, выполняются слишком часто, и совершенно не подходят для такой задачи, потому что большую часть времени код будет выполняться впустую (даже если сделать проверку на какое-либо условие). Если нужно создать объект единожды, при инициализации, то возможно подойдут функции Awake или Start.
        • 0
          Немного странный вопрос, я так до конца и не понял в чем дело :)
          • НЛО прилетело и опубликовало эту надпись здесь
            • +1
              Использование Update() вполне себе оптимально.
              Приведите более конкретный пример — тогда можно будет что-нибудь советовать!
  • 0
    Открыл для себя OnMouseUpAsButton() :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.