Menu
CoddyTech

Следующий уровень

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

У каждой сцены в списке сцен сборки есть номер — её индекс сборки: 0 для первой, 1 для следующей и так далее. LoadScene принимает этот номер, а также имя, а SceneManager.sceneCountInBuildSettings показывает, сколько сцен содержится в списке. Если уровни расположены в списке по порядку, следующий уровень имеет индекс активной сцены плюс 1. Этот выход загружает его, а после последнего уровня игра останавливается:

void OnTriggerEnter(Collider other)
{
    if (!other.CompareTag("Player")) return;
    int next = SceneManager.GetActiveScene().buildIndex + 1;
    if (next < SceneManager.sceneCountInBuildSettings)
    {
        SceneManager.LoadScene(next);
    }
    else
    {
        Debug.Log("You finished the game!");
    }
}

При четырёх сценах индексы идут от 0 до 3, а sceneCountInBuildSettings равно 4, поэтому на последнем уровне next равно 4 — на единицу больше последнего индекса. Вот почему проверка имеет вид next < sceneCountInBuildSettings: LoadScene(4) ничего не загрузит и выведет ошибку Unity Cannot load scene: Invalid scene name (empty string) and invalid build index 4.

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

challenge icon

Задание

Легко

Сделай так, чтобы каждая цель открывала следующий уровень.

  1. В Start() выведи в levelText значение "Level " + level + " of " + levels: level — это buildIndex активной сцены, а levels — это SceneManager.sceneCountInBuildSettings - 1.
  2. В OnTriggerEnter при столкновении с игроком загрузи buildIndex + 1 или 0 (меню), если это значение не меньше sceneCountInBuildSettings.

Нажми «Играть» и пройди все три уровня: снова появится меню. Затем нажми «Проверить».

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

using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;

public class Goal : MonoBehaviour
{
    public TMP_Text levelText;

    void Start()
    {
        // показать "Level 2 of 3": номер текущего уровня и общее количество уровней
    }

    void OnTriggerEnter(Collider other)
    {
        // игрок достиг цели: загрузить следующий уровень, а после последнего — меню
    }
}

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

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