Как перезапустить сцену в unity через код

от admin

Scene Reloading

By default, Scene A Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary Reloading is enabled. This means that when you enter Play Mode, Unity destroys all existing Scene GameObjects The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it. More info
See in Glossary and reloads the Scene from disk. The time it takes for Unity to do this increases with the complexity of the Scene, which means that as your project gets more complex, you have to wait longer between the moment you press the Play button and the moment the Scene fully loads in the Editor.

When you disable Scene Reloading, the process takes less time. This allows you to more rapidly iterate on the development of your project. Instead of reloading the Scene from disk, Unity only resets the Scene’s modified contents. This avoids the time and performance impact of unloading and reloading the Scene. Unity still calls the same initialization functions (such as OnEnable , OnDisable and OnDestroy ) as if it were freshly loaded.

Effects of skipping Scene Reload

To disable Scene Reloading:

  1. Go to Edit > Project Settings > Editor
  2. Make sure Enter Play Mode Options is enabled.
  3. Disable Reload Scene

When you disable Scene Reloading, the time it takes to start your application in the Editor is no longer representative of the startup time in the built version. Therefore, if you want to debug or profile exactly what happens during your project’s startup, you should enable Scene Reloading to more accurately represent the true loading time and processes that happen in the built version of your application.

Disabling Scene Reload should have minimal side effects on your project. However, because Scene Reloading is tightly connected to Domain Reload, there are a couple of important differences:

ScriptableObject and MonoBehaviour fields that are not serialized into the build ( [NonSerialized] , private, or internal) keep their values. This is because Unity does not recreate existing objects and does not call constructors. Additionally, Unity converts null private and internal fields of array/List type to an empty array/List object during Domain Reload and stay non-null for runtime (non-Editor) scripts A piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. More info
See in Glossary .

Как сделать перезагрузку сцены

Всем привет. В данной статье мы научимся осуществлять перезагрузку текущей сцены. И для начала используя окно Hierarchy, добавим кнопку с надписью "Рестарт", которая как раз и будет перезагружать нашу сцену. Размер кнопки, текст, и изображение для кнопки отредактируйте сами, на Ваш вкус.

Далее создадим скрипт C#, с названием Scenes, со следующим содержимым:

Здесь мы создали метод ReastartLevel(), при вызове которого будет извлекаться индекс текущей сцены при помощью метода Scene.buildIndex. А потом, при помощи метода SceneManager.LoadScene, будет происходить загрузка той сцену, индекс которой мы только что получили.

После написания данного скрипта, сохраняем его, и проделываем следующие шаги.

  • Присваиваем данный скрипт нашему объекту(кнопки Рестарт). Для этого необходимо перетащить наш скрипт в окно Inspector для нашей кнопки.
  • Далее необходимо перетащить сам объект(кнопка Рестарт) в поле On Click (). После чего выбрать название нашего метода, который мы создавали в скрипте, а именно: Scenes — RestartLevel (). (См. рис)

На этом всё! Последний штрих, который остался сделать, это добавить нашу сцену(если не добавлено) в настройках юнити. Для этого в верхнем меню Unity жмём File — Build Settings. . И далее перетаскиваем нашу сцену в настройки сцен, как указано на скриншоте.

Поздравляем, перезагрузка сцены готова на все 100%. Если у Вас возникли какие-либо трудности, пишите в комментариях. А на этом всё. Всем спасибо.

Загрузка сцен в Unity

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

В этой статье вы узнаете, как перезапустить игру из состояния Game Over!

Как загрузить сцены в Unity

  1. Убедитесь, что сцена, которую вы хотите загрузить, добавлена ​​в ваши Настройки сборки. В противном случае сцена не будет распознана при попытке доступа к ней с помощью кода, что приведет к ошибке.

2. Добавьте в скрипт библиотеку Unity Scene Management. Вы можете поместить это во вновь созданный сценарий GameManager, чтобы отслеживать состояние игры.

