Этот урок описывает добавление нескольких последовательно запускаемых уровней в игру 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.