Простая машинка в Unity

Урок по созданию простой машинки в среде Unity при помощи компонента WheelCollider. Описаны базовые настройки этого компонента. Для понимания урока необходимы базовые знания среды Unity.

==Введение==
С английским у меня неплохо, поэтому когда понадобилось сделать машинку в проекте, хватило стандартного примера, однако, хоть и написано, что он «аркадный», все же пример затрагивает гораздо больше вопросов, и один только pdf документ весит 11 мб, а сам пример 212 мб.

08 | Простая машинка в Unity

От того примера сложилось впечатление, будто нам дали готовый проект, рассказали как менять параметры, чтобы можно было поиграться, но не стали особо объяснять, как его сделали шаг за шагом. Кроме того, он на английском, отсюда родился порыв сделать урок для GameDev.ru.

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




==Создаем по шагам==

1. Итак создадим четыре пустых объекта для удобной иерархии в нашем объекте:

    carRoot — контейнер для всех элементов машины (геометрия, свет, камеры, объекты для скриптов) car — контейнер для объектов именно машины, physic — контейнер для физических моделей колес, graphic — графические объекты.

01 | Простая машинка в Unity

2. Добавим в carRoot камеру и закинем на нее стандартный скрипт SmoothFollow, однако на 32 строке добавим или внешнюю переменную angle, или просто добавим поворот на 90 градусов, так как стандартный скрипт заставляет камеру быть сбоку от объекта :

wantedRotationAngle = target.eulerAngles.y+90;


02 | Простая машинка в Unity

3. в car добавляем компонент RigidBody, его масса — это масса корпуса машины, она будет влиять на устойчивость и на то, насколько сильно он прижимает колеса.

Для того чтобы на поворотах нас не сильно заносило, и при падении машина возвращалась в правильное положение, а не переворачивалась, нам потребуется два изменения — компонент ConstantForce в car, который будет прижимать машину на поворотах, кроме того, переместим центр массы машины вниз, добавив на нее скрипт carControl с кодом вроде этого:

gameObject.GetComponent(Rigidbody).centerOfMass = Vector3 (0, -высота_машинки*масштаб, 0);


03 | Простая машинка в Unity

4. В physic создаем пустой объект body с компонентом CapsuleCollider — это будет простой корпус машины, обтекаемый и не дающий застревать в стенках.

04 | Простая машинка в Unity

5. создаем пустой объект wheel_BL и добавляем ему компонент WheelCollider, и настраиваем его:

    Center — расположение колеса, Radius — радиус колеса, Suspension Distance — длинна пружин подвески. Suspension Spring : Spring — сила пружины подвески, чем выше тем сильнее пружинит, Suspension Spring : Damper — сила амортизатора, делает более плавным движение пружины. Mass — масса колес, опять же влияет на поведение на заносах, прыжках.

06 | Простая машинка в Unity

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

05 | Простая машинка в Unity

6. Раскопируем наше колесо до нужного числа, например, 4 — в принципе, машинка уже готова.

07 | Простая машинка в Unity

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

var WheelRight:GameObject;
var WheelLeft:GameObject;
var BackWheels:boolean;
var BackFront:boolean;
var WheelSpeed:float;
var WheelRpmMax:float;
private var WheelRotateAngle = 20;
gameObject.GetComponent(Rigidbody).centerOfMass = Vector3 (0, -0.6*2.3, 0);

function Update () {

if (Input.GetKeyDown ("w")) {
WheelRight.GetComponent (WheelCollider).motorTorque = WheelSpeed;
WheelLeft.GetComponent (WheelCollider).motorTorque = WheelSpeed;
}
if (Input.GetKeyUp("w")) {
WheelRight.GetComponent (WheelCollider).motorTorque = 0;
WheelLeft.GetComponent (WheelCollider).motorTorque = 0;
} 
if (Input.GetKeyDown ("s")) {
WheelRight.GetComponent (WheelCollider).motorTorque = -WheelSpeed;
WheelLeft.GetComponent (WheelCollider).motorTorque = -WheelSpeed;

}
if (Input.GetKeyUp("s")) {
WheelRight.GetComponent (WheelCollider).motorTorque = 0;
WheelLeft.GetComponent (WheelCollider).motorTorque = 0;
} 
if (Input.GetKeyDown ("a")) {
if(BackWheels){
WheelRight.transform.Rotate(0,-WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,-WheelRotateAngle,0);
}else{
WheelRight.transform.Rotate(0,WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,WheelRotateAngle,0);
}
}
if (Input.GetKeyUp ("a")) {
if(BackWheels){
WheelRight.transform.Rotate(0,WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,WheelRotateAngle,0);
}else{
WheelRight.transform.Rotate(0,-WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,-WheelRotateAngle,0);
}
}

if (Input.GetKeyDown ("d")) {
if(BackWheels){
WheelRight.transform.Rotate(0,WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,WheelRotateAngle,0);
}else{
WheelRight.transform.Rotate(0,-WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,-WheelRotateAngle,0);
}
}
if (Input.GetKeyUp ("d")) {
if(BackWheels){
WheelRight.transform.Rotate(0,-WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,-WheelRotateAngle,0);
}else{
WheelRight.transform.Rotate(0,WheelRotateAngle,0);
WheelLeft.transform.Rotate(0,WheelRotateAngle,0);
}
} 
}


==Заключение==

Собственно, теперь вы можете соорудить любое нечто на колесах, можно прикрепить две группы (подвески) по два колеса друг к другу джоинтами (как в этом уроке) или сделать вращение колес при развороте, как у танка. Широкий простор для креатива.

==Файлы==

Готовый пакет с префабом, описанной в уроке машинки (чтобы заработали фары машинки, нужно подключить пакет Projectors, но это не обязательно, можно и избавиться от того что у меня в графической части): CarSimple.unitypackage