Menu
CoddyTech

Перезапустить уровень

Часть раздела Создание настоящих игр путешествия по 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 нового экземпляра не задаст ему значение.

challenge icon

Задание

Легко

Два уровня, 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: засчитать падение и перезапустить уровень, на котором находится игрок
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр