Всем Хай! Или лучше Ё – Хо – Хо! 😁 Так вроде вражеский Санта Клаус говорит? 😅
Кто следит за моим каналом, должен был прочитать мой коротенький пост, где я говорю о своей беде. Для новеньких дублирую. У меня что - то с микрофоном, поэтому с видеоформата временно перехожу на статейный формат. А значит, следующие этапы разработки игры будут в текстовом варианте. Я, конечно, запишу небольшое видео, с результатами работы, но оно будет без пояснений. Пояснения будут в статье.
И так. Если вкратце, сегодня будет описано создание переходов между уровнями, а значит в основном работа с UI. Также немного скомпонуем игровые объекты в группы и создадим префабы этих групп. Как делать префабы я говорил в этом видео. Ну и так, по мелочи. В общем, сложностей возникнуть не должно.
Разделяем по группам игровые объекты.
В любой игре есть два типа объектов.
- То, что меняется от уровня к уровню.
- То, что не меняется от уровня к уровню.
Так вот эти две группы мы разместим по отдельным, пустым игровым объектам.
То, что не будет меняться, мы назовём «Common». В него войдут такие объекты, как:
- EventSystem – отвечает за все события, которые происходят в игре. Создаётся автоматически при создании первого «Canvas» в сцене.
- Directional Light – источник света.
- Wall – у меня стена в конце уровня стоит из коробок. Не обязательный объект. Просто хочу.
- Road – дорога по которой бежит персонаж.
- GameManager – отвечает за основные скрипты в игре. Такие как запуск игры, переход между уровнями, работа с «Canvas» и т.д.
- CoinManager – отвечает за сбор и сохранение монет в игре.
- Canvas (In Game) – отвечает за отображение надписей на экране после запуска игру. У нас это количество собранных монет и сегодня добавим номер уровня игры.
- Canvas (Start Menu) – отвечает за отображение надписей и кнопочек на экране до начала игры.
- Canvas (Finish) – новый объект, который сегодня появится. Отвечает за сообщение, которое появится после прохождения уровня.
- Canvas (Die) - новый объект, который сегодня появится. Отвечает за сообщение, если персонаж проиграет.
То, что будет меняться в каждом уровне, мы назовём «Level». В него войдут такие объекты, как:
- Gate – префаб наших ворот.
- Coin – префаб наших монет.
И у нас остаётся два игровых объекта, которые не меняются, но их лучше оставить так как есть. Не закидывая в группы.
User – это собственно наш персонаж. В него мы засунули камеру «CameraUser», которая следует за ним. Она ведь относится к персонажу. Потом сделаем, что бы она откреплялась от него при старте игры.
Finish – это совокупность барьеров, монет и тригеров, объединенных в один игровой объект.
На этом компоновка закончена.
Почему нельзя чтобы камера при старте игры была в персонаже? В этом случае она будет поворачиваться туда, куда поворачивает наш персонаж. А это не приемлемо. Нам нужно чтобы она просто следовала за персонажем. Для этого мы написали скрипт «CameraCentr». Как раз в нём нам сейчас нужно прописать новое условие. Чтобы при старте игры камера выходил из нашего персонажа.
Добавляем указания уровня, на котором находится игрок.
Для этого нам нужно зайти в «Canvas (In Game)» и создать в нём новый текст.
Назавём его «Text (Level)» и переместим его в верхнюю позицию на нашем экране.
Теперь осталось прописать в скрипте, чтобы там отображался нужный нам уровень. Для этого мы заходим в скрипт «GameManager». Потом указываем с каким полем будем работать и пишем несколько строчек кода.
Получается, что мы при старте проверяем имя какой сцены сейчас загружено и записываем это имя вверху экрана.
Ну а создать новые сцены очень просто. Думаю, вы догадались. Просто копируем сцены сочетанием клавиш «Ctrl + D».
И не забываем в инспекторе «GameManager» добавить ссылку на «Text (Level)». Чтобы было с чем работать.
Добавление сцен в конечную сборку.
Теперь давайте разберём один момент. Если мы сейчас начнём собирать игру(делать её билд), то у нас в игре будет только та сцена с которой мы работаем в данный момент. Чтобы в нашей игре были все уровни(сцены), которые мы создали их нужно указать в нашей сборке в настройках.
Для этого мы просто перетаскиваем нужные нам сцены в настройки нашей сборки(Build Settings).
Создаём окна при проигрыше и выигрыше персонажа.
Логика простая. Если игрок добежал до финиша, то появляется окно с кнопкой перехода на следующий уровень. А если по пути сгинул, то окно с предложением повторить уровень.
Для начала создадим два «Canvas». Первый будет отвечать за Победу «Canvas (Finish)» , а второй за проигрыш «Canvas (Die)»
Теперь опять лезем в скрип «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»
А для проигрыша закидываем активацию своего окна в скрипт «PlayerDefomation» в метод «Die».
Теперь просто указываем в инспекторе наши «Canvas».
И на каждую кнопку закидываем свой метод из «GameManager».
Для кнопки Next свой для кнопки Reload Свой.
Создаём префабы и уничтожаем ворота.
Сделать префаб и уничтожить ворота не сложно. Просто перетаскиваем нужные нам объекты в папку.
А для уничтожения ворот просто записываем нужную строчку в скрипт «GateObject»
Всё сохраняем и проверяем нашу работу. 😉
Вот почему я не хотел писать статью, а выбираю видеоформат. Потому что получилось 5500 знаков без пробелов. С пробелами на 1000 больше. Вряд ли кто-то будет столько читать. 🙂 Но я сказал что сделаю, значит сделаю.😎
Ну а тем, кто осилил моя Огромная Благодарность!
Подписывайтесь на канал и увидимся с Вами в следующем году.
С Наступающим Новым 2023 годом! Поздравляю Вас друзья! Мы дожили! )