← Назад к вопросам

Что такое OnEnable и OnDisable? Когда они вызываются?

1.0 Junior🔥 132 комментариев
#Паттерны проектирования

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

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

OnEnable и OnDisable в Unity

OnEnable и OnDisable — это встроенные методы жизненного цикла MonoBehaviour в Unity, которые вызываются при активации и деактивации игрового объекта или компонента соответственно. Эти методы являются ключевыми для управления состоянием и ресурсами во время выполнения.

Когда вызываются эти методы?

  • OnEnable():
    *   При **первом создании** компонента (если объект активен).
    *   При **повторной активации** игрового объекта через `SetActive(true)`.
    *   При **повторной активации самого компонента** (если он был отключён).
    *   **После** метода `Awake()`, но **до** первого `Start()` и `Update()` для данного цикла активации.

  • OnDisable():
    *   При **деактивации** игрового объекта через `SetActive(false)`.
    *   При **отключении самого компонента**.
    *   При **уничтожении** объекта (`Destroy()`), но **до** фактического удаления.
    *   **Перед** тем, как объект станет неактивным, и все его обновления (`Update`, `FixedUpdate`) прекратятся.

Основные отличия от Awake и Start

Важно понимать их отличие от других методов инициализации:

  • Awake(): Вызывается один раз за время жизни скрипта, при загрузке объекта, независимо от его активности. Идеально для настройки внутренних ссылок.
  • Start(): Вызывается один раз перед первым Update(), но только если скрипт активен.
  • OnEnable(): Может вызываться многократно при каждой повторной активации объекта/компонента. Это его главная особенность.

Практическое применение и пример

Эти методы часто используются для подписки и отписки от событий, управления аудио, визуальными эффектами или пулом объектов, где важно корректно освобождать ресурсы.

using UnityEngine;
using System;

public class EventSubscriber : MonoBehaviour
{
    // Допустим, есть некий класс-менеджер, рассылающий события
    public static event Action OnGameplayEvent;

    private void OnEnable()
    {
        // Подписываемся на событие при активации
        if (OnGameplayEvent != null)
        {
            OnGameplayEvent += HandleGameplayEvent;
        }
        Debug.Log("Компонент активирован, подписка оформлена.");
    }

    private void OnDisable()
    {
        // ОБЯЗАТЕЛЬНО отписываемся при деактивации!
        if (OnGameplayEvent != null)
        {
            OnGameplayEvent -= HandleGameplayEvent;
        }
        Debug.Log("Компонент деактивирован, подписка отменена.");
    }

    private void HandleGameplayEvent()
    {
        Debug.Log("Событие получено!");
    }

    private void OnDestroy()
    {
        // Дополнительная страховка на случай уничтожения
        // Хотя OnDisable вызовется перед OnDestroy, это хорошая практика
        OnGameplayEvent -= HandleGameplayEvent;
    }
}

Ключевые сценарии использования

  • Управление подписками на события: Самый частый и критически важный случай. Неотписка при деактивации ведёт к утечкам памяти (memory leak) и ошибкам, когда методы пытаются вызваться на неактивных объектах.
  • Контроль производительности: В OnDisable() можно останавливать дорогостоящие вычисления или корутины, а в OnEnable() — запускать их снова.
  • Визуальная обратная связь: Включение/выключение частиц, звукового сопровождения или UI-элементов при активации объекта.
  • Работа с пулами объектов: При возврате объекта в пул (OnDisable) нужно сбросить его состояние, а при взятии из пула (OnEnable) — инициализировать заново.
  • Сохранение данных: В OnDisable удобно сохранять временные данные игрового объекта перед его деактивацией.

Важные нюансы

  1. Порядок вызова не гарантирован между разными компонентами. Нельзя рассчитывать, что OnEnable скрипта A вызовется раньше, чем у скрипта B.
  2. Инициализация данных: OnEnable — не место для первичной инициализации, которая должна выполниться единожды. Для этого используются Awake() или Start().
  3. Деактивация в редакторе: При остановке игры в редакторе Unity также вызывает OnDisable для всех активных объектов, что удобно для сброса статического состояния.

Таким образом, OnEnable и OnDisable — это фундаментальные инструменты для реагирования на изменение активного состояния объекта, обеспечивающие правильное управление жизненным циклом, ресурсами и взаимодействием между системами в Unity. Их правильное использование — признак качественного, устойчивого к ошибкам кода.

Что такое OnEnable и OnDisable? Когда они вызываются? | PrepBro