78 просмотров

Воссоздание астероидов с помощью Unity — часть 2

Добро пожаловать в последнюю часть этой серии о воссоздании классической игры Asteroids с помощью Unity 3D 2019. Как обычно, прежде чем мы начнем, просто напомним, что вы всегда можете проверить исходный код этого проекта на github.

Теперь, если вы готовы идти, давайте начнем!

Ставить цели

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

Столкновения и смерть

Если мы хотим, чтобы наши астероиды и корабли взорвались, нам сначала нужен способ отслеживать их состояние.
Для этого добавим в оба префаба новый скрипт с именем HealthController.

Сценарий предоставляет метод DealDamage, который уменьшает значение currentHealth на основе параметра урона. Он также заботится о порождении префаба взрыва и уничтожении как этого префаба, так и родительского игрового объекта через короткий промежуток времени.
Очевидно, чтобы это сработало, нам нужно обеспечить взрыв. Мы снова обратимся к Asset Store, чтобы найти его. В своем проекте я использовал бесплатный Unity Particle Pack, но если у вас есть какие-либо другие предпочтения, просто воспользуйтесь им.
Если вы решите использовать предложенный ресурс, имейте в виду, что импорта только FireExplosionEffects и общих папок должно быть достаточно для наших нужд.
Как только актив будет импортирован, просто перетащите префаб взрыва (SmallExplosionEffect) в поле взрыва как на астероиде, так и на префабе звездолета.

Статья в тему:  Игра, где вы можете бросать астероиды на планеты

Теперь нам нужно что-то для вызова метода DealDamage в нужное время.
Давайте отредактируем АстероидКонтроллер сценарий, который мы создали в первой части руководства, добавив следующие поля и метод.

Скрипт позволяет астероиду наносить урон при контакте с игроком. Если корабль останется в контакте с астероидом, он будет получать урон через равные промежутки времени. Обратите внимание на тот факт, что скрипт идентифицирует игрока на основе его тега, поэтому обязательно измените префаб корабля, добавив соответствующий тег «Игрок».
Наконец, не забудьте присвоить значение полю Damage. 20 кажется разумным количеством урона.

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

Для этого нам нужно всего лишь добавить следующее в ЛазерПоведение сценарий.

Если вы нажмете «Играть», вы сможете летать, уничтожая астероиды своим лазером, и у вас также должна быть возможность взорваться, если вы слишком сильно врезаетесь в астероиды.

Пользовательский интерфейс

Реализовав практически все основные аспекты игрового процесса, самое время сосредоточиться на пользовательском интерфейсе, которого в настоящее время очень не хватает.

В предыдущем уроке по Pong мы сохранили весь интерфейс в разных плоскостях, но в одной и той же сцене. На этот раз, однако, мы будем действовать немного по-другому.
Мы хотим иметь главное меню, из которого игрок сможет запускать и выходить из игры, но мы реализуем его в отдельной сцене.

Статья в тему:  Чем астероиды отличаются от комет? плотнее

Итак, давайте сначала переименуем текущую сцену в GameScene а затем давайте создадим новый с именем ГлавноеМенюСцена.

Во вновь созданную сцену мы должны добавить холст, содержащий плоскость с StartGameButton и EndGameButton с текстом «Новая игра» и «Выйти» соответственно. Позаботьтесь о том, чтобы прикрепить две кнопки к центру и расположить их одну над другой.

Теперь нам нужно добавить логику для нашего пользовательского интерфейса.

Создайте новый пустой игровой объект с именем ГлавноеМенюКонтроллер и добавить в него скрипт с таким же названием.

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

Не стесняйтесь устанавливать значения, которые вы считаете более подходящими для различных полей, и не забудьте добавить к нему префаб астероида.

Теперь вернитесь к кнопкам и привяжите On Click для StartGameButton к StartGame и EndGameButton к QuitGame в MainMenuController.

Последнее, что вам нужно сделать, это правильно расположить основную камеру. В моем случае лучше всего работало значение z -30.

Теперь сохраните свою сцену и добавьте обе сцены в сборку в настройках сборки, чтобы вы могли загружать GameScene при нажатии кнопки StartGameButton.

Подсчет очков и смерть

В нашей игре уже есть звуковой геймплей, но ему не хватает цели. Самый быстрый способ дать игроку цель — реализовать какой-то механизм подсчета очков.
План прост. Каждый астероид будет стоить несколько очков, и когда астероид будет уничтожен, мы увеличим счет игрока на эту сумму. В то же время мы позаботимся о реализации состояния игры.

Статья в тему:  Какой процент астероидов относится к типу c

Откройте GameScene и добавьте к нему новый холст, затем создайте две панели с именами GamePanel а также GameOverPanel.

Давайте сначала сосредоточимся на GamePanel.
Создайте два текстовых элемента внутри панели. Назовите первый ScoreLabel и установите для него значение «Score:». Назовите второй ScoreValue и установите его значение равным «0». Теперь привяжите их обоих к правому верхнему углу и расположите рядом друг с другом, изменив их размер по своему усмотрению, чтобы они выглядели красиво.

Переключитесь на GameOverPanel и просто поместите красный текст «Game Over», закрепленный посередине.

Теперь по логике. Мы собираемся отредактировать Игровой контроллер script, добавив следующие поля.

Установите для gamePanel и gameOverPanel две только что созданные панели, а для scoreValue — текст с тем же именем.

В начале метода Start добавьте следующее.

Это позаботится о том, чтобы включить игровую панель и скрыть панель игры.

Теперь давайте добавим метод для увеличения счета игрока.

И еще один способ показать игру на экране, когда игрок умирает.

Давайте также изменим метод Update, чтобы он проверял, жив ли игрок. Это предотвратит некоторые ошибки, когда игрок мертв.

Это было много изменений! Однако мы еще не закончили.
Нам нужно откуда-то вызвать метод PlayerDies, и это где-то будет ИгрокКонтроллер сценарий. Итак, давайте отредактируем его, добавив следующий код.

Это сделает так, что когда игрок умрет, игра закончится, как и ожидалось.

Статья в тему:  Откуда у астероидов дыры

Почти сделано.
Открой HealthController скрипт и, как показано ниже, добавьте поле scoreValue, измените метод DealDamage, чтобы он увеличивал счет при смерти, и метод start, чтобы он получал ссылку на GameController.

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

Последние штрихи

Игра почти завершена. Не так много осталось сделать.
Самая очевидная особенность, которую нам не хватает, — это красивый звездный фон. Об этом можно легко позаботиться, снова обратившись к Asset Store и импортировав соответствующий актив. Подойдет любой скайбокс, но я предпочитаю Dynamic Space Background Lite.
После импорта создайте новый материал с именем Skybox и в качестве шейдера выберите Skybox/6-side, затем установите значение Front на спрайт по вашему выбору из выбора, предлагаемого активом.

Теперь выберите основную камеру и добавьте компонент Skybox со значением, установленным для только что созданного материала.
Убедитесь, что значение x вашей камеры установлено на -30, а поле зрения равно 45, и вуаля, у вас получился довольно красивый фон, а также вам удалось завершить проект!

Наслаждайтесь видео конечного продукта!

Что дальше?

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

  • Экран рекордов: поскольку на данный момент единственная цель состоит в том, чтобы набрать больше очков, было бы целесообразно иметь экран с высоким счетом и позволить игроку вводить свое имя, когда он проигрывает.
  • Разные астероиды: было бы неплохо иметь более одного типа астероидов. Вы можете создавать более устойчивые астероиды, более крупные астероиды, самонаводящиеся астероиды, астероиды, которые распадаются при взрыве, огненные астероиды, неразрушимые астероиды и так далее. Возможности безграничны.
  • Уровни: в настоящее время игра всегда одна и та же и создает повторяющийся опыт. Вы можете улучшить это, введя уровни. Каждый уровень должен содержать одну или несколько волн астероидов, а о начале нового уровня должен сигнализировать текст в центре экрана, отображающий номер уровня.
  • Усиления: различные астероиды и уровни определенно усложнят игру. Чтобы компенсировать это, вы можете ввести бонусы, которые выпадают из разрушенных астероидов или которые редко появляются и перемещаются по экрану, соблазняя игрока поймать их. Бонусы могут дать буквально все: щиты, различные режимы огня, дополнительное здоровье, капсулы и многое другое.
  • Мультиплеер: всегда приятно поиграть с другом в старую добрую аркадную игру онлайн или локально.
Статья в тему:  Как астрономы дистанционно определяют состав астероидов

До свидания, пока!

На этом заканчивается второй урок из этой серии. Я надеюсь, что вам понравилось, и, если да, пожалуйста, похлопайте в ладоши.
Кроме того, если вы еще этого не сделали, вам следует взглянуть на первый урок, который покажет вам, как воссоздать еще один класс: Pong!

Удачи в ваших проектах и ​​до скорой встречи с другим уроком!

голоса
Рейтинг статьи
Ссылка на основную публикацию
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x