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

Создаем Арканоид на Unity: Механика мяча и платформы

Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Build Arkanoid With Unity.
Build Arkanoid With Unity: Project Setup
Build Arkanoid With Unity: Block Mechanics, Prefabs, and Level Design

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. В каждой статье мы сосредоточимся на определенной части игры; в этой статье мы получим платформу и движущийся мячик.

Где мы остановились

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

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

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

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

Движение игрока

У нас уже есть платформа игрока в интерфейсе; теперь мы должны взаимодействовать с ней. Она будет перемещаться по горизонтали, влево и вправо. Чтобы создать такое перемещение нам потребуется написать сценарий (Script).

Сценарии представляют собой фрагменты программного кода, которые выполняют определенные задачи. Unity может работать с тремя языками программирования: Boo, JavaScript и C#. Все сценарии, созданные в этом уроке, будут написаны на языке C# (но при желании можно реализовать их на другом языке).

Для создания сценария, перейдите на вкладку Project, выберите папку Scripts и кликните на ней правой кнопкой мыши, чтобы открыть меню. Выберите Create > C# Script. Появится новый файл NewBehaviourScript; переименуйте его в PlayerScript. На вкладке Inspector вы увидите содержимое самого скрипта.

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

Все сценарии Unity по умолчанию имеют два метода:

  • Start(): используется для инициализации любых переменных или параметров, которые нам нужны в нашем коде.
  • Update(): вызывается каждый кадр игры и поэтому необходим для обновления состояния игры.

Для того, чтобы сдвинуть платформу игрока, нам потребуется два вида информации:

  • позиция игрока
  • скорость игрока

Таким образом, создайте две переменные (глобальные переменные класса) для хранения этой информации:

Как вы могли заметить, playerVelocity является общедоступной переменной, а playerPosition - закрытой. Почему мы это сделали? Unity позволяет изменять значения общедоступных переменных внутри редактора без необходимости изменять фактический код; это очень полезно, когда у вас есть параметры, которые необходимо постоянно корректировать. Скорость платформы — одно из таких значений, и именно поэтому мы делаем ее общедоступной.

Сохраните сценарий (в MonoDevelop) и снова перейдите в редактор Unity.

Теперь у вас есть сценарий; вам просто нужно назначить его игровой платформе игрока. Выберите нашу платформу во вкладке Hierarchy и в окне Inspector добавьте компонент, кликнув на кнопку Add Component. Теперь введите имя скрипта, который вы только что сохранили, и добавьте его игровому объекту.

Для получения дополнительной информации о концепции Компонентов и о том, как они работают в Unity, см. Unity: Now You're Thinking With Components.

Другой способ добавить скрипт к компоненту - перетащить его из своей папки в область кнопки Add Component. Вы должны увидеть что-то подобное во вкладке Inspector:

Как вы можете видеть, поскольку мы оставили переменную playerVelocity общедоступной, теперь можно установить ее значение в редакторе. На данный момент установите значение 0.3 и вернитесь к коду.

Теперь вы инициализируете playerPosition. Для этого вам нужно получить доступ к позиции игрового объекта в методе запуска скрипта Start:

Теперь мы определили начальное положение и скорость платформы, но нам все равно придется двигать ее. Для этого мы отредактируем метод Update.

Так как нам надо, чтобы платформа перемещалась только горизонтально, мы можем использовать метод GetAxis класса Input для определения направления игрока по горизонтальной оси (-1 влево, +1 вправо), умножив полученное число на скорость и прибавив эту величину к текущей горизонтальной позиции игрока playerPosition, мы и получим движение.

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

Ниже приведен полный фрагмент кода:

Сохраните сценарий и вернитесь в редактор Unity. Теперь нажмите кнопку Play и попробуйте передвинуть платформу при помощи стрелок «влево» и «вправо».

Определение игровой области

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

Чтобы создать границу, сначала создайте другую общедоступную переменную - назовите ее boundary (граница).

