Практически каждый скрипт в 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
↓
Start
↓
Update
↓
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 и остальные методы, вы сможете гораздо увереннее работать с любыми игровыми системами.