Следующие шаги будут выполняться в том же скрипте, в котором было размещено управление сценами

3. Создайте переменную типа bool для отслеживания состояния окончания игры.

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

4. В void Update установите ввод пользователя для ключа, который перезапустит игру. Это может быть любая клавиша, в моем случае я использую «R» для перезапуска.

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

Сцена идентифицируется по ее имени или по соответствующему номеру сцены. В приведенном выше примере сцена идентифицируется по ее номеру, что быстрее, чем использование строки / имени сцены.

Вы можете просмотреть оба в настройках сборки. Вы также можете просмотреть и изменить имя сцены из папки проекта.

5. Создайте метод void для изменения значения переменной bool из шага 3.

Примечание. Для изменения переменных типа bool рекомендуется использовать методы, а не делать это напрямую.

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

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

  1. Используя Связь сценария, войдите в сценарий GameManager из сценария UI Manager или из вашего текущего сценария.
Читать:
Kotlin как вынести функции в отдельный файл

2. Вызовите метод GameOver для сценария UI Manager или текущего сценария. Я создал метод, содержащий все, что происходит в моем коде во время экрана завершения игры, чтобы избежать беспорядка.

Примечание. Убедитесь, что метод, который вы пытаетесь вызвать, является общедоступным, иначе вы получите ошибку уровня защиты.

3. Метод GameOver Sequence вызывается, когда жизни игрока равны 0, поскольку именно он запускает состояние окончания игры.

Теперь у вас должен быть полнофункциональный вариант перезапуска!

В следующей статье мы рассмотрим, как добавить взрывы к разрушенному игровому объекту!

Как сделать рестарт уровня — Unity легко

Прекрасный канал, спасибо за труды! Все максимально доступно и понятно объясняете.

Обычно при рестарте сцены требуется инициализации некоторых значений переменных или механик. Если был бы еще для этого универсальный метод )
Но всё равно спасибо! )

Вариант только для очень простеньких игр. Как только появляются неуничтожимые объекты или меняются статичные переменные все накрывается медным тазом. Чтобы сделать рестарт уровня, нужно сбросить все переменные отвечающие за сам игровой процесс

Уроки может быть сложные для новичка, но очень полезные.
Спасибо за уроки!!

Не очень, главное хотя бы понимать что к чему, тогда и не сложно будет

В одну строчку.
Красиво, чисто по правилам.

Самый лучший канал про уроки на юнити, спасибо за помощ!

Спасибо за ваши труды. Очень помогают!

Очень подробно и доходчиво.

Знал, что это легко, т.к иначе в Юнити была бы большая недоработка, но не знал, как это сделать,
Спасибо!

Огромное спасибо! Очень помогло!

Полезно, помогаешь! Спасибо тебе!

О БОГИИИИ ВОТ ЭТОТ КАНАЛ КОТОРЫЙ Я ТАК ДОЛГО ИСКАЛ

Спасибо большое автору .

Привет, ты мне помогаешь делать игры, спасибо!

Ты мне очень помог с игрой, спасибо тебе.

С юбилеем! 100 роликов по юнити!
Продолжай в том же духе

@Viktor Levsky я просто дурачёк, и у меня была крайне бредовая система спавна снарядов. Я уже нашёл решение данной проблемы.
И да. Спасибо за красочный ответ.

@Graphical Design Здравствуй. У меня есть вопрос. Я сделал так, чтобы при нажатии на кнопку воспроизводилась анимация. Во время этой анимации включается переменная типа bool на объекте, который спавнит пули. Я указал так, что если эта переменная true, то происходит спавн, и она становится false. Но почему-то происходит спавн на протяжении всей анимации и только после её окончания переменная становится false. Помогите пожалуйста.

@Graphical Design , Скажи пожалуйста, как сделать рестарт сцены через некоторое время? допустим, 1 секунду? Именно с помощью этого метода, поскольку с помощью Invoke(«ReloadLevel», 1); у меня, когда я уничтожаю персонажа, не перезагружает почему-то.

