Найти в Дзене

Создаём несколько уровней в игре и переходы между ними.

Оглавление

Всем Хай! Или лучше Ё – Хо – Хо! 😁 Так вроде вражеский Санта Клаус говорит? 😅

Кто следит за моим каналом, должен был прочитать мой коротенький пост, где я говорю о своей беде. Для новеньких дублирую. У меня что - то с микрофоном, поэтому с видеоформата временно перехожу на статейный формат. А значит, следующие этапы разработки игры будут в текстовом варианте. Я, конечно, запишу небольшое видео, с результатами работы, но оно будет без пояснений. Пояснения будут в статье.

И так. Если вкратце, сегодня будет описано создание переходов между уровнями, а значит в основном работа с UI. Также немного скомпонуем игровые объекты в группы и создадим префабы этих групп. Как делать префабы я говорил в этом видео. Ну и так, по мелочи. В общем, сложностей возникнуть не должно.

Разделяем по группам игровые объекты.

В любой игре есть два типа объектов.

  • То, что меняется от уровня к уровню.
  • То, что не меняется от уровня к уровню.

Так вот эти две группы мы разместим по отдельным, пустым игровым объектам.

Скрин с Unity
Скрин с Unity

То, что не будет меняться, мы назовём «Common». В него войдут такие объекты, как:

  • EventSystem – отвечает за все события, которые происходят в игре. Создаётся автоматически при создании первого «Canvas» в сцене.
  • Directional Light – источник света.
  • Wall – у меня стена в конце уровня стоит из коробок. Не обязательный объект. Просто хочу.
  • Road – дорога по которой бежит персонаж.
  • GameManager – отвечает за основные скрипты в игре. Такие как запуск игры, переход между уровнями, работа с «Canvas» и т.д.
  • CoinManager – отвечает за сбор и сохранение монет в игре.
  • Canvas (In Game) – отвечает за отображение надписей на экране после запуска игру. У нас это количество собранных монет и сегодня добавим номер уровня игры.
  • Canvas (Start Menu) – отвечает за отображение надписей и кнопочек на экране до начала игры.
  • Canvas (Finish) – новый объект, который сегодня появится. Отвечает за сообщение, которое появится после прохождения уровня.
  • Canvas (Die) - новый объект, который сегодня появится. Отвечает за сообщение, если персонаж проиграет.
Скрин с Unity
Скрин с Unity

То, что будет меняться в каждом уровне, мы назовём «Level». В него войдут такие объекты, как:

  • Gate – префаб наших ворот.
  • Coin – префаб наших монет.
Скрин с Unity
Скрин с Unity

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

User – это собственно наш персонаж. В него мы засунули камеру «CameraUser», которая следует за ним. Она ведь относится к персонажу. Потом сделаем, что бы она откреплялась от него при старте игры.

Скрин с Unity
Скрин с Unity

Finish – это совокупность барьеров, монет и тригеров, объединенных в один игровой объект.

Скрин с Unity
Скрин с Unity

На этом компоновка закончена.

Почему нельзя чтобы камера при старте игры была в персонаже? В этом случае она будет поворачиваться туда, куда поворачивает наш персонаж. А это не приемлемо. Нам нужно чтобы она просто следовала за персонажем. Для этого мы написали скрипт «CameraCentr». Как раз в нём нам сейчас нужно прописать новое условие. Чтобы при старте игры камера выходил из нашего персонажа.

Скрин скрипта CameraCentr
Скрин скрипта CameraCentr

Добавляем указания уровня, на котором находится игрок.

Для этого нам нужно зайти в «Canvas (In Game)» и создать в нём новый текст.

Скрин с Unity
Скрин с Unity

Назавём его «Text (Level)» и переместим его в верхнюю позицию на нашем экране.

Скрин с Unity
Скрин с Unity

Теперь осталось прописать в скрипте, чтобы там отображался нужный нам уровень. Для этого мы заходим в скрипт «GameManager». Потом указываем с каким полем будем работать и пишем несколько строчек кода.

Скрин скрипта GameManager
Скрин скрипта GameManager

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

Скрин с Unity
Скрин с Unity

Ну а создать новые сцены очень просто. Думаю, вы догадались. Просто копируем сцены сочетанием клавиш «Ctrl + D».

И не забываем в инспекторе «GameManager» добавить ссылку на «Text (Level)». Чтобы было с чем работать.

Скрин с Unity
Скрин с Unity

Добавление сцен в конечную сборку.

Теперь давайте разберём один момент. Если мы сейчас начнём собирать игру(делать её билд), то у нас в игре будет только та сцена с которой мы работаем в данный момент. Чтобы в нашей игре были все уровни(сцены), которые мы создали их нужно указать в нашей сборке в настройках.

Скрин с Unity
Скрин с Unity

Для этого мы просто перетаскиваем нужные нам сцены в настройки нашей сборки(Build Settings).

Создаём окна при проигрыше и выигрыше персонажа.

Логика простая. Если игрок добежал до финиша, то появляется окно с кнопкой перехода на следующий уровень. А если по пути сгинул, то окно с предложением повторить уровень.

Для начала создадим два «Canvas». Первый будет отвечать за Победу «Canvas (Finish)» , а второй за проигрыш «Canvas (Die)»

Скрин с Unity
Скрин с Unity

Теперь опять лезем в скрип «GameManager» и там прописываем логику работу каждого окна.

Скрин скрипта GameManager
Скрин скрипта GameManager

Прописываем два поля, чтобы добавить туда наши окна в инспекторе

[SerializeField] GameObject _finishWindow;
[SerializeField] GameObject _dieWindow;

Теперь мы можем с ними работать и пишем два метода. Первый активирует окно при победе, а второй при проигрыше. По умолчанию галки с них сняты.

public void ShowFinishWindow()
{
_finishWindow.SetActive(true);
}
public void ShowDieWindow()
{
_dieWindow.SetActive(true);
}

И пишем метод для кнопки «Next Level», которая будет перекидывать нас на следующий уровень.

public void NextLevel()
{
int next = SceneManager.GetActiveScene().buildIndex + 1;
if (next < SceneManager.sceneCountInBuildSettings)
{
SceneManager.LoadScene(next);
}
}

В «int next» мы записываем номер индекса активной сцены + 1. Тем самым записываем туда индекс следующей сцены, а значит и уровня. А при помощи «if» делаем проверку, есть ли вообще сцена с таким индексом. Если есть, то загружаем её.

Теперь пишем метод повтора уровня по кнопке «Reolad Level» при проигрыше.

public void ReloadLevel()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}

Здесь всё просто. При нажатии кнопки мы загружаем активную сцену заново.

Осталось закинуть методы по своим местам.

Для финиша мы закидываем активацию окна в скрипт «Finish Trigger»

Скрин скрипта Finish Trigger
Скрин скрипта Finish Trigger

А для проигрыша закидываем активацию своего окна в скрипт «PlayerDefomation» в метод «Die».

Скрин скрипта PlayerDefomation
Скрин скрипта PlayerDefomation

Теперь просто указываем в инспекторе наши «Canvas».

Скрин с Unity
Скрин с Unity

И на каждую кнопку закидываем свой метод из «GameManager».

Скрин с Unity
Скрин с Unity

Для кнопки Next свой для кнопки Reload Свой.

Создаём префабы и уничтожаем ворота.

Сделать префаб и уничтожить ворота не сложно. Просто перетаскиваем нужные нам объекты в папку.

Скрин с Unity
Скрин с Unity

А для уничтожения ворот просто записываем нужную строчку в скрипт «GateObject»

Скрин скрипта GateObject
Скрин скрипта GateObject

Всё сохраняем и проверяем нашу работу. 😉

Смотреть Видео.

Вот почему я не хотел писать статью, а выбираю видеоформат. Потому что получилось 5500 знаков без пробелов. С пробелами на 1000 больше. Вряд ли кто-то будет столько читать. 🙂 Но я сказал что сделаю, значит сделаю.😎

Ну а тем, кто осилил моя Огромная Благодарность!

Подписывайтесь на канал и увидимся с Вами в следующем году.
С Наступающим Новым 2023 годом! Поздравляю Вас друзья! Мы дожили! )