02.06.2026

Как работает MonoBehaviour в Unity: полный разбор жизненного цикла

Полный разбор жизненного цикла MonoBehaviour в Unity: Awake, Start, Update, FixedUpdate, LateUpdate и другие методы простыми словами.

Как работает MonoBehaviour в Unity: полный разбор жизненного цикла

Практически каждый скрипт в Unity наследуется от MonoBehaviour. Но многие начинающие разработчики используют методы вроде Start() или Update(), не до конца понимая, когда именно они вызываются и чем отличаются друг от друга.

В этой статье разберём полный жизненный цикл MonoBehaviour и выясним, когда использовать Awake, Start, Update, FixedUpdate и другие важные методы.

Что такое MonoBehaviour

MonoBehaviour — это базовый класс Unity, который позволяет скрипту взаимодействовать с движком.

Благодаря ему становятся доступны:

  • Start()
  • Update()
  • FixedUpdate()
  • OnEnable()
  • OnDisable()
  • OnDestroy()

и многие другие события.

Пример простого скрипта:

using UnityEngine;

public class Player : MonoBehaviour
{
    private void Start()
    {
        Debug.Log("Игра началась");
    }
}

Жизненный цикл MonoBehaviour

Упрощённо порядок вызова выглядит так:

Awake
↓
OnEnable
↓
StartUpdate
↓
LateUpdate
↓
OnDisable
↓
OnDestroy

Если используется физика, между кадрами также вызывается FixedUpdate.

Awake()

Awake вызывается сразу после создания объекта.

Он запускается ещё до первого кадра и до вызова Start.

Пример:

private void Awake()
{
    Debug.Log("Awake");
}

Когда использовать Awake

Подходит для:

  • получения ссылок на компоненты
  • базовой инициализации
  • подготовки объекта к работе

Например:

private Rigidbody rb;

private void Awake()
{
    rb = GetComponent<Rigidbody>();
}

Главное правило:

Awake используется для подготовки самого объекта.

OnEnable()

Метод вызывается каждый раз, когда объект становится активным.

private void OnEnable()
{
    Debug.Log("Объект включён");
}

Он сработает:

  • при запуске сцены
  • после SetActive(true)
  • после включения компонента

Когда использовать

Часто применяется для подписки на события:

private void OnEnable()
{
    GameEvents.OnGameOver += HandleGameOver;
}

Start()

Start вызывается перед первым кадром.

Но только один раз.

private void Start()
{
    Debug.Log("Start");
}

Отличие от Awake:

  • Awake вызывается сразу после создания объекта
  • Start вызывается перед первым кадром

Когда использовать

Подходит для логики, которая зависит от других объектов сцены.

Например:

private void Start()
{
    enemy = FindObjectOfType<Enemy>();
}

К моменту вызова Start все объекты уже успели выполнить Awake.

Update()

Самый известный метод Unity.

Вызывается каждый кадр.

private void Update()
{
    transform.Rotate(Vector3.up * 100 * Time.deltaTime);
}

Если игра работает в 60 FPS, Update будет вызываться примерно 60 раз в секунду.

Когда использовать

Подходит для:

  • обработки ввода
  • движения
  • проверки условий
  • игровой логики

Пример:

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Jump();
    }
}

FixedUpdate()

Используется для физики.

Вызывается через фиксированные интервалы времени.

По умолчанию:

0.02 секунды

или примерно 50 раз в секунду.

Пример:

private void FixedUpdate()
{
    rb.AddForce(Vector3.forward);
}

Когда использовать

Только для работы с Rigidbody:

  • AddForce()
  • Velocity
  • физическое движение

Типичная ошибка новичков — выполнять физику в Update.

LateUpdate()

Вызывается после всех Update текущего кадра.

private void LateUpdate()
{
    Debug.Log("LateUpdate");
}

Когда использовать

Идеально подходит для камеры.

Пример:

private void LateUpdate()
{
    transform.position = player.position + offset;
}

Сначала игрок двигается в Update, затем камера догоняет его в LateUpdate.

Так движение получается плавным.

OnDisable()

Вызывается, когда объект или компонент отключается.

private void OnDisable()
{
    Debug.Log("Объект отключён");
}

Когда использовать

Чаще всего для отписки от событий:

private void OnDisable()
{
    GameEvents.OnGameOver -= HandleGameOver;
}

Это помогает избежать утечек памяти и ошибок.

OnDestroy()

Вызывается перед уничтожением объекта.

private void OnDestroy()
{
    Debug.Log("Объект уничтожен");
}

Срабатывает при:

Destroy(gameObject);

или выгрузке сцены.

Когда использовать

Подходит для:

  • очистки ресурсов
  • сохранения данных
  • отписки от глобальных событий

Частые ошибки новичков

Использовать Start вместо Awake

Если нужно получить компонент:

rb = GetComponent<Rigidbody>();

лучше делать это в Awake.

Использовать физику в Update

Плохо:

void Update()
{
    rb.AddForce(Vector3.forward);
}

Правильно:

void FixedUpdate()
{
    rb.AddForce(Vector3.forward);
}

Забывать отписываться от событий

Если подписка происходит в OnEnable, то отписка должна происходить в OnDisable.

Практический вывод

Можно запомнить простое правило:

  • Awake — подготовка объекта
  • OnEnable — подписка на события
  • Start — работа с другими объектами
  • Update — игровая логика
  • FixedUpdate — физика
  • LateUpdate — камера и постобработка
  • OnDisable — отписка от событий
  • OnDestroy — очистка ресурсов

Если придерживаться этой схемы, код будет гораздо чище и понятнее.

Заключение

Жизненный цикл MonoBehaviour — одна из фундаментальных тем в Unity.

Понимание порядка вызова методов помогает избежать множества ошибок и писать более предсказуемый код.

Освоив Awake, Start, Update и остальные методы, вы сможете гораздо увереннее работать с любыми игровыми системами.

Смотрите также