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

Что такое DontDestroyOnLoad() и когда его использовать?

1.0 Junior🔥 141 комментариев
#Unity Core

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

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

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

DontDestroyOnLoad() — концепция и применение

DontDestroyOnLoad() — это статический метод класса UnityEngine.Object (чаще вызываемый через GameObject), который предотвращает уничтожение указанного объекта при загрузке новой сцены в Unity. По умолчанию при переходе между сценами (например, через SceneManager.LoadScene()) все объекты текущей сцены уничтожаются. Этот метод позволяет сохранить объект «живым» между сценами, делая его постоянным на протяжении всей сессии игры.

Как использовать

Метод вызывается для игрового объекта, обычно в скрипте при старте (например, в Awake() или Start()). Важно проверять дублирование, так как объект может сохраняться при повторных загрузках сцен.

using UnityEngine;

public class PersistentManager : MonoBehaviour
{
    private static PersistentManager _instance;

    void Awake()
    {
        // Предотвращаем дублирование объекта
        if (_instance != null)
        {
            Destroy(gameObject);
            return;
        }

        _instance = this;
        DontDestroyOnLoad(gameObject);
    }

    // Далее полезные методы для управления данными между сценами
}

Типичные случаи использования

  • Управление глобальными системами: Объекты, отвечающие за управление аудио (AudioManager), настройки игры, систему сохранений (SaveSystem) или менеджер игровых сессий.
  • Перенос данных между сценами: Объекты, содержащие информацию о прогрессе игрока, инвентарь, статистику или состояние игры (например, между уровнем и меню).
  • Сетевые менеджеры: В multiplayer-играх объекты, управляющие сетевым подключением, должны сохраняться между сценами лобби и самой игры.
  • Системы аналитики или рекламы: Менеджеры, которые должны работать непрерывно на протяжении всей сессии.

Важные предостережения

  • Риск дублирования объектов: Если сцена, содержащая объект с DontDestroyOnLoad(), будет загружена повторно, объект может продублироваться. Необходимо реализовывать шаблон Singleton или проверять существование.
  • Иерархия в редакторе: Такие объекты перемещаются в специальную скрытую сцену DontDestroyOnLoad. В редакторе их можно увидеть в иерархии, если включить опцию "DontDestroyOnLoad" в выпадающем меню Hierarchy.
  • Порядок очистки: Объекты, помеченные DontDestroyOnLoad(), уничтожаются только при завершении приложения или явном вызове Destroy().
  • Связи между объектами: Если родительский объект помечен как DontDestroyOnLoad(), его дочерние объекты также сохраняются. Однако если сохраняется только дочерний объект, а родительский нет — это может вызвать ошибки.

Альтернативы

Для простой передачи данных между сценами иногда используют статические классы или ScriptableObject, но они не подходят для объектов, которым требуется физическое присутствие в мире (например, аудиоисточники) или компоненты MonoBehaviour.

Итог: DontDestroyOnLoad() — мощный инструмент для создания постоянных систем в Unity, но требующий аккуратного обращения для предотвращения багов и дублирования. Его стоит применять для объектов, которые являются центральными для игровой логики и должны существовать вне зависимости от текущей сцены.