Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Unity
Gamedevelopment

Пишем арканоид на Unity. Механика блоков, префабы и дизайн уровней

Difficulty:BeginnerLength:MediumLanguages:
This post is part of a series called Build Arkanoid With Unity.
Build Arkanoid With Unity: Player and Ball Mechanics
Build Arkanoid With Unity: Audio, New Levels, and Deployment

Russian (Pусский) translation by Dmitriy Sirosh (you can also view the original English article)

Final product image
What You'll Be Creating

В этой серии уроков мы покажем вам, как воссоздать классическую игру Arkanoid (или Breakout) в Unity, используя собственные 2D-инструменты Unity. В каждом посте мы сосредоточимся на определенной части игры; в этой настроим поведение игровых блоков и создадим префабы.

На чем мы остановились

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

Превью результата

Взгляните на это демо, чтобы увидеть, к чему мы стремимся во всей серии:

И вот что мы получим в конце этой статьи:

Скрипт для блока

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

Скрипт для блока должен содержать информацию о:

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

(Обратите внимание, что количество ударов и очков может меняться в соответствии с цветом блока.) Исходя из этого, давайте выделим три переменные для блока:

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

Первые две переменные будут public, чтобы мы могли изменять их значения в редакторе Unity. Третья будет private, поскольку предназначена только для внутреннего пользования.

Таким образом, создайте новый скрипт BlockScript. Определите эти переменные и инициализируйте количество ударов равным 0:

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

Для того, чтобы воспользоваться этой функцией, мы должны пометить мячик специальным тегом. В редакторе Unity на вкладке Hierarchy выберите мячик, перейдите в окно Inspector и найдите поле Tag. В верхней части вкладки Inspector, прямо под именем игрового объекта, есть поле Tag, которое в настоящее время определено как Untagged. Нажмите кнопку, и выпадающее меню появится с различными возможностями тегов:

Нам нужен конкретный тег для мяча, поэтому нажмите Add Tag, чтобы создать новый тег. После нажатия этой опции появляется новый интерфейс:

В этой статье мы сосредоточимся на свойстве Element 0. Которое определят название тега, поэтому введите в него имя Ball.

Теперь, когда у вас есть новый тег Ball, измените тег объекта мячик на Ball.


Откройте файл BlockScript, чтобы мы могли переопределить метод OnCollisionEnter2D. Чтобы определить игровой объект мячик, проверьте, тег игрового объекта Ball; если это так, то столкновение было между блоком и мячом. Добавьте в свой скрипт следующий код.

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

Обновленный метод OnCollisionEnter2D выглядит следующим образом:

А теперь добавьте этот скрипт BlockScript к объекту Block (Hierarchy > Inspector > Add Component):

Пришло время проверить, что все в порядке. Измените значение Hits To Kill в редакторе на 1 и запустите Play игру. Когда мяч попадает в блок, блок должен исчезнуть.

Создание префабов

Теперь, когда механики блока готовы, мы будем заполнять наш уровень. Поскольку вы будете использовать несколько блоков, это подходящее время для создания префабов в Unity.

Prefab (Префаб) - это один из типов объектов, предназначений для многократного использования, который можно вставлять несколько раз в одну и ту же сцену. Это означает, что если вы хотите, например, изменить значение очков для синих блоков, вам не нужно делать это для каждого синего блока на сцене. Если у вас есть Prefab синего блока, вы просто корректируете значение Prefab, и все блоки на сцене будут обновлены.

Чтобы создать Prefab для синих блоков, начните с переименования объекта Block в Blue Block. Затем создайте новую папку в папке «Assets» под названием Prefabs. Теперь перетащите объект Blue Blocks внутрь новой папки.

Как вы могли заметить, иконка кубика в верхней части вкладки Inspector теперь стала синего цвета. Также как и название блока во вкладке Hierarchy. Это значит, что был создан префаб. Довольно просто, не так ли? Отныне, выбрав этот префаб и изменив у него какое-либо значение, обновятся параметры у всех его экземпляров.

Чтобы проверить префаб, перетащите его из папки на вкладку Hierarchy. Как видите, теперь у нас два синих блока, но они оба находятся на одной и той же позиции.

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

Нажмите кнопку Play и протестируйте работу префабов.

Пересоздание префабов

