Простая машинка в Unity
Урок по созданию простой машинки в среде Unity при помощи компонента WheelCollider. Описаны базовые настройки этого компонента. Для понимания урока необходимы базовые знания среды Unity.
Введение
С английским у меня неплохо, поэтому когда понадобилось сделать машинку в проекте, хватило стандартного примера, однако, хоть и написано, что он «аркадный», все же пример затрагивает гораздо больше вопросов, и один только pdf документ весит 11 мб, а сам пример 212 мб.
От того примера сложилось впечатление, будто нам дали готовый проект, рассказали как менять параметры, чтобы можно было поиграться, но не стали особо объяснять, как его сделали шаг за шагом. Кроме того, он на английском, отсюда родился порыв сделать урок для GameDev.ru.
Я хочу описать самый примитивный вариант создания машинки, управляемой с клавиатуры, освоив который уже стоит браться за более сложные примеры.
Создаем по шагам
1. Итак создадим четыре пустых объекта для удобной иерархии в нашем объекте:
- carRoot — контейнер для всех элементов машины (геометрия, свет, камеры, объекты для скриптов)
car — контейнер для объектов именно машины,
physic — контейнер для физических моделей колес,
graphic — графические объекты.
2. Добавим в carRoot камеру и закинем на нее стандартный скрипт SmoothFollow, однако на 32 строке добавим или внешнюю переменную angle, или просто добавим поворот на 90 градусов, так как стандартный скрипт заставляет камеру быть сбоку от объекта :
3. в car добавляем компонент RigidBody, его масса — это масса корпуса машины, она будет влиять на устойчивость и на то, насколько сильно он прижимает колеса.
Для того чтобы на поворотах нас не сильно заносило, и при падении машина возвращалась в правильное положение, а не переворачивалась, нам потребуется два изменения — компонент ConstantForce в car, который будет прижимать машину на поворотах, кроме того, переместим центр массы машины вниз, добавив на нее скрипт carControl с кодом вроде этого:
4. В physic создаем пустой объект body с компонентом CapsuleCollider — это будет простой корпус машины, обтекаемый и не дающий застревать в стенках.
5. создаем пустой объект wheel_BL и добавляем ему компонент WheelCollider, и настраиваем его:
- Center — расположение колеса,
Radius — радиус колеса,
Suspension Distance — длинна пружин подвески.
Suspension Spring : Spring — сила пружины подвески, чем выше тем сильнее пружинит,
Suspension Spring : Damper — сила амортизатора, делает более плавным движение пружины.
Mass — масса колес, опять же влияет на поведение на заносах, прыжках.
Теперь добавим в объект wheel_BL простой цилиндрический меш, чтобы так сказать, иметь отладочную версию, впрочем, можно ограничится тем, что Unity нам и так предоставляет.
6. Раскопируем наше колесо до нужного числа, например, 4 — в принципе, машинка уже готова.
Теперь нам нужно только заставить колеса вращаться с ускорением по нажатию клавиш и поворачиваться, что можно сделать например так :
Заключение
Собственно, теперь вы можете соорудить любое нечто на колесах, можно прикрепить две группы (подвески) по два колеса друг к другу джоинтами (как в этом уроке) или сделать вращение колес при развороте, как у танка. Широкий простор для креатива.
Wheel Collider
The Wheel Collider is a special collider for grounded vehicles. It has built-in collision detection, wheel physics, and a slip-based tire friction model. It can be used for objects other than wheels, but it is specifically designed for vehicles with wheels.
Свойства
Свойство: | Функция: |
---|---|
Mass | Масса колеса. |
Radius | Радиус колеса. |
Wheel Damping Rate | This is a value of damping applied to a wheel. |
Suspension Distance | Максимальное расстояние расширения подвески колеса, измеряется в локальном пространстве. Подвеска всегда расширяется вниз по локальной оси Y. |
Force App Point Distance | This parameter defines the point where the wheel forces will applied. This is expected to be in metres from the base of the wheel at rest position along the suspension travel direction. When forceAppPointDistance = 0 the forces will be applied at the wheel base at rest. A better vehicle would have forces applied slightly below the vehicle centre of mass. |
Center | Центр колеса в локальном пространстве объекта. |
Suspension Spring | The suspension attempts to reach a Target Position by adding spring and damping forces. |
Spring | Spring force attempts to reach the Target Position. A larger value makes the suspension reach the Target Position faster. |
Damper | Dampens the suspension velocity. A larger value makes the Suspension Spring move slower. |
Target Position | The suspension’s rest distance along Suspension Distance. 1 maps to fully extended suspension, and 0 maps to fully compressed suspension. Default value is 0.5, which matches the behavior of a regular car’s suspension. |
Forward/Sideways Friction | Свойства трения шины, когда колесо катится вперёд и в сторону. См. ниже секцию Кривые трения колеса. |
Компонент Wheel Collider. Авторство модели машины — ATI Technologies Inc.
Детали
The wheel’s collision detection is performed by casting a ray from Center downwards through the local Y-axis. The wheel has a Radius and can extend downwards according to the Suspension Distance. The vehicle is controlled from scripting using different properties: motorTorque, brakeTorque and steerAngle. See the Wheel Collider scripting reference for more information.
Wheel Collider рассчитывает трение отдельно от остального физического движка, используя модель трения, основанную на скольжении шин. Это позволяет реализовать более реалистичное поведение, и при этом, Wheel Collider’ы игнорируют стандартные настройки Physic Material (физического материала).
Настройка Wheel Collider
Не поворачивайте и не вращайте WheelCollider объекты для управления машиной — объекты с WheelCollider всегда должны оставаться в фиксированном положении относительно машины. Однако, вы можете поворачивать и вращать визуальные представления колёс. Лучший способ это сделать — разделить объекты с Wheel Collider’ами и видимыми колёсами:
Wheel Collider’ы отделены от видимых моделей колёс
Note that the gizmo graphic for the WheelCollider’s position is not updated in playmode:
Положение гизмо WheelCollider’а во время работы игры при расстоянии подвески 0.15
Геометрия для коллизий
Так как машины могут развивать большую скорость, очень важен правильный подход к геометрии гоночного трека, используемой для определения столкновений. Например, меш-коллайдер не должен иметь выпуклостей или вмятин, которые служат для украшения видимой модели (например, столбы ограждения). Обычно меш-коллайдер для гоночного трека создают отдельно от видимого меша, делая его как можно плавнее. В нём также не должно быть тонких объектов — если у вас тонкий забор трека, сделайте его шире в меше-коллайдере (или полностью удалите внешнюю часть, если машина туда никогда не сможет добраться).
Видимая геометрия (слева) намного сложнее, чем геометрия для коллизий (справа)
Кривые трения колеса
Трение шины может быть описано показанной ниже кривой трения колеса. Существуют отдельные кривые для прямого (вращение) и бокового направления колеса. В обоих направлениях сперва определяется то, как сильно скользит шина (на основании разности скоростей между резиной шины и дорогой). Затем значение скольжения используется для того, чтобы найти силу, применяемую шиной к точке соприкосновения.
The curve takes a measure of tire slip as an input and gives a force as output. The curve is approximated by a two-piece spline. The first section goes from (0 , 0) to (ExtremumSlip , ExtremumValue), at which point the curve’s tangent is zero. The second section goes from (ExtremumSlip , ExtremumValue) to (AsymptoteSlip , AsymptoteValue), where curve’s tangent is again zero:
Типичная форма кривой трения колеса
У настоящих шин есть свойство испытывать большие нагрузки при низком скольжении, так как резина компенсирует скольжение растягиванием. Далее, когда скольжение становится действительно большим, нагрузка снижается, т.к. шина начинает проскальзывать или крутиться. Поэтому кривые трения шин имеют форму аналогичную той, что представлена на изображении выше.
Wheel Collider
Wheel Collider — это специальный вид коллайдера для наземного транспорта. В него встроены: определение столкновений, физика колеса и основанная на скольжении шин модель трения. Его можно использовать и не только для колёс, но он был специально создан для транспорта с колёсами.
For guidance on using the Wheel Collider, see the Unity Wheel Collider tutorial.
Свойства
Свойство: | Функция: |
---|---|
Mass | Масса колеса. |
Radius | Радиус колеса. |
Wheel Damping Rate | This is a value of damping applied to a wheel. |
Suspension Distance | Максимальное расстояние расширения подвески колеса, измеряется в локальном пространстве. Подвеска всегда расширяется вниз по локальной оси Y. |
Force App Point Distance | This parameter defines the point where the wheel forces will applied. This is expected to be in metres from the base of the wheel at rest position along the suspension travel direction. When forceAppPointDistance = 0 the forces will be applied at the wheel base at rest. A better vehicle would have forces applied slightly below the vehicle centre of mass. |
Center | Центр колеса в локальном пространстве объекта. |
Suspension Spring | Подвеска пытается достичь значения Target Position с помощью пружины и сил сопротивления. |
Spring | Сила пружины, пытающаяся достичь Target Position. Чем больше значение, тем быстрее подвеска будет стремиться к Target Position. |
Damper | Добавляет сопротивление в подвеску. Чем больше значение, тем медленней будет двигаться Suspension Spring (пружина подвески). |
Target Position | The suspension’s rest distance along Suspension Distance. 1 maps to fully extended suspension, and 0 maps to fully compressed suspension. Default value is 0.5, which matches the behavior of a regular car’s suspension. |
Forward/Sideways Friction | Свойства трения шины, когда колесо катится вперёд и в сторону. См. ниже секцию Кривые трения колеса. |
The Wheel Collider Component. Car model courtesy of ATI Technologies Inc.
Детали
Определение столкновений колеса производится с помощью картинка луча из Center вниз по локальной оси Y. У колеса есть Radius и оно может опускаться вниз в соответствии с Suspension Distance. Транспорт контролируется из кода, с помощью разных свойств: motorTorque, brakeTorque и steerAngle. См. справку по классу WheelCollider для дополнительной информации.
Wheel Collider рассчитывает трение отдельно от остального физического движка, используя модель трения, основанную на скольжении шин. Это позволяет реализовать более реалистичное поведение, и при этом, Wheel Collider’ы игнорируют стандартные настройки Physic Material (физического материала).
Настройка Wheel Collider
Не поворачивайте и не вращайте WheelCollider объекты для управления машиной — объекты с WheelCollider всегда должны оставаться в фиксированном положении относительно машины. Однако, вы можете поворачивать и вращать визуальные представления колёс. Лучший способ это сделать — разделить объекты с Wheel Collider’ами и видимыми колёсами:
Wheel Colliders are separate from visible Wheel Models
Note that the gizmo graphic for the WheelCollider’s position is not updated in playmode:
Position of WheelCollider Gizmo in runtime using a suspension distance of 0.15
Геометрия для коллизий
Так как машины могут развивать большую скорость, очень важен правильный подход к геометрии гоночного трека, используемой для определения столкновений. Например, меш-коллайдер не должен иметь выпуклостей или вмятин, которые служат для украшения видимой модели (например, столбы ограждения). Обычно меш-коллайдер для гоночного трека создают отдельно от видимого меша, делая его как можно плавнее. В нём также не должно быть тонких объектов — если у вас тонкий забор трека, сделайте его шире в меше-коллайдере (или полностью удалите внешнюю часть, если машина туда никогда не сможет добраться).
Visible geometry (left) is much more complex than collision geometry (right)
Кривые трения колеса
Трение шины может быть описано показанной ниже кривой трения колеса. Существуют отдельные кривые для прямого (вращение) и бокового направления колеса. В обоих направлениях сперва определяется то, как сильно скользит шина (на основании разности скоростей между резиной шины и дорогой). Затем значение скольжения используется для того, чтобы найти силу, применяемую шиной к точке соприкосновения.
Кривая принимает измеренное скольжение шины и выдаёт силу на выходе. Кривая аппроксимируется по двухсекционной линии. Первая секция идёт от (0, 0) до точки (ExtremumSlip, ExtremumValue), в которой касательная кривой равна нулю. Вторая секция идёт от (ExtremumSlip, ExtremumValue) до (AsymptoteSlip, AsymptoteValue), где касательная кривой вновь равна нулю:
Typical shape of a wheel friction curve
У настоящих шин есть свойство испытывать большие нагрузки при низком скольжении, так как резина компенсирует скольжение растягиванием. Далее, когда скольжение становится действительно большим, нагрузка снижается, т.к. шина начинает проскальзывать или крутиться. Поэтому кривые трения шин имеют форму аналогичную той, что представлена на изображении выше.