Перезапустить уровень
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 18 из 56.
Самый быстрый способ сбросить уровень — загрузить его снова. SceneManager.GetActiveScene() возвращает сцену, которая открыта сейчас, а её name (или её buildIndex) — это то, что принимает LoadScene. Эта кнопка Restart на панели окончания игры вызывает:
public void Restart()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}Unity уничтожает открытую сцену и заново создаёт её из файла сцены. Каждый объект возвращается туда, где его разместила сцена, в том числе ящик, который опрокинул игрок; каждое поле снова получает значение из Inspector, а Awake и Start запускаются заново. Не нужно писать код, чтобы возвращать объекты на место по одному. Поскольку кнопка запрашивает активную сцену, а не имя вроде "Level3", один и тот же скрипт перезапускает любой уровень, на котором он размещён.
Поле static не является частью сцены: оно принадлежит классу, поэтому при перезагрузке сохраняет своё значение. private static float bestTime; хранит лучшее время между перезапусками, а обычное private float time; после загрузки новой сцены снова начинает с 0. GameManager.Instance тоже является статическим: после перезагрузки оно указывает на уничтоженный GameManager, пока Awake нового экземпляра не задаст ему значение.
Задание
ЛегкоДва уровня, Level1 и Level2, в каждом есть объект Level со скриптом LevelRestart. Стрелки перемещают игрока, а золотой блок на Level1 загружает Level2 (оба уровня готовы). Заверши LevelRestart.cs:
- Когда игрок падает ниже
fallY(-3), прибавь 1 кfallsи перезапусти уровень, на котором находится игрок: падение на Level2 перезапускает Level2. fallsподсчитывает каждое падение в игре, поэтому значение должно сохраняться после перезагрузки. При запуске оно уже отображается какFalls: 1.
Нажми Play, сойди с края на обоих уровнях, затем нажми Check.
Попробуйте сами
using UnityEngine;
using TMPro;
public class LevelRestart : MonoBehaviour
{
public Transform player;
public TMP_Text fallsText;
public float fallY = -3f;
private int falls;
void Start()
{
fallsText.text = "Falls: " + falls;
}
void Update()
{
// ниже fallY: засчитать падение и перезапустить уровень, на котором находится игрок
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке