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

Как загружать сцены в Unity? В чем разница между LoadSceneMode.Single и LoadSceneMode.Additive?

2.2 Middle🔥 121 комментариев
#Unity Core

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

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

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

Загрузка сцен в Unity: методы и режимы

В Unity загрузка сцен — фундаментальный механизм для управления игровым пространством, переходами между уровнями и организацией контента. Основным инструментом является класс SceneManager из пространства имен UnityEngine.SceneManagement. Для работы с ним необходимо подключить соответствующий using-директиву и использовать метод SceneManager.LoadScene().

Основные методы загрузки

Загрузка сцены чаще всего выполняется двумя способами:

  1. По имени сцены (string):
using UnityEngine.SceneManagement;

public class LevelLoader : MonoBehaviour
{
    public void LoadMainMenu()
    {
        SceneManager.LoadScene("MainMenu");
    }
}
  1. По индексу сцены в Build Settings (int):
public void LoadNextLevel()
    {
        int currentIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentIndex + 1);
    }

Ключевое предварительное условие: сцена обязательно должна быть добавлена в список Build Settings (File → Build Settings → Add Open Scenes). Unity компилирует только те сцены, которые находятся в этом списке, и присваивает им индекс.

Режимы загрузки: Single vs Additive

Метод LoadScene() принимает второй параметр — LoadSceneMode, который определяет, как сцена будет загружена относительно текущей активной сцены. Это перечисление имеет два значения:

LoadSceneMode.Single

Это стандартный и наиболее часто используемый режим. При его использовании:

  • Текущая активная сцена полностью выгружается из памяти вместе со всеми её объектами (GameObject), компонентами и ресурсами.
  • Загружается только одна новая сцена, которая становится новой активной сценой.
  • Это режим «замены» — идеальный для переходов между уровнями, меню и игрой, когда предыдущий контент не нужен.
// Переход с игрового уровня на меню, старый уровень уничтожается
SceneManager.LoadScene("GameOverMenu", LoadSceneMode.Single);

LoadSceneMode.Additive

Это режим «добавления». Его логика совершенно иная:

  • Текущая активная сцена остается в памяти и продолжает работать.
  • Новая сцена загружается «поверх» или «рядом» с текущей. Их объекты существуют одновременно в одном SceneManager.
  • Этот режим используется для динамического расширения игрового пространства: подгрузки новых локаций, уровней сложности, инстанциирования больших зон без выгрузки основного уровня.
// Загружаем дополнительную подлокацию, пока основной мир остается активным
SceneManager.LoadScene("DungeonInterior", LoadSceneMode.Additive);

Критические различия и важные нюансы

  • Управление объектами: В режиме Additive объекты из разных сцен могут взаимодействовать друг с другом, но необходимо внимательно управлять их иерархией и слоями (Layer). Каждая сцена сохраняет свою собственную иерархию объектов в окне Hierarchy.
  • Активная сцена: После загрузки Additive новой сцены активной остается предыдущая. Чтобы переключить активность, используйте SceneManager.SetActiveScene().
  • Выгрузка сцен: Для выгрузки сцен, загруженных аддитивно, используется метод SceneManager.UnloadSceneAsync(). Выгружать сцены в режиме Single не требуется — они заменяются автоматически.
  • Performance: Additive требует больше памяти (RAM), так как одновременно хранит несколько сцен. Необходимо следить за оптимизацией и своевременно выгружать ненужные аддитивные сценки.
  • Async Loading: Для больших сцен рекомендуется использовать асинхронную загрузку SceneManager.LoadSceneAsync() с обоими режимами. Это позволяет избежать фризов (заморозки кадра) во время загрузки и реализовать экраны загрузки с прогресс-баром.
// Асинхронная аддитивная загрузка с отслеживанием прогресса
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("BonusLevel", LoadSceneMode.Additive);
while (!asyncLoad.isDone)
{
    float progress = asyncLoad.progress;
    // Обновляем UI прогресс.Bar
}

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

  • Single: Загрузка меню, переход между уровнями в линейной игре, рестарт уровня.
  • Additive: Открытие новых комнат в подземелье (RPG), подгрузка соседних частей открытого мира (чунки), динамическое добавление мультиплеерных арен в лобби.

Таким образом, выбор между LoadSceneMode.Single и LoadSceneMode.Additive определяется архитектурной потребностью: нужна ли полная замена игрового контекста или дополнение текущего. Правильное использование этих режимов лежит в основе создания динамичной и эффективной структуры игры в Unity.

Как загружать сцены в Unity? В чем разница между LoadSceneMode.Single и LoadSceneMode.Additive? | PrepBro