Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

Создайте автомобиль с коллайдерами колес

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

Эти шаги включают:

  1. Подготовка проекта
  2. Подготовка модели автомобиля
  3. Добавить коллайдеры колеси установить их положение и радиус
  4. Добавить скрипты для управления поведением автомобиля, включая движение автомобиля и вращение колес
  5. Проверка автомобиля

Подготовка проекта

Для выполнения этих инструкций вам необходимо:

  • Новая пустая сцена
  • Демонстрационная модель автомобиля (скачать: car.fbx), импортированная в открытый проект
  • Поверхность грунта, по которой должен передвигаться автомобиль.

Чтобы создать поверхность грунта:

  1. Создайте плоскость GameObject и переименуйте ее в Ground. Эта плоскость является землей, на которой движется автомобиль.
  2. Установите его положение на (0,0,0), а масштаб на (100,1,100).

Подготовка модели автомобиля

Во-первых, поместите модель автомобиля в Scene:

  1. В окне Project выберите импортированный ресурс Car.
  2. Извлеките текстуры модели автомобиля, чтобы Unity мог отобразить их в Scene. Для этого перейдите в Параметры импорта в окне Inspector и выполните следующие действия:
    1. Выбрать Материалы
    2. Выберите Текстуры > Extract Textures. В открывшемся просмотрщике файлов сохраните их в папку Assets (расположение по умолчанию).
    3. Выберите Применить.
  3. Поместите ассет Автомобиль в Scene, на или чуть выше плоскости Земли.

Посмотрите на иерархию автомобиля GameObject в окне Hierarchy. Существует корень GameObject, называемый Car, и дочерний GameObjects для модели кузова автомобиля и каждой модели колеса.

Конфигурация кузова транспортного средства для столкновения:

  1. На корне Car GameObject добавьте компонент Rigidbody.
  2. Установите Массу для Rigidbody на `1500``. Это значение определяет вес автомобиля в килограммах. Это подходящий вес для стандартных настроек подвески коллайдера колес. Более подробную информацию см. в Подвеска коллайдера колес: Значения массы и подвески.
  3. В отношении Car Body GameObject, добавить Коллайдер Mesh компонент.
  4. На новом компоненте коллайдера Mesh включите Выпуклость.

Добавить коллайдеры колес

Чтобы добавить коллайдеры колес к моделям колес, необходимо создать четыре новых отдельных GameObjects в том же месте, что и модели колес (но не как дочерние GameObjects колес).

Быстрый способ установить это примерно в том же положении — это дублировать колесо GameObjects и затем настроить новое GameObject:

  1. Выберите все четыре колеса GameObjects.
  2. Дублировать GameObjects (Ctrl/Cmd+D).
  3. Выберите все четыре дубликатов и выполните следующие действия:
    1. Удаление компонентов отображения сетки и сеточного фильтра
    2. Добавить компонент коллайдера колес
  4. Переименуйте новый коллайдер колес GameObjects. По умолчанию Unity дает дубликат GameObjects то же имя и добавляет число в скобках; например, Wheel Back Left (1). Для ясности добавьте слово “Collider” к имени GameObject; например, Wheel Back Left collider.

Иерархия Car GameObject теперь должна выглядеть следующим образом:

Корневой автомобиль GameObject и все дочерние GameObjects, включая автомобильный кузов, четырехколесную модель GameObjects и четырехколесный коллайдер GameObjects.
Корневой автомобиль GameObject и все дочерние GameObjects, включая автомобильный кузов, четырехколесную модель GameObjects и четырехколесный коллайдер GameObjects.

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

Когда вы выбираете коллайдер колес, в представлении Scene отображается гаджета, который предоставляет визуализацию настроек коллайдера колес (см. Визуализация коллайдера колес). Вы можете использовать гаджеты для проверки положения и размера коллайдера колес по отношению к положению и размеру модели колеса.

Чтобы лучше увидеть ориентацию колеса и гаджета, установите режим рисования Scene на Проволочная схема и ориентацию Scene на Isometric.

Установить положение коллайдера колес

При первом добавлении колесных коллайдеров с помощью рабочего процесса, описанного в Добавить коллайдеры колес, они слишком низкие (в Scene колеса, круг коллайдера колес появляется под сеткой модели колеса). Это потому, что Расстояние подвеса начинается от этих GameObjects’ и выдвигается вниз на расстояние, указанное в пункте 2.1.1. Расстояние подвеса установки. Scene вид визуализации отображает Расстояние подвеса как оранжевая линия вниз по оси Y гаджета коллайдера колеса.

Контур зеленого круга отображает колесо в середине расстояния подвески, и должен рассматриваться как нормальное положение колеса, когда автомобиль не сжат вниз или поднят на его подвеске. Поэтому зеленый контур каждого колеса коллайдера должен быть центрирован над его соответствующей колесной сетки.

Гизмо коллайдера колес указывает на положение коллайдера колес по отношению к модели колеса. На этом изображении коллайдер колес слишком большой и слишком низкий.
Гизмо коллайдера колес указывает на положение коллайдера колес по отношению к модели колеса. На этом изображении коллайдер колес слишком большой и слишком низкий.

Чтобы исправить это, вам нужно переместить WheelCollider GameObjects вверх (по оси Y) на половину величины колесного коллайдера Расстояние подвесаВ этом примере проекта Расстояние подвеса является 0.3 (значение по умолчанию), так что вам нужно переместить коллайдер колеса GameObjects до 0.15 единиц.

Unity позволяет вводить простые математические вычисления в числовые поля. Вы можете использовать это для добавления значения на оси Y.

  1. Выберите все четыре колеса коллайдер GameObjects.
  2. В Inspector перейдите к свойству Позиция Transform.
  3. В значении оси Y разместите курсор в конце значения. Добавьте +0.15 в конце значения (например, если значение 0.5, значение теперь должно быть 0.5+0.15).
  4. Нажмите клавишу Return.

Unity применяет +0.15 к предыдущему значению, что перемещает коллайдер колес GameObjects вверх по оси Y на 0.15 единиц.

Гаджет коллайдера колес теперь должен быть идеально центрирован на мешах колес:

Гизмо коллайдера колес указывает положение коллайдера колес по отношению к модели колеса. На этом изображении коллайдер колес правильно центрирован в модели колеса.
Гизмо коллайдера колес указывает положение коллайдера колес по отношению к модели колеса. На этом изображении коллайдер колес правильно центрирован в модели колеса.

Установить радиус коллайдера колеса

Когда вы впервые добавляете коллайдеры колес с помощью рабочего процесса, описанного в Добавить коллайдеры колес, они слишком большие (в представлении Scene гаджета коллайдера колес больше сетки модели колеса).

Чтобы точно исправить это, вам нужно знать точный радиус модели колеса. Эта информация должна быть доступна в вашем 3D программном обеспечении для моделирования, или у технического художника, который создал модель.

В этом примере радиус модели колеса составляет 0,44.

  1. Выберите все четыре колеса коллайдер GameObjects
  2. В Inspector перейдите в свойство Радиус компонента Wheel collider
  3. Установите радиус с на 0.44.

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

Чтобы получить радиус с помощью коллайдера Сфера:

  1. Выберите любую модель колеса GameObject.
  2. Добавить коллайдер Сфера.
  3. Обратите внимание на значение свойства Радиус коллайдера Сфера.
  4. Удалить коллайдер Сфера.
  5. Выберите все четыре колеса коллайдер GameObjects.
  6. В Inspector перейдите в свойство Радиус компонента Wheel collider.
  7. Установите радиус коллайдера колеса радиус на зарегистрированное значение радиуса коллайдера сферы радиус.

Коллайдеры колес теперь должны точно соответствовать положению и размеру моделей колес.

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

Добавление скриптов для управления поведением автомобиля

Чтобы управлять автомобилем, вам нужно добавить в проект скрипты, которые выполняют следующие действия:

  • Управление движением автомобиля: Отправка значений поворота руля, крутящего момента и тормоза на коллайдеры колес на основе ввода пользователя.
  • Управление движением колес: перемещение и поворот мешей колёс в соответствии с состоянием каждого Wheel Collider.

В этом примере мы используем для этого два скрипта: CarControl.cs и WheelControl.cs.

Добавить управление для движения автомобиля

Создайте файл C# с именем CarControl.csи вставьте в него код, приведенный ниже:

using UnityEngine;
using UnityEngine.InputSystem;

public class CarControl : MonoBehaviour
{
    [Header("Car Properties")]
    public float motorTorque = 2000f;
    public float brakeTorque = 2000f;
    public float maxSpeed = 20f;
    public float steeringRange = 30f;
    public float steeringRangeAtMaxSpeed = 10f;
    public float centreOfGravityOffset = -1f;

    private WheelControl[] wheels;
    private Rigidbody rigidBody;
    
    [Header("Input Actions")]
    public InputActionReference moveAction;

    private void OnEnable()
    {
        moveAction.action.Enable();
    }

    private void OnDisable()
    {
        moveAction.action.Disable();
    }

    // Start is called before the first frame update
    void Start()
    {
        rigidBody = GetComponent<Rigidbody>();

        // Adjust center of mass to improve stability and prevent rolling
        Vector3 centerOfMass = rigidBody.centerOfMass;
        centerOfMass.y += centreOfGravityOffset;
        rigidBody.centerOfMass = centerOfMass;

        // Get all wheel components attached to the car
        wheels = GetComponentsInChildren<WheelControl>();
    }

    // FixedUpdate is called at a fixed time interval 
    void FixedUpdate()
    {
        // Get player input for acceleration and steering
        float vInput = moveAction.action.ReadValue<Vector2>().y; // Forward/backward input
        float hInput = moveAction.action.ReadValue<Vector2>().x; // Steering input

        // Calculate current speed along the car's forward axis
        float forwardSpeed = Vector3.Dot(transform.forward, rigidBody.linearVelocity);
        float speedFactor = Mathf.InverseLerp(0, maxSpeed, Mathf.Abs(forwardSpeed)); // Normalized speed factor

        // Reduce motor torque and steering at high speeds for better handling
        float currentMotorTorque = Mathf.Lerp(motorTorque, 0, speedFactor);
        float currentSteerRange = Mathf.Lerp(steeringRange, steeringRangeAtMaxSpeed, speedFactor);

        // Determine if the player is accelerating or trying to reverse
        bool isAccelerating = Mathf.Sign(vInput) == Mathf.Sign(forwardSpeed);

        foreach (var wheel in wheels)
        {
            // Apply steering to wheels that support steering
            if (wheel.steerable)
            {
                wheel.WheelCollider.steerAngle = hInput * currentSteerRange;
            }

            if (isAccelerating)
            {
                // Apply torque to motorized wheels
                if (wheel.motorized)
                {
                    wheel.WheelCollider.motorTorque = vInput * currentMotorTorque;
                }
                // Release brakes when accelerating
                wheel.WheelCollider.brakeTorque = 0f;
            }
            else
            {
                // Apply brakes when reversing direction
                wheel.WheelCollider.motorTorque = 0f;
                wheel.WheelCollider.brakeTorque = Mathf.Abs(vInput) * brakeTorque;
            }
        }
    }
}

Добавить управление для движения автомобиля с пакетом Input System

Если вы используете пакет Input System, вместо этого следуйте приведённым ниже рекомендациям. Сначала необходимо создать и настроить Input Actions в пакете Input System от Unity:

  1. В Unity перейдите в Ассеты > Создать > Вводные действия и назвать его CarInputActions.
  2. Двойной щелчок, чтобы открыть его в редакторе действий ввода.
  3. Создайте новую карту действий под названием Car (или любым другим именем, которое вы предпочитаете).

В карте действий Car добавьте следующие действия:

  1. Добавить новое Действие под названием “Движение”. Установите Тип Действия на Значение, и Тип Управления на Вектор 2.
  2. Щелкните правой кнопкой мыши Движение и выберите Сложить Вверх/Вниз/Влева/Вправо.
  3. Для конфигурации WASD установите Вверх до В, Вниз до С, Лево до Аи Право до D.

Наконец, сохраните конфигурацию и сформируйте класс C# из ассета действий:

  1. В редакторе действий ввода выберите Save Asset.
  2. Выберите ассет CarInputActions.
  3. В окне Inspector выберите Создать класс C#.

Создайте файл C# с именем CarControl.csи вставьте в него код, приведенный ниже:

using UnityEngine;

public class CarControl : MonoBehaviour
{
    [Header("Car Properties")]
    public float motorTorque = 2000f;
    public float brakeTorque = 2000f;
    public float maxSpeed = 20f;
    public float steeringRange = 30f;
    public float steeringRangeAtMaxSpeed = 10f;
    public float centreOfGravityOffset = -1f;

    private WheelControl[] wheels;
    private Rigidbody rigidBody;

    private CarInputActions carControls; // Reference to the new input system

    void Awake()
    {
        carControls = new CarInputActions(); // Initialize Input Actions
    }
    void OnEnable()
    {
        carControls.Enable();
    }

    void OnDisable()
    {
        carControls.Disable();
    }
    
    // Start is called before the first frame update
    void Start()
    {
        rigidBody = GetComponent<Rigidbody>();

        // Adjust center of mass to improve stability and prevent rolling
        Vector3 centerOfMass = rigidBody.centerOfMass;
        centerOfMass.y += centreOfGravityOffset;
        rigidBody.centerOfMass = centerOfMass;

        // Get all wheel components attached to the car
        wheels = GetComponentsInChildren<WheelControl>();
    }
            
    // FixedUpdate is called at a fixed time interval
    void FixedUpdate()
    {
        // Read the Vector2 input from the new Input System
        Vector2 inputVector = carControls.Car.Movement.ReadValue<Vector2>();

        // Get player input for acceleration and steering
        float vInput = inputVector.y; // Forward/backward input
        float hInput = inputVector.x; // Steering input
        
        // Calculate current speed along the car's forward axis
        float forwardSpeed = Vector3.Dot(transform.forward, rigidBody.linearVelocity);
        float speedFactor = Mathf.InverseLerp(0, maxSpeed, Mathf.Abs(forwardSpeed)); // Normalized speed factor

        // Reduce motor torque and steering at high speeds for better handling
        float currentMotorTorque = Mathf.Lerp(motorTorque, 0, speedFactor);
        float currentSteerRange = Mathf.Lerp(steeringRange, steeringRangeAtMaxSpeed, speedFactor);

        // Determine if the player is accelerating or trying to reverse
        bool isAccelerating = Mathf.Sign(vInput) == Mathf.Sign(forwardSpeed);

        foreach (var wheel in wheels)
        {
            // Apply steering to wheels that support steering
            if (wheel.steerable)
            {
                wheel.WheelCollider.steerAngle = hInput * currentSteerRange;
            }

            if (isAccelerating)
            {
                // Apply torque to motorized wheels
                if (wheel.motorized)
                {
                    wheel.WheelCollider.motorTorque = vInput * currentMotorTorque;
                }
                // Release brakes when accelerating
                wheel.WheelCollider.brakeTorque = 0f;
            }
            else
            {
                // Apply brakes when reversing direction
                wheel.WheelCollider.motorTorque = 0f;
                wheel.WheelCollider.brakeTorque = Mathf.Abs(vInput) * brakeTorque;
            }
        }
    }
}

Добавьте этот скрипт CarControl.cs в корень Car GameObject.

Скрипт CarControl.cs управляет поведением автомобиля, таким как ускорение, крутящий момент и торможение, на основе ввода пользователя. Подробнее см. в комментариях к коду.

Некоторые элементы скрипта CarControl.cs относятся к скрипту WheelControl.cs, созданному в следующем разделе.

Добавить управление для движения колес

Создайте файл C# с именем WheelControl.csи вставьте в него код, приведенный ниже:

using UnityEngine;

public class WheelControl : MonoBehaviour
{
    public Transform wheelModel;

    [HideInInspector] public WheelCollider WheelCollider;

    // Create properties for the CarControl script
    // (You should enable/disable these via the 
    // Editor Inspector window)
    public bool steerable;
    public bool motorized;

    Vector3 position;
    Quaternion rotation;

    // Start is called before the first frame update
    private void Start()
    {
        WheelCollider = GetComponent<WheelCollider>();
    }

    // Update is called once per frame
    void Update()
    {
        // Get the Wheel collider's world pose values and
        // use them to set the wheel model's position and rotation
        WheelCollider.GetWorldPose(out position, out rotation);
        wheelModel.transform.position = position;
        wheelModel.transform.rotation = rotation;
    }
}

Добавьте этот скрипт к каждому коллайдеру колес GameObject.

Скрипт WheelControl.cs использует WheelCollider.GetWorldPose для получения позиции коллайдера колес в сцене. Затем скрипт присваивает эту информацию о позиции указанной модели колес GameObject. Подробнее см. в комментариях к коду.

Каждый экземпляр скрипта WheelControl.cs должен иметь ссылку на соответствующую модель колеса GameObject.

Чтобы назначить правильную модель колеса GameObject каждому коллайдеру колес:

  1. Выберите коллектор колес GameObject
  2. В окне Inspector перейдите к компоненту Wheel Control, созданному скриптом
  3. Установить модель колеса Модель на соответствующую модель колеса GameObject (например, на «коллайдере заднего левого колеса» GameObject назначить модель колеса «заднего левого колеса» GameObject):
  4. Эта процедура повторяется для каждого колесного коллайдера.

Вы также должны выбрать, какие колеса получают ввод двигателя и ввод рулевого управления из скрипта CarControl. Чтобы симулировать автомобиль с четырехколесным приводом с помощью свойств Wheel Control:

  1. На всех четырех колес коллайдер GameObjects, включить моторизованный.
  2. На двух передних колес коллайдер GameObjects, включить управляемые.

Испытание автомобиля

Для тестирования автомобиля, перейдите в режим Игра и используйте стрелки или WASD клавиши для перемещения и управления. Обратите внимание, что ввод управления работает только тогда, когда Game вид имеет фокус.

Чтобы получить лучшее представление о автомобиле, движущемся вокруг Scene:

  1. Расположите окна Редактора таким образом, чтобы одновременно были видны представления Scene и Game.
  2. Блокировка фокуса представления Scene на автомобиле. Чтобы сделать это, выберите корень Car GameObject в представлении Scene, затем нажмите Shift + F.

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