Эта переменная будет хранить максимальную позицию X, к которой может перемещаться платформа. Поскольку мы собираемся построить уровень в симметричной форме вокруг точки с координатами (0, 0, 0), это означает, что абсолютное граничное значение переменной boundary будет одинаковым и для положительной части оси X, и для отрицательной.

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

Теперь вернитесь в редактор и найдите наилучшее значение для переменной boundary. Передвигая положение платформы по оси X, можно увидеть, что идеальное значение равно 5.46 (по крайней мере, в нашем проекте).

Откройте Inspector и сбросьте позицию платформы по оси X на 0, и введите значение 5.46 в параметр Boundary в компоненте Player Script.

Нажмите кнопку Play в редакторе. Теперь можно перемещать платформу, но только внутри игрового пространства.

Создание свойств физики

В этой конкретной игре нам нужно создать физические свойства для трех компонентов: платформы, мячика и стен. Поскольку мы создаем 2D-игру, мы будем использовать и применять 2D-коллайдеры. (Коллайдер - это особый тип компонента, который позволяет объекту реагировать на коллайдеры других объектов.)

Начните с добавления коллайдера (столкновения) к нашей платформе. В окне Hierarchy выберите нашу платформу. Перейдите во вкладку Inspector, нажмите Add Component и введите collider. Как вы можете видеть на скриншоте ниже, вам доступны несколько типов коллайдеров. Каждый отдельный коллайдер имеет определенные свойства, соответствующие связанным объектам.

Поскольку наша платформа имеет прямоугольную форму, мы будем использовать Box Collider 2D. Выберите его, и компонент будет автоматически добавлен к вашему игровому объекту. Значения размера и центрального положения коллайдера уже определены; Эти значения будут работать по умолчанию, поэтому их не нужно менять.

Теперь сделаем тот же процесс для трех границ и блока. (Hierarchy > Inspector > Add Component > Box Collider 2D).

Все ваши игровые объекты теперь имеют коллайдеры, кроме мячика. Поскольку мячик имеет другую форму, вам придется использовать другой коллайдер. Выберите его, и на вкладке Inspector добавьте компонент Circle Collider 2D.

Компонент Circle Collider 2D похож на Box Collider, за исключением того, что вместо параметра Size, который определяет ширину и высоту поля, он имеет параметр Radius, который определяет радиус круга.

Материал для отскока

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

Во вкладке Project создайте новую папку внутри папки Asset и назовите ее Physics. Выберите эту папку, нажмите Create и выберите Physics2D Material. Назовите свой новый физический материал BallPhysicsMaterial.

Материал имеет два параметра: Friction (трение) и Bounciness (упругость). Если вам требуется абсолютно упругое тело, то следует изменить значения на: 0 для Friction, и 1 для Bounciness.

Теперь, когда вы подготовили материал, примените его к мячику. Выберите игровой объект ball (мяч) на вкладке Hierarchy и перейдите на вкладку Inspector. Если вы поближе познакомитесь с компонентом Circle Collider 2D, вы заметите, что он имеет параметр Material; здесь вы можете прикрепить любой физический материал, который требуется для этого объекта.

Чтобы прикрепить материал BallPhysicsMaterial, просто выберите его и перетащите в параметр Material на коллайдере.

Добавление компонента Rigid Body

Для того, чтобы мяч двигался под контролем физики, нам нужно добавить еще одну вещь: компонент rigidbody. Выберите объект мяч и добавьте компонент RigidBody 2D. Этот компонент имеет несколько параметров, которые можно задать. Поскольку мячик будет перемещаться только с помощью отскока, вы должны изменить параметр Gravity Scale с 1 на 0 - таким образом, мы гарантируем, что на мяч не влияет гравитация. Остальные параметры можно оставить по умолчанию:

Программирование поведения мяча

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