yield return new WaitForSeconds(сколько тебе надо секунд+f)
Писать в той же функции где и перезагрузка сцены но отдельно от перезагрузки.
Если все ещё не разобрался ахах. Кстати так с любым действием можно

Заметил баг, что при рестарте, если кнопка находится в меню паузы, то у тебя сохраняется значение времени на 0f, т.е. нужно нажимать на паузу, и обратно выходить из нее. Есть решение?

ОГРОМНОЕ ВАМ СПАСИБО. ВЫ СПАСЛИ МОЮ ИГРУ.

Большое спасибо. Все работает)

Топ! Спс за гайд

Как всегда на высоте���� лайк

Спасибо огромное всё работает!

А что делать если у меня перезагрженная сцена не работает? (Загружаются все модельки, но ничего не двигается, а должно)

Все круто быстро, четко по делу спс, но вот если я должен собрать допустим 10 предметов и все игра окончена и должен появиться рестарт как тут быть, как реализовать?

Подскажите пожалуйста,Как сделать так, чтобы при столкновении с определённым объектом игра перезагружалась?

думаю добавить скрипт что написали в кнопку тип
void OnCollisionEnter(Collision other)<
SceneManeger.LoadScene(«ScanaName»);
>

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

Что делать если визуал студио не принимает переменные Scene и SceneManagement .

Было бы круто, если была бы ссылка на скрипты

@Graphical Design Здравствуйте! а как сделать при уничтожении объекта перезагрузку уровня?а то при обычной загрузки если персонажа убили все его пули не возвращаются на заданное число а начинают суммировать?Объекты возвращаются норм а количество растет почему-то

@Graphical Design ну и ладно, ты и без этого крут

Не у меня на канале

Кто может сказать почему у меня нет надписи RestartLevel (делал всё как в видео)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement
public class Restart : MonoBehaviour
<
public void RestartLevel()
<
SceneManeger.LoadScene(0);
>
>

Четвертая строка, в конце отсутствует ;
Также в самом void у тебя ошибка в тексте, Maneger вместо manager. Проверь правильность написания
Надеюсь помог)

Здраствейте, нужна помощь можете пожалуйста сделать урок или написать код поворота персонажа за чем-то и в том числе за курсором очень нужно, если кто знает скажите пж

после всего этого выбери ось X and Y
public enum RotationAxes
<
MouseXandY = 0,
MouseX = 1,
MouseY = 2
>
public RotationAxes axes = RotationAxes.MouseXandY;
public float sensitivityHor = 9.0f;
public float SensitivityVert = 9.0f;

public float minimumVert = -45.0f;
public float maximumVert = 45.0f;
private float _rotationX = 0;
void Start()
<
Rigidbody body = GetComponent();
if (body != null)
body.freezeRotation = true;
>
void Update()
<
if (axes == RotationAxes.MouseX )
<
transform.Rotate(0, Input.GetAxis(«Mouse X») * sensitivityHor,0 );
>
else if(axes == RotationAxes.MouseY)
<
_rotationX -= Input.GetAxis(«Mouse Y») * sensitivityHor;
_rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);
float rotationY = transform.localEulerAngles.y;
transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);

>
else
<
_rotationX -= Input.GetAxis(«Mouse Y») * sensitivityHor;
_rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);
float delta = Input.GetAxis(«Mouse X») * sensitivityHor;
float rotationY = transform.localEulerAngles.y + delta;
transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
>
>

Пожалуйста дайте ответ,у меня есть анимация смерти ,когда ступаю на какой то обьект он умирает и ничего не происходит дальше и есть отдельно окно с Game Over,не могу найти видео как это синхронизировать что бы ПОСЛЕ анимации смерти вылетало окно с Game Over?

просто сделай проверку,если кол-во хп персонажа меньше 0 то появляется это окошко,что тут сложного?

Похожие статьи