Ответ 1
Когда должны использоваться сцены? Например, в платформере каждый уровень должен быть другой сценой? Будет ли главное меню сценой?
Об этом нет общих правил. Теоретически у вас может быть только одна сцена для всей игры. Как вы организуете свои сцены полностью зависит от вас и часто зависит от типа игры, которую вы создаете.
Я думаю, что для использования сцен есть, по крайней мере, три функции:
- они являются логическим контейнером для всех предварительно созданных объектов, которые могут быть полезны для разделения вашей игры на несколько уровней/разделов.
- Вы можете сериализовать перекрестные ссылки между
GameObjects
иComponents
внутри сцены (если GO A нуждается в ссылке GO B, и они принадлежат к одной и той же сцене, ссылка может быть сериализована и вам больше не нужно искать ссылочный объект во время выполнения) - Когда вы загружаете (а не аддитивным способом) другую сцену, уже загруженные в память ресурсы автоматически
Можно ли оверлейные сцены?
Да, вы можете использовать LoadAdditive. К сожалению, как только 2 сцены загружаются в память, нет автоматического способа выделения объектов, принадлежащих тому или другому. Поэтому, если вы загружаете аддитивную среду второго уровня, вам нужно следить за предыдущей средой и явно ее уничтожать, если вам нужно.
Как работают активы между сценами? Подкрепляются ли они каждым индивидуальную сцену и нужно перезагружать каждый раз. Можно ли указать когда актив больше не нужен?
По умолчанию каждый GameObject
сцены будет уничтожен после загрузки новой сцены (если вы не используете загрузку аддитивной сцены). Способ сделать GameObject
выжить в разных сценах - отметить его с помощью DontDestroyOnLoad.
Если вам нужно поделиться определенной "конфигурацией" GameObject, вы можете сохранить его как сборник и ссылаться на него по сценариям (но помните, что однажды в сцене это экземпляр prefab, поэтому GO разделяет с помощью prefab начальные сериализованные и не переопределяющие свойства, но 2 экземпляра одного и того же prefab - это разные объекты).
Как отправить данные между сценами/интерфейсом между сценами?
Несколько способов, в зависимости от того, какие постоянные данные вы хотите разделить.
- Для конкретного экземпляра
GameObject
пусть объект выживет, используяDontDestroyOnLoad
. - Если у вас есть некоторые данные конфигурации, которые не нужно прикреплять к определенному
GameObject
, вы можете рассмотреть возможность хранения ScriptableObject внутри AssetDatabase и ссылаться на него. - Если у вас есть данные, которые должны сохраняться в разных игровых сеансах, вы можете рассмотреть их сохранение в PlayerPrefs.
Есть два других способа, которые мне не нравятся, но просто для их цитирования:
- Использование статического поля иногда может помочь вам в этом, но у меня есть несколько проблем с моей точки зрения.
- Сохранить и загрузить с диска (может быть полезно в нескольких ситуациях, но часто это зависит от платформы, и вы можете иметь некоторые проблемы, особенно на разных мобильных платформах).
Это широкая тема кстати, я надеюсь, что этот ответ может быть довольно приличным обзором.