Menu
CoddyTech

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

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 18 из 60.

Самый быстрый способ перезапустить уровень — загрузить его снова. SceneManager.GetActiveScene() возвращает сцену, которая сейчас открыта, а её name (или buildIndex) — это то, что принимает LoadScene. Эта кнопка перезапуска на панели окончания игры вызывает:

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

Задание

Легко

Падение должно перезапускать уровень, на котором находится игрок, и увеличивать счётчик падений.

  1. Добавь using UnityEngine.SceneManagement; и измени счётчик на private static int falls;, чтобы его значение сохранялось после перезагрузки.
  2. В Update(), когда player.position.y < fallY, выполни falls++; и загрузи SceneManager.GetActiveScene().name.

Нажми «Играть» и сойди с края в обоих уровнях: Falls: 1, затем Falls: 2. Затем нажми «Проверить».

Попробуйте сами

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: засчитать падение и перезапустить текущий уровень
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity