Новый WheelCollider работает на базе PhysX3 Vehicles SDK, который представляет собой совершенно новую библиотеку для моделирования транспортных средств по сравнению с PhysX2.
Давайте пройдемся по процессу создания базового функционирующего автомобиля в Unity 5.0.
Начните с выбора GameObject -> 3D Object -> Plane. Это земля, по которой машина будет двигаться. Убедитесь, что земля имеет нулевое преобразование (Transform -> Reset) для простоты. Масштабируйте его, помещая что-то вроде 100 в компоненты масштаба Transform.
Давайте пройдемся по процессу создания базового функционирующего автомобиля в Unity 5.0.
Начните с выбора GameObject -> 3D Object -> Plane. Это земля, по которой машина будет двигаться. Убедитесь, что земля имеет нулевое преобразование (Transform -> Reset) для простоты. Масштабируйте его, помещая что-то вроде 100 в компоненты масштаба Transform.
Создайте базовый автомобильный каркас:
- Сначала добавьте GameObject в качестве корневого объекта автомобиля: GameObject -> Create Empty. Измените имя на
car_root
. - Добавьте компонент Physics 3D Rigidbody в
car_root
. Масса по умолчанию в 1 кг слишком мала для стандартных настроек подвески. Поменяй его на 1500 кг. - Теперь создайте коллайдер кузова: GameObject -> 3D Object -> Cube. Родительский ящик под
car_root
. Сбросьте преобразование, чтобы сделать его идеально выровненным в локальном пространстве. Так как наша машина будет ориентирована вдоль оси Z, масштабируйте прямоугольник вдоль оси Z, установив масштаб z на 3. - Добавьте корень колес. Выберите
car_root
и GameObject -> Создать пустого ребенка. Измените имя наwheels
. Сбросить преобразование на нем. Этот узел не является обязательным, но он для удобства настройки позже. - Создайте первое колесо: выберите
wheels
объект, GameObject -> Create Empty Child, и назовите егоfrontLeft
. Сбросить преобразование на нем. Установите положение на (–1, 0, 1). Добавьте физический компонент -> колесный коллайдер к колесу. - Дублируйте
frontLeft
объект (Cmd-D или Control-D). Измените положение x на 1. Измените имя наfrontRight
. - Выберите как
frontLeft
иfrontRight
объекты. Дублируйте их. Измените положение z обоих объектов на –1. Измените имена наrearLeft
иrearRight
соответственно. - Наконец, выберите
car_root
объект и, используя манипуляторы преобразования, поднимите его немного над землей.
Теперь вы должны увидеть что-то вроде этого:
![](../uploads/Main/WheelColliderTutorial.png)
Чтобы сделать этот автомобиль действительно управляемым, нам нужно написать для него контроллер. Давайте углубимся в некоторые сценарии:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SimpleCarController : MonoBehaviour {
public List<AxleInfo> axleInfos; // the information about each individual axle
public float maxMotorTorque; // maximum torque the motor can apply to wheel
public float maxSteeringAngle; // maximum steer angle the wheel can have
public void FixedUpdate()
{
float motor = maxMotorTorque * Input.GetAxis("Vertical");
float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
foreach (AxleInfo axleInfo in axleInfos) {
if (axleInfo.steering) {
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
if (axleInfo.motor) {
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
}
}
}
[System.Serializable]
public class AxleInfo {
public WheelCollider leftWheel;
public WheelCollider rightWheel;
public bool motor; // is this wheel attached to motor?
public bool steering; // does this wheel apply steer angle?
}
Просто поместите этот фрагмент на
car_root
объект, настройте параметры сценария, как показано ниже, и начните играть в режиме воспроизведения. Поиграйте с настройками. Те, что показаны ниже, работают довольно хорошо:
На одном экземпляре транспортного средства может быть до 20 колес, каждое из которых применяет рулевое управление, двигатель или тормозной момент.
Теперь перейдем к визуальным колесам. Как видно, WheelCollider не применяет смоделированную позицию и вращение колеса обратно к преобразованию WheelCollider. Поэтому добавление визуального колеса требует некоторых хитростей.
- Нам нужна геометрия колеса здесь. мы можем сделать простую форму колеса из цилиндра.
- Теперь может быть несколько подходов к добавлению визуальных колес: сделать так, чтобы нам пришлось вручную назначать визуальные колеса в свойствах скрипта, или написать некоторую логику для автоматического поиска соответствующего визуального колеса. Мы будем следовать второму подходу.
- Прикрепите визуальные колеса к объектам коллайдера.
- Теперь измените скрипт контроллера:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class AxleInfo {
public WheelCollider leftWheel;
public WheelCollider rightWheel;
public bool motor;
public bool steering;
}
public class SimpleCarController : MonoBehaviour {
public List<AxleInfo> axleInfos;
public float maxMotorTorque;
public float maxSteeringAngle;
// finds the corresponding visual wheel
// correctly applies the transform
public void ApplyLocalPositionToVisuals(WheelCollider collider)
{
if (collider.transform.childCount == 0) {
return;
}
Transform visualWheel = collider.transform.GetChild(0);
Vector3 position;
Quaternion rotation;
collider.GetWorldPose(out position, out rotation);
visualWheel.transform.position = position;
visualWheel.transform.rotation = rotation;
}
public void FixedUpdate()
{
float motor = maxMotorTorque * Input.GetAxis("Vertical");
float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
foreach (AxleInfo axleInfo in axleInfos) {
if (axleInfo.steering) {
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
if (axleInfo.motor) {
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
ApplyLocalPositionToVisuals(axleInfo.leftWheel);
ApplyLocalPositionToVisuals(axleInfo.rightWheel);
}
}
}
Одним из важных параметров компонента WheelCollider является forceAppPointDistance. Это расстояние от основания колеса покоя до точки, в которой к колесу прилагаются силы. Значение по умолчанию равно 0, что означает приложение сил к основанию колеса покоя, но на самом деле целесообразно, чтобы эта точка находилась где-то немного ниже центра масс автомобиля.
Комментариев нет:
Отправить комментарий