Переход между сценами
Приветствую! В данной статье мы разберём несколько способов перехода между сценами, а именно:
- Смена сцен по названию.
- Смена сцен по индексам.
- Смена сцен, используя параметры.
Смена сцен по названию
Данный способ самый простой, и встречается он очень часто. Он используется тогда, когда нам необходимо перейти точно на определённую сцену. Для этого создадим C# скрипт, с названием, например, Scenes. И пропишем в нём следующий код:
using UnityEngine; using UnityEngine.SceneManagement; public class Scenes : MonoBehaviour < public void OpenMenu() < SceneManager.LoadScene("Menu"); >public void OpenGame() < SceneManager.LoadScene("Game"); >>
Разбор кода
Обратите внимание, что при работе со сценами, нам необходимо обязательно подключить библиотеку:
using UnityEngine.SceneManagement;
Дальше мы создаём функцию OpenMenu(), которая будет загружать сцену с названием Menu. Вторая функция с названием OpenGame() загружаем сцену с названием Game. Убедитесь, что сцены с такими названиями существуют в Вашем проекте.
Как видите, всё очень просто. Условия, при которых Вы будете запускать данные функции, могут быть совсем разные. Например: клик на клавишу «Esc», здоровье персонажа меньше нуля, и тд. Пример:
if(HealthUser
Смена сцен по индексам
Данный способ аналогичен предыдущему, за исключением того, что мы вместо названий сцен, используем их индексы. Данный способ полезен в тех случаях, когда нам необходимо перейти на следующую или предыдущую сцену. Создадим C# скрипт, с названием, например, Scenes. И пропишем в нём следующий код:
using UnityEngine; using UnityEngine.SceneManagement; public class Scenes : MonoBehaviour < public void OpenMenu() < SceneManager.LoadScene(0); >public void OpenGame() < SceneManager.LoadScene(1); >>
Как видите, код аналогичен предыдущему, поэтому разбирать мы его не будем. Единственное что хотелось бы отметить, что благодаря функциям, у нас открываются чуть больше возможностей перехода на сцены. Например, мы можем перейти на следующую или предыдущую функцию:
using UnityEngine; using UnityEngine.SceneManagement; public class Scenes : MonoBehaviour < public void NextLevel() < var index = SceneManager.GetActiveScene().buildIndex; SceneManager.LoadScene(index + 1); >public void PreviousLevel() < var index = SceneManager.GetActiveScene().buildIndex; SceneManager.LoadScene(index - 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. Этот метод защитит нас от дублирования однотипных функций, которые по идее выполняют одно и тоже.
Давайте теперь попробуем выполнить функцию GoToLevel(), передав ей аргумент «1» следующим образом:
GoToLevel(1)
Конечно же, в качестве аргумента мы можем передать не только индекс, но и название. Поэтому используя открытие сцены через аргумент функции, Вы можете работать как с индексами, так и с названиями сцен.
Если Вам понравилась сцена, буду рад Вашим лайкам.
Как реализовать переход на другую сцену?
Я делаю кликер. Мне нужно сделать переход на другую сцену когда игрок сделает 1000 кликов. Не знаю как реализовать.
- Вопрос задан более трёх лет назад
- 767 просмотров
Комментировать
Решения вопроса 1

Unity3D Developer
подключаешь библиотеку using
using UnityEngine.SceneManagement; //в метод Update или CliksCar добавляешь if(clik >= 1000) < SceneManager.LoadScene("sceneName"); //собсна в скобках имя сцены >
Ответ написан более трёх лет назад
Как перейти на другую сцену в unity

Это блог про аниме?
Intermedius — находящийся посередине. Думаю, что все, кто смотрел хотя бы одну серию аниме, замечали небольшую вставку в середине, которая обычно служит для перехода между сценами и рекламного блока (англ. — bumper, яп. — アイキャッチ aikyatchi). Картинка из заголовка статьи является таким переходом в одной из серий тайтла “New Game!!», про небольшую игровую студию. Ах да, раз это блог про Unity, то в данном посте мы рассмотрим оформление перехода между сценами именно в нём. =)
Сцены в Unity являются основной единицей деления игры на части и сам по себе переход между ними не является чем-то сложным. Переход реализуется через класс SceneManager, при помощи методов LoadScene() или LoadSceneAsync(), но без дополнительного оформления эти переходы будут резкими и это будет выглядеть странно. Попробуем сгладить этот переход, добавив проекту немного визуальной привлекательности.
Схема довольно проста: обе сцены, между которыми осуществляется переход, должны быть визуально идентичны на момент выгрузки предыдущей и загрузки следующей. Манипуляции для такого перехода обычно организуются через анимацию элементов сцены. Для примера в этом посте мы используем чёрный экран(элементом, отвечающим за данный эффект, будет картинка чёрного цвета). Выгружаемая сцена должна постепенно уйти в чёрный цвет, а следующая за ней плавно из него появиться.
Слово анимация как бы намекает нам на использование механизма в Unity под названием «Mecanim». Если вы не очень с ним знакомы, то можно прочитать(а ещё лучше использовать его в качестве упражнения) предыдущий пост «Шаблон Состояние», в котором, в целях тренировки, этот механизм использовался для создания машины состояний без анимации.
Задача
Оформить переход между тремя сценами через затемнение. Первая сцена появляется моментально и через 2 секунды переходит во вторую. Переходы между второй и третьей зациклены и осуществляется плавно по клику.
Подготовка
- Создадим три сцены:
- BootScene — самая первая сцена, на которую попадает игра, покажем её сразу без затемнения
- FirstScene и SecondScene — две сцены, переходы между которыми буду зациклены между друг другом
- Добавим сцены в Build Settings
- Создадим ещё один объект Canvas с именем SceneTransition . Выставим ему Render Mode — Screen Space — Camera и добавим Main Camera . Выставим Order in Layer равным 999 , чтобы он всегда был поверх всего остального
- Добавим к SceneTransition объект типа Image и назовём его Fade . Полностью чёрный, перекрывающий всю площадь экрана. Можно его отключить, чтобы он не загораживал экран
Анимация
- Создадим папку Animations
- Откроем панель Animation . Выделив элемент Fade нажмём кнопку Create и создадим анимацию FadeIn , также создадим анимацию FadeOut
- Настроим анимацию FadeIn . Выделяем ассет FadeIn . Убираем галочку Loop Time . Выделяем элемент Fade . В закладке Animation нажатием кнопки Enable/Disable keyframe recording mode включаем запись действий. Включаем компонент Image . Переходим в закладке Animation на отметку в 1 секунду. Выставляем в настройке цвета alpha = 0 . Выключаем компонент Image . В закладке Animation выключаем запись действий. Проверяем анимацию плавного появления UI из затемнения
- Настраиваем анимацию FadeOut , но в обратном порядке: включаем Image , альфа-канал от 0 до 100 . Этот пункт остаётся в качестве тренировки
- Настраиваем переход между анимациями. Во вкладке Animator добавляем триггер FadeOut . Добавляем переход между FadeIn и FadeOut . На переходе выключаем Has Exit Time , Transition duration выставляем в 0. В Conditions добавляем созданный триггер FadeOut
- Создадим скрипт TransitionHandler для переключения сцены после завершения анимации FadeOut
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
using UnityEngine; using UnityEngine.SceneManagement; public class TransitionHandler : MonoBehaviour // Имя загружаемой сцены [SerializeField] private string nextScene = ""; // Флаг выключения анимации появления сцены [SerializeField] private bool disableFadeInAnimation = false; private void Start() if (disableFadeInAnimation) // При отсутствии анимации появления проигрываем FadeIn в конец при инициализации Animator animator = gameObject.GetComponentAnimator>(); animator.Play("FadeIn", 0 , 1); > > // Функция, вызываемая в конце анимации FadeOut void FadeOutFinished() // Загрузка следующей сцены SceneManager.LoadScene(nextScene); > >
- Добавим созданный скрипт к объекту Fade . В конец анимации FadeOut добавим Event . Выберем функцию FadeOutFinished() из скрипта TransitionHandler

Объект эвента на вкладке Animation выглядит так
Настройка переходов
- Для BootScene создадим скрипт, который будет запускать переход на FirstScene через 2 секунды
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
using System.Collections; using UnityEngine; public class BootHandler : MonoBehaviour // Аниматор для Fade элемента [SerializeField] private Animator fadeAnimator = null; void Start() // Запускаем корутину в качестве таймера StartCoroutine(Timer()); > IEnumerator Timer() // Задержка в 2 секунды yield return new WaitForSeconds(2); // Выставляем триггер для начала анимации перехода fadeAnimator.SetTrigger("FadeOut"); > >
- Настроим BootScene . Добавим префаб SceneTransition . Настроим камеру. Укажем следующую сцену — FirstScene . Отключим анимацию появления сцены
- Добавим на сцену пустой объект назовём его BootHandler и добавим соответствующий скрипт. Настроим для нового объекта animator
- После запуска BootScene должна иметь затемнение перед переключением
- Создадим скрипт ClickHandler для остальных сцен, который будет запускать переход по клику
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
using UnityEngine; public class ClickHandler : MonoBehaviour // Аниматор для Fade элемента [SerializeField] private Animator animator = null; void Update() //Перехватываем клик левой кнопки мыши if (Input.GetMouseButtonDown (0)) // Выставляем триггер для начала анимации перехода animator.SetTrigger("FadeOut"); > > >
- Настроим FirstScene . Добавим префаб SceneTransition . Настроим камеру. Укажем следующую сцену — SecondScene
- Добавим на сцену пустой объект назовём его ClickHandler и добавим соответствующий скрипт. Настроим для нового объекта animator
- Настроим SecondScene . Проделываем те же самые шаги, что и для FirstScene , только указываем следующей сцену — FirstScene
- Наслаждаемся результатом
Заключение
После всех наших манипуляций мы получили префаб, который можно использовать для настройки переходов между сценами. Навряд ли вы будете его использовать для продакшена, так как используемая синхронная загрузка сцен не очень красивое решение, а также необходима тонкая настройка условий перехода, необходимо продумать остановку игры, в момент начала анимации. Да и сами анимации желательно сделать более интересными, например, в Homescapes(Playrix) переход между загрузкой ресурсов и запуском меню скрыт за опускающейся вдоль стены дома камерой. Однако, после повторения данных шагов собственными руками, у вас должно сложиться представление, как сделать переходы красиво. Пока! =)
Как сделать переход между сценами unity3d?
Как сделать что бы при столкновении с определенным обьектом уровень перезагружался в интернете прочитал что Application.loadlevel(Application.loadedLevel), но unity и редактор пишет Заменить на SceneManager. вопрос такой как заменить вторую часть (Application.loadedLevel) с использованием SceneManager? Пытался найти с помощью гугла выдает устаревшие сайты с использованием Application. (может я просто искал плохо)
- Вопрос задан более трёх лет назад
- 15904 просмотра
Комментировать
Решения вопроса 1
Middle PHP Developer
using UnityEngine.SceneManagement; SceneManager.LoadScene("scene_name")
using UnityEngine.SceneManagement; SceneManager.LoadScene(scene_id)
Ответ написан более трёх лет назад
Нравится 8 1 комментарий
Тут вопрос как перейти на СЛЕДУЮЩУЮ сцену, а не писать отдельный скрипт, отличающийся только идентификатором, под 100500 сцен)
Ответы на вопрос 2
durnevdanya @durnevdanya
Создать скрипт а в нем :
void .
Ответ написан более трёх лет назад
Павел Русаков @fortegon Автор вопроса
`UnityEngine.Application.LoadLevel(string)’ is obsolete: `Use SceneManager.LoadScene’
Самый простой способ, написать универсальный скрипт и переключать уровни по индексу
using UnityEngine.SceneManagement;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex +1); // Получаем индекс сцены и загружаем сцену с индексом на один больше
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C#
- +1 ещё
Как в юнити проверить существование сцены по названию?
- 1 подписчик
- 3 часа назад
- 16 просмотров