Как сделать переход между сценами в unity

Обновлено: 04.07.2024

Я сделал довольно простую 2D-игру, чтобы изучить ее. У меня их 2 Scenes , и переключение между ними отлично работало. Я использовал пустой gameObjects как точку начала / выхода Scene , чтобы игра знала, что нужно поставить игрока в точку X после выхода через точку X (например, выход за пределы дома, если я выхожу за дверь).

Затем я добавил " Scene0 ", чтобы использовать его для постоянных общих скриптов, таких как GameManager, Sounds, Music и т. Д. Только с одним объектом с именем "Controller", который я DontDestroyOnLoad (). После добавления этой сцены и переключения Scenes сразу на мою MainScene игра внезапно начинает вести себя очень странно;

в первый раз, когда я перехожу из MainScene ( Scene1 ) в свою вторичную Scene ( Scene2 ), он работает нормально, но затем, когда я ухожу, Scene2 чтобы вернуться Scene1 , игрок появляется в глуши. И это происходит ТОЛЬКО если я запускаю игру из своего Persistent Scene .

Я понятия не имею, что не так, я не добавляю ничего, что мешает моим переходам между сценами, все, что я добавил до сих пор, это playerHealth для тестирования.

Скрипты, прикрепленные к моему (постоянному) контроллеру:

Скрипты, прикрепленные к моей StartPoint:

И, наконец, ExitPoint:

РЕДАКТИРОВАТЬ: после перемещения всего моего объекта DDOL gameObject в Pre-Scene это сработало. Итак, я могу предположить, что ошибка находится внутри Start() функций Player или Cameras, поскольку, когда они запускаются в Scene1, они вызываются каждый раз, когда я вхожу в Scene (только DDOL). Я попытался настроить их Start() функции следующим образом:

Точно такие же изменения были внесены в Player. Очевидно, это не работает, потому что он создает новую камеру / проигрыватель каждый раз, когда я вхожу в Scene1 (кстати, почему он не пытается создать их, когда я вхожу в Scene2? Это потому, что они запускаются в Scene1?). ОДНАКО, новый плеер / камера запускается в правильном положении, и если я уменьшу масштаб, я смогу увидеть старый плеер / камеру в том же неправильном положении, что и раньше. Так что что-то странное происходит, когда их, Start() кажется, вызывают во второй раз.

Это не должно иметь значения, но, возможно, лучше настроить thePlayer.startPoint = exitPoint; перед выполнением SceneManager.LoadScene(levelToLoad); , просто чтобы быть абсолютно уверенным.

@Fattie, игрок помечен как DDOL, если бы вы об этом упомянули. просто запутался почему работает без предзагрузки сцены

Используйте отладчик. Установите точки останова в соответствующих местах, например, PlayerStartPoint.Start() и, LoadNewArea.OnTriggerEnter2D() и проверьте, что они выполняются.

  • В нужное время
  • Нужное количество раз
  • С ожидаемыми значениями

Это должно дать вам понять, где ситуация выходит из-под контроля.

Если я отлаживаю, он ведет себя именно так, как я хочу. Он находит правильную начальную точку с учетом точки выхода. Но я думаю, что что-то я где-то ломаю. Мне просто нужно его найти. В общем, если я начну со своей основной сцены, это сработает, если я начну со сцены0, это не сработает. Вы случайно не знаете какого-либо поведения, которое срабатывает только тогда, когда мы вступаем в сцену?

Думаю, я уже еду ^^. Если я перемещаю свои объекты DDOL (плеер и камеру) в пре-сцену, то все работает как надо. Так что там есть что-то, что работает, только если они существуют в сцене, с которой я начинаю. Не уверен, что еще :)

Не уверен, что это актуально, но Start() -функции в Camera и Player запускаются только при входе в Scene1 (mainScene), а не при входе в Scene2 (house).

Start () никогда не будет выполняться дважды для одного и того же объекта. Как я прокомментировал ответ Файффа, Start () выполняется только непосредственно перед первым вызовом Update () для объекта. Если вы делаете там что-то важное, что вам нужно выполнить после переходов между сценами, воспользуйтесь предложением Фиффа OnLevelWasLoaded ()

Вы сейчас упомянули, что у вас был примерно такой код:

