Жизненный цикл MonoBehaviour (Сердцебиение Unity)


Unity не просто выполняет ваш код сверху вниз. Движок работает циклами (кадрами) и сам решает, в какой именно момент вызвать ваши методы. Понимание этого порядка — это разница между плавной игрой и багами, где камера трясется, а объекты проваливаются сквозь пол.
Жизненный цикл любого скрипта можно разделить на 3 фазы: Рождение, Жизнь и Смерть.


Фаза 1: Рождение (Инициализация)

Происходит до отрисовки самого первого кадра.
  1. Awake() — Самый первый. Вызывается один раз при создании объекта в памяти. Работает, даже если галочка на скрипте снята.
    • Куда писать: Настройку внутренних переменных, кэширование компонентов (_rb = GetComponent<Rigidbody>()).
  2. OnEnable() — Вызывается каждый раз, когда объект или скрипт включают (ставят галочку).
    • Куда писать: Подписку на глобальные события (EventBus).
  3. Start() — Вызывается один раз перед первым кадром, но строго после всех Awake.
    • Куда писать: Связи с другими скриптами. (Гарантия, что Awake у соседних объектов уже отработал и они готовы к работе).

Фаза 2: Жизнь (Игровой цикл)

Повторяется каждый кадр, пока объект активен.
  1. FixedUpdate() — Тикает по реальному времени (по умолчанию 50 раз в секунду / каждые 0.02с). Не зависит от FPS.
    • Куда писать: ВСЮ физику (AddForce, изменение velocity). Если писать физику в Update, на мощных ПК объекты будут вести себя непредсказуемо.
  2. Update() — Тикает каждый кадр. Сильно зависит от FPS (на слабом ПК вызывается реже, на мощном — чаще).
    • Куда писать: Считывание ввода (Input), таймеры, анимации, логику без физики.
    • ⚠️ Золотое правило: Любое перемещение в Update нужно умножать на Time.deltaTime, чтобы скорость не зависела от FPS!
  3. LateUpdate() — Тикает каждый кадр, но строго после того, как отработали все Update на сцене.
    • Куда писать: Камеру, которая следит за игроком. Игрок сдвинулся в Update -> Камера плавно подстроилась в LateUpdate (иначе будет тряска и джиттер).

Фаза 3: Смерть (Завершение)

Происходит при удалении или скрытии объекта.
  1. OnDisable() — Вызывается, когда объект выключают или скрывают.
    • Куда писать: Отписку от событий, остановку корутин.
  2. OnDestroy() — Вызывается при полном уничтожении объекта (Destroy()).
    • Куда писать: Очистку памяти, сохранение данных, удаление из синглтонов.


Мини шпаргалка: "Куда что писать?" (Best Practices)

Задача
Метод
Почему?
Получить ссылки (GetComponent)
Awake()
Чтобы к Start все ссылки уже были готовы.
Нажать кнопку / Ввод (Input)
Update()
Ввод нужно считывать каждый кадр, иначе игра пропустит нажатие.
Толкнуть ящик / Физика
FixedUpdate()
Физический движок (PhysX) тикает по своему таймеру, ему нужна стабильность.
Двигать камеру за героем
LateUpdate()
Чтобы камера "догоняла" героя после того, как он сделал шаг в Update.
Подписаться на событие
OnEnable()
Чтобы не получать события, пока объект "спит" или уничтожен.
(Примечание: Корутины (IEnumerator) живут параллельно этому циклу. С помощью yield return new WaitForEndOfFrame() или WaitForFixedUpdate() вы можете "вклиниться" в любую точку этого расписания).

Комментарии

Популярные сообщения из этого блога

Unity3D C#

MQL4 событие OnChartEvent()

Ответы по промбезопасности. А.1. ПБП 115.15 Подготовка и аттестация руководителей и специалистов организаций по основам промышленной безопасности