Как сделать гравитацию в игре

Как сделать

LiveStreet

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

В Unity для управления персонажем создан специальный упрощенный контроллер Character Controller, который представляет собой капсулу с заданной высотой и радиусом. Эта капсула позволяет персонажу перемещаться в пространстве, отслеживая столкновения с другими объектами, к которым присоединен какой-либо Collider. Благодаря этому наш персонаж не проваливается в стены и под пол. Но вся проблема в том, что о гравитации в данном случае приходится заботиться самому, т.к. Character Controller ничего о ней не знает. На то он и упрощенный компонент.

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

Имитация гравитации для Character Controller в Unity

Для компонента Character Controller нам придется имитировать воздействие гравитации в Unity. Для перемещения персонажа в Unity при помощи компонента Character Controller достаточно передать расстояние, на которое требуется передвинуть персонажа. Предположим, что под персонажем нет земли. Тогда гравитация начнет двигать его вниз. Иными словами, мы должны искусственно добавлять смещение вниз для любого персонажа, управляемого при помощи Character Controller в Unity. А так как Character Controller реализует обработку столкновений, то если у нас под ногами есть «твердая» поверхность, то под землю мы не провалимся! Вот как это выглядит на C# в Unity:

Читайте также:  Как сделать теплые стельки своими руками

Тогда на каждом кадре сила гравитации будет расти.

Да, совсем забыл об одной важной мелочи — разная мощность компьютерного железа. У одного видеокарта выдает 60 FPS (кадров в секунду), у другого 100. Чтобы у каждого игра работала одинаково, в Unity введен поправочный коэффициент, на который нужно домножать все покадровые вычисления. Этот коэффициент содержится в Time.deltaTime. И перед применением метода Move контроллера персонажа, мы должны каждый компонент вектора перемещения домножить на этот самый deltaTime:

Как сделать прыжки?

В предыдущем примере наш персонаж начнет падать, если попробует перейти через пропасть. Без применения гравитации (смещения по оси Y вниз) персонаж бы просто плавно перенесся на другой край пропасти, как будто он идет по невидимому мосту. Но как же перепрыгнуть через пропасть?

Для создания прыжков персонажа с Character Controller в Unity нам потребуется придать персонажу положительное смещение по вертикальной оси Y. Для этого добавим в скрипт на C# еще одну настройку — величину прыжка. Силой у меня назвать это значение язык не поворачивается, но это и не высота. Короче, что-то, что переместит нас вверх.

Ну что, получилось? Да… получилось немного не то, что задумывалось. Если нажать на прыжок, наш персонаж начинает плавно подниматься вверх, будто у него реактивный ранец. Все дело в том, что при нажатии на прыжок вертикальное смещение на каждом кадре получает одно и то же значение JumpValue. Кстати, реактивные ранцы так и делаются 🙂 Шутки ради можно попробовать написать

Тогда игрок взлетит в небо с ускорением на каждом кадре, как ракета!

Что же нужно для создания нормальных прыжков персонажа в Unity с использованием компонента Character Controller? А нужно для этого вводить понятие «импульса». На практике импульс реализуется в виде некоторой начальной величины, которая потом угасает со временем.

Читайте также:  Как сделать карман на папке

Я решил создать для себя относительно универсальный класс управления гравитацией. В нем гравитация в Unity будет задаваться произвольным вектором (не обязательно вдоль вертикальной оси Y и не обязательно вниз :). Вообще говоря, правильно, что создание гравитации для контроллера Character Controller в Unity отдали на откуп программистам. Это дает больше простора для фантазии. Благодаря этому появились такие интересные игрушки, как Inertia, Rochard, Cargo Commander (а с чего это я взял, что Cargo Commander сделан на Unity?) и многие другие.

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

Для его реализации в универсальный класс управления гравитацией в Unity я добавил несколько методов:

Метод UpdateImpulse() вызывается при каждом тике и постепенно гасит изначальный импульс силой мировой гравитации. Таким образом реализуется резкое ускорение прыжка и плавное затухание силы прыжка со временем с достижением вершины и плавным ускорением от вершины вниз назад к земле — все как в школьном курсе физики — движение тела по параболе. Только теперь до меня начинают доходить такие абстрактные понятия, как dV по dt (эти долбаные производные — ненавижу математику! А без нее никуда 🙂

Источник

Adblock
detector