Теперь вы создадите оставшиеся префабы для других блоков (зеленого, желтого и красного). Основные шаги, которые нужно выполнить для каждого из них:

  1. Создайте новый спрайт.
  2. Добавьте соответствующее изображение.
  3. Добавляем компонент Box Collider 2D.
  4. Добавьте BlockScript.
  5. Переименуйте объект.
  6. Создайте префаб

В конце концов мы должны создать четыре различных префаба (по одному для каждого типа блока):

Для того, чтобы игра была более интересной, измените количество ударов для уничтожения блока (параметр Hits To Kill) таким образом:

  • Синий: 1 удар.
  • Зеленый: 2 удара.
  • Желтый: 3 удара.
  • Красный: 4 удара.

Добавьте несколько различных блоков на сцену и запустите игру нажав Play, убедитесь, что все работает как ожидалось.

Дизайн уровней

Настало время создать свой первый уровень. Используя префабы, заполните область игры несколькими блоками. Если вы разместили столько блоков, сколько вы сделали, вкладка Hierarchy, вероятно, переполнена игровыми объектами! Чтобы ваш проект был хорошо организован, давайте создадим пустые игровые объекты для четырех типов блоков, а затем сгруппируем блоки по цвету:

На данный момент ваша игра почти готова, ваша основная механика реализована, и она должна выглядеть примерно так:

Система очков и жизней

Система очков и жизней - это один из способов протестировать игроков и ввести новую динамику в игру. На данный момент ваша игра не имеет никакого способа для игроков прогрессировать или проигрывать. Давайте исправим это сейчас.

Откройте PlayerScript, созданный на прошлом уроке, и добавьте две переменные: количество набранных очков и число оставшихся жизней. Игрок будет начинать игру с тремя жизнями и без очков:

Нам нужен метод, увеличивающий количество очков, которые игрок получает каждый раз, когда он уничтожает блок. Создайте для этого новый метод addPoints:

Теперь у нас есть новый метод, ожидающий значения, но как он его получит? Слишком много блоков, чтобы ссылаться на игровой объект платформа в каждом...

Лучшим способом является передача сообщения от блока платформе. Как это сделать? Для начала выберем для платформы тег Player (Hierarchy > Inspector > Tag):


Теперь, когда платформа имеет свой тег, перейдем к скрипту блока BlockScript, где изменим метод OnCollisionEnter2D отправив очки игровому объекту: до того как он будет уничтожен, мы найдем нашу платформу при помощи тега Player используя метод FindGameObjectsWithTag; это приведет к возврату массива совпадающего объекта, так как есть только один объект с этим тегом, мы знаем, что объект в позиции 0 возвращаемого массива представляет собой игровой объект платформа.

Теперь, когда у вас есть ссылка на игровой объект, вы можете отправить ему сообщение с помощью метода SendMessage. При этом вы можете вызвать конкретный метод игрового объекта - в этом случае - метод addPoints.

Следующий фрагмент показывает нам, как все это работает:

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

  • Синий: 10 очков;
  • Зеленый: 20 очков;
  • Желтый: 35 очков;
  • Красный: 50 очков;

Теперь нам нужно показать в интерфейсе игры количество жизней и набранные очки. В скрипте PlayerScript создайте метод OnGUI. Этот метод представит GUI графический интерфейс вашей игры; это один из основных способов представления информации в игровом пространстве. (Обратите внимание на символы, чувствительные к регистру).

Чтобы добавить очки и жизни, нам нужно создать Label с нужным текстом. В PlayerScript добавьте метод OnGUI и создайте в нем этот Label:

Теперь вы можете нажать Play и играть в игру, вы увидите очки и жизни в верхней левой части экрана. Тем не менее, вы еще не запрограммировали отображение жизней и точек для их обновления!

Используя тот же PlayerScript, добавьте следующий метод TakeLife. Метод будет вычитать только одну жизнь игрока каждый раз, когда он вызывается:

Наконец, перейдите к BallScript, и в разделе, где вы проверяете, если мячик падает за пределы игрового поля, вызовем метод TakeLife для отправки сообщения игровому объекту. Полный фрагмент представлен ниже:

Запустите игру и проверьте, что все работает правильно.

В следующий раз

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

Если у вас есть вопросы или отзывы, как всегда, не стесняйтесь писать в разделе для комментариев.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.