Создайте новый скрипт (мы снова будем использовать C#) и назовите его BallScript. Назначьте новый скрипт объекту мяч (Hierarchy > Inspector > Add Component).

Теперь давайте проанализируем правила и свойства мячика, прежде чем начнем писать скрипт:

  • Мяч должен иметь два состояния: неактивное (следует за платформой до начала игры) и активное (отскакивает от платформы, стен и блоков).
  • Мяч станет активным только после того, как игрок нажмет конкретную клавишу на клавиатуре.
  • Когда мяч становится активным, мы применяем к нему силу, чтобы он начал движение.
  • Если мяч вышел за пределы игрового поля, он должен снова помещаться на платформу.

Основываясь на этой информации, мы сначала создадим глобальные переменные ballIsActive, ballPosition и ballInitialForce.

Теперь, когда у нас есть переменные, мы должны инициализировать игровой объект. В методе Start мы должны:

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

Вот как это выглядит:

Здесь мы применяем силу 300 по оси Y, чтобы мяч двигался вверх, а 100 вдоль оси X, чтобы мячик двигался по диагонали, а не прямо вверх. Таким образом, вы вынуждаете игрока перемещать платформу.

В методе Update мы определим поведение мячика. Давайте рассмотрим это в каждом конкретном случае.

Во-первых, мы должны обрабатывать вводимые пользователем данные; Мы воспользуемся стандартной кнопкой действия в Unity - Jump.  Клавиша, ассоциирующаяся с Jump, может быть изменена, но по умолчанию используется Space (пробел) на клавиатуре.

Следующее, что нужно сделать, это проверить состояние мяча, так как клавиша действия должна работать только тогда, когда мяч неактивен:

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

Теперь запустите проект нажав Play и протестируйте действие Jump; Вы заметите, что мяч отталкивается и начинает прыгать вокруг так, как он и должен. Тем не менее вы также заметите, что мяч не следует за положением платформы, когда неактивен. Остановите игру и давайте это изменим.

В методе Update мы должны проверить состояние мячика и, если мячик неактивен, мы должны убедиться, что значение по оси X мячика совпадает со значением по оси X платформы.

А как мы можем получить доступ к положению игрока, если оно находится в совсем другом игровом объекте? Просто: мы создаем переменную игрового объекта и храним ссылку на объект платформы. Итак, добавьте объект платформы в качестве общедоступной глобальной переменной типа GameObject:

Вернемся к методу Update. Мы проверим состояние мяча и ссылку на платформу. Если состояние неактивно и объект платформа не null (то есть, у нас есть ссылка на него), мяч должен следовать за положением платформы. Завершенный метод Update:

Сохраните сценарий и вернитесь в редактор. Как вы, возможно, заметили, ссылка на платформу является общедоступной, это означает, что вы передаете ее в редактор. На вкладке Hierarchy выберите мяч. На вкладке Inspector вы заметите, что параметр Player Object в нашем скрипте в настоящее время отсутствует None.

Чтобы сделать эту ссылку на платформу игрока, просто перетащите игровой объект платформа из вкладки Hierarchy в поле Player Object в компоненте скрипт.

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

Сброс игры

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

Мы проверим, активен ли мяч и если его положение по оси Y меньше -6. Если это так, мы установим мяч неактивным и сбросим положение мяча в положение игрока. Этот фрагмент выглядит следующим образом:

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

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

Чтобы сохранить одну и ту же общую силу, необходимо убедиться, что все силы, примененные к мячику, все время сбрасываются. Для этого мы можем просто активировать параметр Is Kinematic каждый раз, когда мяч останавливается, и деактивировать его при запуске игры. Этот параметр определяет, влияет ли физика на мяч, и его отключение гарантирует, что все силы, примененные до этого, исчезнут.

Для этого добавьте в метод Update еще две строки:

  • rigidbody2D.isKinematic = false перед добавлением силы и
  • rigidbody2D.isKinematic = true, когда мы хотим, чтобы мяч снова начал двигаться.

В конце концов, итоговый метод Update должен выглядеть следующим образом:

Теперь можно нажать кнопку Play и проверить все вышеперечисленные функции.

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

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

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


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.