Проблемы, которые вы упомянули в вопросе (сцены предварительной загрузки и т. Д.), Совершенно не связаны с проблемой здесь.

Шаблон состоит в том, что в каждом из a, b, c просто есть строка кода, например, p = FindObjectOfType

(); которая запускается при загрузке сцены, и положение C по вашему желанию.

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

Я понимаю, что вы хотите знать, почему наблюдаете за тем, что делаете.

Если вы поиграете со всеми этими проблемами, вы обнаружите объяснение поведения, которое вы наблюдаете!

Но это не так уж много; в Unity в примере "C .. ab c" вы должны заранее создать C отдельно.

Приветствую! В данной статье мы разберём несколько способов перехода между сценами, а именно:

  1. Смена сцен по названию.
  2. Смена сцен по индексам.
  3. Смена сцен, используя параметры.

Смена сцен по названию

using UnityEngine; using UnityEngine.SceneManagement; public class Scenes : MonoBehaviour < public void OpenMenu() < SceneManager.LoadScene("Menu"); >public void OpenGame() < SceneManager.LoadScene("Game"); >>

Разбор кода

Обратите внимание, что при работе со сценами, нам необходимо обязательно подключить библиотеку:

Дальше мы создаём функцию OpenMenu(), которая будет загружать сцену с названием Menu. Вторая функция с названием OpenGame() загружаем сцену с названием Game. Убедитесь, что сцены с такими названиями существуют в Вашем проекте.

Смена сцен по индексам

using UnityEngine; using UnityEngine.SceneManagement; public class Scenes : MonoBehaviour < public void OpenMenu() < SceneManager.LoadScene(0); >public void OpenGame() < SceneManager.LoadScene(1); >>

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

Разбор кода

Строчки в функции NextLevel():

var index = SceneManager.GetActiveScene().buildIndex; SceneManager.LoadScene(index + 1);

В первой строчке мы в переменную index мы заносим тот индекс сцены, в котором мы находимся в данный момент. А уже во второй строчке, мы увеличиваем индекс нашей сцены на единицу, и запускаем таким образом следующую сцену.

В функции PreviousLevel() всё аналогично, только индекс мы не увеличиваем на единицу, а уменьшаем. Тем самым запускаем предыдущую сцену.

Обратите внимание! Перед тем как работать со сценами по их индексам, нам необходимо добавить все сцены в Build Settings. Для этого жмём на вкладку File - Build Settings. Далее перетаскиваем все свои сцены в область Scenes in Build, и расставляем их по порядку. После чего просто закрываем данное окно. Теперь можно спокойно работать с индексами.


Смена сцен, используя параметры

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

using UnityEngine; using UnityEngine.SceneManagement; public class Scenes : MonoBehaviour < public void GoToLevel(int number) < SceneManager.LoadScene(number); >>

Разбор кода

Функция GoToLevel() принимает в качестве аргумента номер индекса, который нам необходимо открыть, и заносит его в переменную number. Этот метод защитит нас от дублирования однотипных функций, которые по идее выполняют одно и тоже.

Конечно же, в качестве аргумента мы можем передать не только индекс, но и название. Поэтому используя открытие сцены через аргумент функции, Вы можете работать как с индексами, так и с названиями сцен.


что мне надо от этого кодика получить?
SceneManager.LoadScene ("home") я написал чтобы тпхалось на другую сцену
поместил я этот скрипт на куб и мне пишет parsing error
подробная ошибка на скриншоте ниже

хм.. помоги
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

public class House : MonoBehaviour


void OnCollisionEnter(Collision other) Application.LoadLevel("home");
вот мой код новый
а вот и новые ошибки

Кароч ставь ApplicationLoadLevel (0); А сверху ставь Public class home И в build settings Ставь на 0 твой хому

А объекты содержащие инфу нужную на всех уровнях (например счет, прогрес, инвентарь) таким же DontDestroyOnLoad(transform.gameObject) сохраняются?

Можно сохранять куда то например.

Можно обращаться из скрипта объекта сцены к какому-то файлу проекта (массиву или просто txt) и изменять его навсегда?


Разработка компьютерных игр. С чего начать? Это просто! С нуля до разработчика игр: как начать создавать свою игру. Заказать создание игры.

Читайте также: