company_banner

Про создание платформера на Unity. Часть первая, характерная

  • Tutorial
Привет, Хабр!

Все мы здесь любим качественные пошаговые руководства для начинающих, чего уж греха таить. По платформерам на Unity руководств много, а вот качественных не то что бы и очень. Сегодня мы попробуем добавить в копилку хороших уроков еще один. А создавать мы будем персонажа для 2D-платформера, ни больше, ни меньше.

Присоединяйтесь, учитесь, но помните: под катом очень много гифок.



Итак, с чего начать создание персонажа? Конечно же, с его спрайта. Достаточно перетащить картинку из любой папки на жестком диске во вкладку Assets, а оттуда — прямо на сцену. Оговорюсь сразу, в этом уроке мы не будем рассматривать создание анимации. А вот в следующих частях цикла — будем.



Как видите, после добавления на сцену (условимся, что это полноценный аналог словосочетанию scene view) у спрайта появились два компонента. Первый — transform. Он отвечает за расположение любого игрового объекта на сцене, его масштаб и текущий угол поворота относительно осей. Компонент sprite renderer как раз занимается отрисовкой спрайта нашего обаятельного носача в процессе редактирования и игры.



Но пока персонаж всего лишь картинка, он не может взаимодействовать с окружающим его миром. Для этого на помощь приходят компоненты, спрятанные во вкладке physics2d. В нашем случае это box collider и circle collider. Первый мы добавим на верхнюю часть персонажа для столкновений со стенами и всем остальным, а второй расположим на уровне ног. Это позволит двигаться по наклонным поверхностям (и поверхностям с небольшим перепадом высот) без особых проблем.



Теперь, чтобы на героя действовала, допустим, гравитация, добавим ему rigidbody2D (ну или твердое тело, как вам больше нравится). Для этого все в том же меню add component -> physics2D выберем пункт rigidbody2D и к спрайту сразу же добавится еще один компонент.



Если вкратце:
mass отвечает понятно за что;
linear drag и angular drag — линейное и угловое сопротивление, соответственно;
gravity scale — коэффициент гравитации для конкретно этого объекта;
fixed angle отключает переворот персонажа при столкновении с чем-нибудь, допустим, летящим;
isKinematic фиксирует объект раз и навсегда в одной точке;
interpolate устанавливает режим сглаживания при отрисовке персонажа;

Для платформера стандартное значение гравитации (-9.81 по оси Y) не очень подходит, поэтому изменим его на какое-нибудь магическое число. Например, -30. Для этого зайдем в Edit — Project Settings — Physics2D и заменим нужное значение в инспекторе.



На этом пока перестанем добавлять персонажу компоненты. Но сделаем кое-что из него. Для того, чтобы нам не приходилось тысячу раз добавлять одинаковые компоненты на каждом, допустим, уровне, в Unity есть механика под названием prefabs. Она позволяет создать из игрового объекта «болванку», которую можно использовать много раз и менять как своей душе угодно, не боясь за то, что какие-то экземпляры могут не измениться. Для создания префаба достаточно просто перетащить объект из иерарахии во вкладку assets. В моем случае еще и в папку prefabs.



Как видите, оба экземпляра героя прекрасно создаются и существуют вместе. Теперь нужно создать платформу, на которой будет стоять наш большеносый друг. Перетащим спрайт на сцену и добавим ему polygon collider. Размеры этого коллайдера, к слову, можно менять, перетаскивая его вершины с зажатой кнопкой shift.



Самое время научить персонажа двигаться. Перетащим заранее подготовленный скрипт (его нужно скачать и сохранить в папку assets) прямо на персонажа в hierarchy view.





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

maxSpeed и JumpForce — максимальная скорость (по горизонтали) и сила прыжка. Экспериментально проверено, что для массы, равной единице, и гравитации -30 значения maxSpeed=10 и jumpForce = 700 являются оптимальными.

groundCheck — дочерний объект, находящийся в нижней точке спрайта и отвечающий за определение того, находится ли нечто, чем мы управляем, на «земле»

whatIsGround — что, собственно, считать землей. В нашем случае «землей» считается все, кроме персонажа

groundRadius — некая величина, в пределах которой проверяется столкновение с поверхностью.

В итоге, строчка grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround); проверяет, пересекает ли groundCheck с радиусом groundRadius поверхность и, допустим, запрещает прыгать в нужных случаях.



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



Герой прекрасно двигается (хотя, возможно, и не совсем прекрасно), и это создает для нас отличные предпосылки продолжить создание платформера.

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

Если эта статья вдруг пробудила в вас желание написать собственную игру, то не растрачивайте его впустую! Прямо сейчас проходит конкурс, стать участником которого слишком просто: достаточно зарегистрироваться, выложить свою игру в store и дождаться объявления результатов. А победителей ждут Xbox One и великолепные Lumia 930!

Пойду дописывать свой Angry Flappy Swompy 3 Deluxe. Stay tuned, вторая часть статьи в ближайшие дни!

p.s.
Платформа.png
Персонаж.png (огромное спасибо Анастасии Гарань за отрисовку героя)

А вот и другие наши статьи по схожей тематике:

Microsoft
407.50
Microsoft — мировой лидер в области ПО и ИТ-услуг
Share post

Comments 13

    0
    Статья отлично помогает разобраться в интерфейсе Unity, спасибо.
    Главный вопрос — работает ли у вас лично проверка groundCheck? Судя по логике, дочерний объект всегда пересекает самого персонажа, если находится в нижней части спрайта.
      0
      Вы абсолютно верно заметили — объект всегда будет grounded. Но здесь, скорее, как во вредных советах: я сознательно пошел на это упрощение в рамках первой статьи, а в следующей подробно объясню почему так делать не нужно и как сделать правильно.
        0
        As designed, конечно)
        Хорошо, буду ждать следующей статьи, чтобы переучиться.
        И ещё — PasteBin, который вы используете для хранения классов C# заблокирован Роскомнадзором. Как известно, на Хабре очень не любят криминал. А вы прямо подталкиваете
          0
          Странно. У меня и на работе, и дома pastebin открывается без проблем. Посоветуете что-то более законное?
          • UFO just landed and posted this here
              0
              Напишите, чтобы люди не в коем случае не использовали ZenMate или любой другой прокси/анонимайзер для нарушения закона!
                +1
                Просто добавьте код в статью. Люди с хабра умеют создавать новый файл.
          0
          Почему вы используете box collider и circle collider, а не polygon сollider?
          • UFO just landed and posted this here
              0
              Возможно зацепиться остается и в предложенном мной решении. Для решения этой проблемы можно или отключать гравитацию, допустим, при столкновении со стенкой правой или левой частью персонажа, или использовать грязные хаки с материалами, у которых friction = 0.
                +1
                Думаю ещё и потому, что когда будет добавлена анимация движения, скажем ноги начнут ходить, кружок пересечение полностью покрывает, а с полигонами придётся либо попотеть, чтобы подстраивать коллайдер под анимацию либо всё-равно согласиться на некую общую форму.

                Спасибо за статью, действительно просто и ясно!
                  0
                  Приходите еще! :)
                0
                1) Polygon collider требует больше расчетов, чем связка box+circle. В некоторых случаях это может быть критичным (допустим, для ста одинаковых объектов на каком-нибудь не очень свежем телефоне)
                2) Circle collider в основании позволяет корректно перемещаться по наклонным платформам и платформам с небольшим перепадом высот. Если оставить внизу box, то он может в какой-то момент уткнуться в стенку в 1 пиксель и никуда дальше не пойти.

              Only users with full accounts can post comments. Log in, please.