Unity: Добавление уровней в игру — пошаговое руководство

Этот урок описывает добавление нескольких последовательно запускаемых уровней в игру Unity. Начнём с создания пустого объекта, который назовём Levels.

Создание уровней

Внутри объекта Levels создадим пустые объекты для каждого уровня (Level1, Level2 и т.д.). Для каждого уровня разместим объекты, представляющие машинки и препятствия (например, City и Cyber). Размещение объектов будет отличаться для каждого уровня. Для удобства можно временно скрывать объекты уровней, работая над каждым по отдельности. На начальном этапе все созданные уровни следует скрыть.

Скрипт SelectLevel

Создадим C# скрипт SelectLevel. Он содержит массив Levels типа GameObject для хранения объектов уровней и получает номер текущего уровня из ключа GameLevel в PlayerPrefs. Индексация массива начинается с нуля, поэтому от значения GameLevel отнимаем единицу. Скрипт активирует уровень с полученным индексом.

using UnityEngine;

public class SelectLevel : MonoBehaviour
{
    public GameObject[] Levels;

    void Start()
    {
        if (!PlayerPrefs.HasKey("GameLevel"))
        {
            PlayerPrefs.SetInt("GameLevel", 1);
        }

        int levelIndex = PlayerPrefs.GetInt("GameLevel") - 1;
        if (levelIndex >= 0 && levelIndex < Levels.Length) {
            Levels[levelIndex].SetActive(true);
        } else {
            Debug.LogError("Уровень вне диапазона!");
        }
    }
}

Добавлена проверка на наличие ключа GameLevel в PlayerPrefs. При отсутствии ключа (первый запуск) создаётся ключ со значением 1 (первый уровень). Добавлена проверка выхода за пределы массива Levels.

Скрипт StartGame

В скрипте StartGame добавим код для перехода на следующий уровень после выигрыша:

using UnityEngine;

public class StartGame : MonoBehaviour
{
    // ... (другой код) ...

    void WinGame()
    {
        PlayerPrefs.SetInt("GameLevel", PlayerPrefs.GetInt("GameLevel") + 1);
    }

    // ... (другой код) ...
}

Этот код увеличивает значение GameLevel на 1 после выигрыша, переходя на следующий уровень при следующем запуске игры.

Отображение номера уровня

Для отображения номера уровня продублируем объект CountMoney, переименуем его в Level и изменим текст. Добавим скрипт SetCurrentLevel для динамического обновления номера уровня:

using UnityEngine;
using TMPro;

public class SetCurrentLevel : MonoBehaviour
{
    public TextMeshProUGUI text;

    void Start()
    {
        text.text = "#" + PlayerPrefs.GetInt("GameLevel").ToString();
    }
}

Динамическое изменение количества ходов

Для изменения количества ходов в зависимости от уровня создадим структуру LevelData:

[System.Serializable]
public struct LevelData
{
    public GameObject levelObject;
    public int movesCount;
}

Используем массив LevelData вместо массива GameObject в скрипте SelectLevel:

using UnityEngine;

public class SelectLevel : MonoBehaviour
{
    public LevelData[] Levels;

    void Start()
    {
        if (!PlayerPrefs.HasKey("GameLevel"))
        {
            PlayerPrefs.SetInt("GameLevel", 1);
        }

        int levelIndex = PlayerPrefs.GetInt("GameLevel") - 1;
        if (levelIndex >= 0 && levelIndex < Levels.Length) {
            Levels[levelIndex].levelObject.SetActive(true);
            // Доступ к количеству ходов: Levels[levelIndex].movesCount
        } else {
            Debug.LogError("Уровень вне диапазона!");
        }
    }
}

Теперь в инспекторе Unity можно задать для каждого уровня объект уровня и количество доступных ходов. В скрипте необходимо обращаться к полю movesCount структуры Levels[levelIndex] для получения количества ходов для текущего уровня.

Добавление нового уровня

Создадим новый уровень, добавим новую модель машинки, настроив её компоненты (Rigidbody, CarController). Добавим необходимые теги и удалим лишние MeshCollider’ы, которые могут вызывать ошибки.

В результате создана игра с несколькими уровнями, динамически меняющимся количеством ходов и отображением текущего уровня. Этот подход позволяет создавать игры с большим количеством контента и повышает их replayability.

Что будем искать? Например,программа