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

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

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

2 ответов


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

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

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

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

можно ли накладывать сцены?

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

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

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

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

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

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

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

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

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

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


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

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

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

можно ли наложить сцены?

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

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

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

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

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