Подтвердить что ты не робот

Понимание сцен в Unity3d

У меня есть некоторая путаница со сценами в Unity3d, и я не смог найти никаких ресурсов о них.

  • Когда нужно использовать сцены? Например, в платформере каждый уровень должен быть другой сценой? Будет ли главное меню сценой?
  • Можно ли оверлейные сцены?
  • Как работают активы между сценами? Они привязаны к каждой отдельной сцене и должны каждый раз перезагружаться. Можно ли указать, когда актив больше не нужен?
  • Как отправлять данные между сценами/интерфейсом между сценами? Я понимаю, что это широкая тема, но я не хотел спамить несколько вопросов.
4b9b3361

Ответ 1

Когда должны использоваться сцены? Например, в платформере каждый уровень должен быть другой сценой? Будет ли главное меню сценой?

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

Я думаю, что для использования сцен есть, по крайней мере, три функции:

  • они являются логическим контейнером для всех предварительно созданных объектов, которые могут быть полезны для разделения вашей игры на несколько уровней/разделов.
  • Вы можете сериализовать перекрестные ссылки между GameObjects и Components внутри сцены (если GO A нуждается в ссылке GO B, и они принадлежат к одной и той же сцене, ссылка может быть сериализована и вам больше не нужно искать ссылочный объект во время выполнения)
  • Когда вы загружаете (а не аддитивным способом) другую сцену, уже загруженные в память ресурсы автоматически

Можно ли оверлейные сцены?

Да, вы можете использовать LoadAdditive. К сожалению, как только 2 сцены загружаются в память, нет автоматического способа выделения объектов, принадлежащих тому или другому. Поэтому, если вы загружаете аддитивную среду второго уровня, вам нужно следить за предыдущей средой и явно ее уничтожать, если вам нужно.

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

По умолчанию каждый GameObject сцены будет уничтожен после загрузки новой сцены (если вы не используете загрузку аддитивной сцены). Способ сделать GameObject выжить в разных сценах - отметить его с помощью DontDestroyOnLoad.

Если вам нужно поделиться определенной "конфигурацией" GameObject, вы можете сохранить его как сборник и ссылаться на него по сценариям (но помните, что однажды в сцене это экземпляр prefab, поэтому GO разделяет с помощью prefab начальные сериализованные и не переопределяющие свойства, но 2 экземпляра одного и того же prefab - это разные объекты).

Как отправить данные между сценами/интерфейсом между сценами?

Несколько способов, в зависимости от того, какие постоянные данные вы хотите разделить.

  • Для конкретного экземпляра GameObject пусть объект выживет, используя DontDestroyOnLoad.
  • Если у вас есть некоторые данные конфигурации, которые не нужно прикреплять к определенному GameObject, вы можете рассмотреть возможность хранения ScriptableObject внутри AssetDatabase и ссылаться на него.
  • Если у вас есть данные, которые должны сохраняться в разных игровых сеансах, вы можете рассмотреть их сохранение в PlayerPrefs.

Есть два других способа, которые мне не нравятся, но просто для их цитирования:

  • Использование статического поля иногда может помочь вам в этом, но у меня есть несколько проблем с моей точки зрения.
  • Сохранить и загрузить с диска (может быть полезно в нескольких ситуациях, но часто это зависит от платформы, и вы можете иметь некоторые проблемы, особенно на разных мобильных платформах).

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

Ответ 2

Когда должны использоваться сцены? Например, в платформере каждый уровень должен быть другой сценой? Будет ли главное меню сценой?

Нет правила относительно того, сколько сцен вам нужно иметь в своей игре. Тем не менее, сцены позволяют логически отделять части вашей игры от остальной части. Вы должны иметь минимум одну сцену.

В главном меню, если вы ссылаетесь на холст с элементами пользовательского интерфейса, он будет В Сцене, а не самой сцене. Холст - это еще один GameObject, который мы обычно используем для показа игровых меню. Я в основном создаю Canvas GameObject, поместил script по имени "UIManager" и положил DontDestroyOnLoad на него, поэтому у меня есть доступ к нему во всех сценах. Сделайте Singleton, и я гарантирую, что он не дублируется.

Можно ли оверлейные сцены?

Да, нет ограничений относительно того, сколько сцен вы можете загружать одновременно. Какую цель вы планируете накладывать на сцены? Возможно, есть лучший способ, чем добавление аддитивно.

Как работают активы между сценами? Они привязаны к каждой отдельной сцене и должны каждый раз перезагружаться. Можно ли указать, когда актив больше не нужен?

Активы - это то, что вы видите в своей иерархии проекта. Я думаю, что вы имели в виду "GameObject" в сцене, и если да, подумайте о своих игровых объектах как объектах с компонентами (Система объектов-объектов), Все объекты в сцене уничтожаются, когда его родительская сцена уничтожается, пока явно не указано, используя DontDestroyOnLoad в некотором компоненте (однопользовательское поведение в случай единства). Уничтоженные будут получать мусор.

Так как они загружаются (или перезагружаются), зависит от вашей реализации, от того, повторяете ли вы/уничтожаете их время снова или если вы помещаете свои инстанцированные сборные файлы в кешированный объект и извлечение позже из него.

Как отправить данные между сценами/интерфейсом между сценами?

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