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

Механика платформера: перемещение платформ

by
Difficulty:BeginnerLength:MediumLanguages:

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

Final product image
What You'll Be Creating

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

Что понадобится

Этот урок основан на серии Basic Platformer Physics (Базовая физика платформера). В частности, мы будем использовать код, основанный на 8-й части урока, в качестве отправной точки, с несколькими изменениями. Ознакомьтесь с учебной серией и, в частности, с последней частью. Принципы реализации будут такими же, даже если вы используете другое решение для физики, но код будет совместим с версией, представленной в серии уроков.

Демо

Вы можете загрузить демо из вложений (справа кнопка "Download Attachment") к этому уроку. Используйте клавиши WASD, чтобы перемещать персонаж, Space — чтобы клонировать персонаж, и P, чтобы добавить двигающуюся платформу. Правой кнопкой мыши можно создать плитку. Вы можете использовать колесо прокрутки или клавиши со стрелками, чтобы выбрать плитку, которую вы хотите разместить. Бегунки изменяют размер персонажа игрока.

Демо опубликован из-под Unity 2017.2b4, а исходный код совместим с этой версией Unity.

Реализация

Перемещение платформ

Для начала, давайте создадим скрипт, который двигает платформы.

Инициализация

Давайте начнём с создания класса объекта.

Теперь давайте зададим некоторые основные параметры объекта в функции init.

Мы задаём размер и скорость, и создаём кинематику сталкивания, а это означает, что они не будут сдвинуты обычными объектами. Мы также устанавливаем значение mSlopeWallHeight равным 0, а это означает, что платформа не будет подниматься по склонам — она всегда будет рассматривать их как стены.

Поведение

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

Вот визуализированный образец:

The pattern visualized

Приклеим персонажа к платформе

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

The offset of the platform

Определение родительского объекта

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

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

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

Первое место, это где мы проверяем, что объекты соприкасаются.

Второе место — когда они перекрываются.

Теперь, когда мы позаботились об этом, давайте займёмся перемещением нашего объекта. Давайте изменим функцию UpdatePhysics из предыдущего урока.

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

Теперь, давайте заменим старое локальное смещение этим классом.

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

Заметьте, что тут мы проверяем ещë, если мы всё ещë касаемся объекта. Если это не так, тогда мы задаём mMountParent равным null, чтобы обозначить, что этот объект больше не едет на другом.

Далее, давайте переместим наш объект на это смещение (offset). Мы не будем использовать нашу функцию Move, а просто изменим положение. Таким образом, при проверке столкновения объектов, которая идёт сразу после UpdatePhysics, мы получим результаты расположений в этой рамке, вместо предыдущей.

Теперь, давайте перейдём к функции UpdatePhysicsP2, которая вызывается сразу после устранения столкновения. Здесь мы отменяем наше предыдущее перемещение, которое не было проверено на правильность.

Затем, мы переходим к UpdatePhysicsResponse, чтобы применить сдвиг от пересечения с другими объектами. Тут, ранее, мы изменяли позицию напрямую, но теперь, вместо этого, давайте изменим mOffset, таким образом изменение положения урегулируется позже, когда мы будем использовать нашу функцию Move.

Теперь мы можем вернуться к UpdatePhysicsP2, где мы просто вызываем функции UpdatePhysicsResponse и Move, как мы делали раньше, чтобы получить правильное положение.

Исправляем порядок обновления

Из-за того, в каком порядке мы обновляем физику, если дочерний объект обновится раньше родительского, дочерний будет постоянно терять связь с платформой, при перемещениях вверх/вниз.

Traveling up or down

Чтобы исправить это, везде, где мы задаём mMountParent, если платформа идёт после дочернего объекта в очереди обновления, мы меняем их местами, так чтобы родительский объект всегда обновляется первым. Давайте сделаем эти изменения в функции TryAutoMount.

Как видите, если id объекта платформы больше чем дочерний, порядок объектов заменяется, устраняя проблему.

The order of the objects

Ну, как-то так, когда нам нужно приклеить персонаж к двигающейся платформе.

Определение столкновения

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

Давайте, сначала позаботимся об оси X:

Если объект справа, и мы уже толкаем его в левую сторону, давайте вызовем функцию Crush, которую мы введём позже. Делаем тоже самое и для другой стороны.

Повторим это для оси Y.

Для примера, функция Crush просто переместит персонаж к центру карты.

В результате, персонаж будет телепортирован, если он будет раздавлен платформой.

Being crushed by a platform

Подытожим

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

Этот урок запрашивался много раз, поэтому, я надеюсь, вы найдёте его полезным! Спасибо что прочли, увидимся в следующий раз!

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.