#c# #unity3d #scene-manager
#c# #unity3d #диспетчер сцен
Вопрос:
По сути, после тестирования нескольких прототипов уровней я решил придерживаться своей текущей идеи игры, поэтому я начал создавать GameManager для управления потоком уровней и т.д. У меня нет никаких дополнительных библиотек или пакетов ресурсов, используемых не по умолчанию, но по какой-то причине индекс сборки всех моих сцен равен -1, что, как я узнал из API, означает, что они должны загружаться через AssetBundle. Теперь я ничего не могу загрузить с помощью SceneManager, и я не уверен, как двигаться дальше. У меня временно была папка 2d-extras-master в проекте, поскольку я предполагал, что буду ее использовать, но удалил ее, поняв, что она мне не понадобится. Кто-нибудь знает, как сбросить индексы сборки моих сцен до значений в настройках сборки? Любая помощь приветствуется!
Редактировать: я должен также упомянуть, что последняя сцена, которую я добавил (когда у меня все еще был 2d-extras-manager), по-прежнему сохраняла обычный индекс сборки, равный 0
Правка # 2: Итак, я обнаружил, что могу получить доступ к индексам сборки других сцен между собой. Не работает только тогда, когда я пытаюсь получить доступ к индексам сборки из моей сцены MainMenu
Правка # 3: Я нашел исправление, но оно не обязательно отвечает на вопрос. Я обнаружил, что могу заставить функцию LoadScene работать, если я знаю, что такое buildIndex, но если я буду искать его по имени сцены, оно вернет -1.
пример.
// where 1 is the buildIndex of Scene "Main" in BuildSettings
// works
SceneManager.LoadScene(1);
// doesn't work
int index = SceneManager.GetSceneByName("Main").buildIndex; //returns -1
SceneManager.LoadScene(index);
// also doesn't work (Where current scene is buildIndex 0)
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex 1);
Ответ №1:
SceneManager.GetSceneByBuildIndex
или SceneManager.GetSceneByName
и функции одинаково работают только с загруженными сценами. Если сцена не загружена, она вернет значение -1. Причина в том, что вы можете загружать сцены аддитивно, так что возможно иметь даже 5 загруженных сцен.
Это правда, что api не хватает во многих отношениях.
В вашем случае вы пытаетесь использовать его сразу после SceneManager.LoadScene(1);
, int index = SceneManager.GetSceneByName("Main").buildIndex;
возвращает -1
, скорее всего, потому, что сцена будет загружена в следующем кадре «официально».
Вы могли бы попробовать подождать 1 кадр в сопрограмме, а затем сделать это. Но обычно у вас будет индекс сцены или название сцены, чтобы загрузить / сохранить его и не заботиться о логике после загрузки сцены. Вы можете создать менеджер, который будет хранить все загруженные сцены, где вы могли бы посмотреть их индексы сборки, если они вам понадобятся, чтобы решить, какую сцену загружать следующей.
В качестве альтернативы вы можете использовать пакет Addressables, который обрабатывает много, в него сложно попасть, но загрузка сцены там, на мой взгляд, работает намного лучше.
Ответ №2:
В меню сборки, доступном при нажатии на Файл в редакторе Unity, вы можете упорядочить свои сцены и добавить их в поток, как на этом изображении
Я не уверен в этом, но я предполагаю, что когда вы не назначили сцену потоку, он получит sceneIndex = -1. Итак, загрузите сцену, перейдите в BuildSettings, добавьте ее в поток сборки, проделайте то же самое со всеми ними. Я думаю, что таким образом вы можете решить это.
Комментарии:
1. Все сцены правильно добавлены в настройках сборки, но странная вещь в том, что если я попытаюсь принудительно загрузить, используя индекс, который я знаю (например, если Scene1 имеет индекс 2, используя LoadScene (2) loads), но если я попытаюсь получить значение индекса, используя GetSceneByName(«Scene1»).buildIndex, он возвращает -1
2. Что ж, это действительно странно. Покажите ключевые части вашего кода, которые его содержат, может быть, я смогу помочь.
3. буквально единственный код, который у меня есть, — это «SceneManager. LoadScene(1); » для функции onclick кнопки воспроизведения в моем меню (где сцена 1 соответствует уровню 1 в моих настройках сборки)
Ответ №3:
Вы можете использовать этот метод для получения buildIndex
.
И после проверки правильности buildIndex
, если buildIndex
значение не равно -1
, то сцена существует в настройках сборки.
public static bool SceneExists(string scenePath)
{
return SceneUtility.GetBuildIndexByScenePath(scenePath) != -1;
}