Жизненный цикл MonoBehaviour (Сердцебиение Unity)
Начало - Понимание Unity и C#
Unity не просто выполняет ваш код сверху вниз. Движок работает циклами (кадрами) и сам решает, в какой именно момент вызвать ваши методы.
Понимание этого порядка — это разница между плавной игрой и багами, где камера трясется, а объекты проваливаются сквозь пол.
Жизненный цикл любого скрипта можно разделить на 3 фазы: Рождение, Жизнь и Смерть.
Фаза 1: Рождение (Инициализация)
Происходит до отрисовки самого первого кадра.
Awake()— Самый первый. Вызывается один раз при создании объекта в памяти. Работает, даже если галочка на скрипте снята.- Куда писать: Настройку внутренних переменных, кэширование компонентов (
_rb = GetComponent<Rigidbody>()).
- Куда писать: Настройку внутренних переменных, кэширование компонентов (
OnEnable()— Вызывается каждый раз, когда объект или скрипт включают (ставят галочку).- Куда писать: Подписку на глобальные события (EventBus).
Start()— Вызывается один раз перед первым кадром, но строго после всехAwake.- Куда писать: Связи с другими скриптами. (Гарантия, что
Awakeу соседних объектов уже отработал и они готовы к работе).
Фаза 2: Жизнь (Игровой цикл)
Повторяется каждый кадр, пока объект активен.
FixedUpdate()— Тикает по реальному времени (по умолчанию 50 раз в секунду / каждые 0.02с). Не зависит от FPS.- Куда писать: ВСЮ физику (
AddForce, изменениеvelocity). Если писать физику вUpdate, на мощных ПК объекты будут вести себя непредсказуемо.
- Куда писать: ВСЮ физику (
Update()— Тикает каждый кадр. Сильно зависит от FPS (на слабом ПК вызывается реже, на мощном — чаще).- Куда писать: Считывание ввода (
Input), таймеры, анимации, логику без физики. - ⚠️ Золотое правило: Любое перемещение в
Updateнужно умножать наTime.deltaTime, чтобы скорость не зависела от FPS!
- Куда писать: Считывание ввода (
LateUpdate()— Тикает каждый кадр, но строго после того, как отработали всеUpdateна сцене.- Куда писать: Камеру, которая следит за игроком. Игрок сдвинулся в
Update-> Камера плавно подстроилась вLateUpdate(иначе будет тряска и джиттер).
Фаза 3: Смерть (Завершение)
Происходит при удалении или скрытии объекта.
OnDisable()— Вызывается, когда объект выключают или скрывают.- Куда писать: Отписку от событий, остановку корутин.
OnDestroy()— Вызывается при полном уничтожении объекта (Destroy()).- Куда писать: Очистку памяти, сохранение данных, удаление из синглтонов.
Мини шпаргалка: "Куда что писать?" (Best Practices)
(Примечание: Корутины (
IEnumerator) живут параллельно этому циклу. С помощью yield return new WaitForEndOfFrame() или WaitForFixedUpdate() вы можете "вклиниться" в любую точку этого расписания).
Комментарии
Отправить комментарий