Unity: Столкновения машинок и препятствия (Урок 4)

Урок посвящен отслеживанию столкновений между машинками и добавлению препятствий. Улучшим механику столкновений, чтобы машинки реалистично реагировали на столкновения и не проникали друг в друга. Добавим новые препятствия, непроходимые для машинок.

Отслеживание столкновений между машинками

В текущей версии машинки ездят корректно, но при столкновении взаимодействие отсутствует, кроме взаимного отталкивания. Добавим отслеживание столкновений.

В скрипте CarController добавим метод OnCollisionEnter. Этот метод срабатывает при столкновении с твёрдым объектом. Параметром является объект collision, который назовём other.

void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("Car"))
    {
        isClicked = false;
    }
}

Код устанавливает флаг isClicked в false, останавливая движение машинки при столкновении с другой машинкой с тегом «Car. Решение не идеально, так как объекты всё равно немного отталкиваются.

Улучшим эффект, уменьшив размер коллайдера каждой машинки, сделав его меньше модели. Скопируем значения компонента коллайдера и применим их ко всем машинкам.

Использование триггеров для плавного взаимодействия

Для более плавного взаимодействия добавим к каждой машинке второй коллайдер – триггер. Триггеры не создают физического отталкивания, позволяя точнее контролировать взаимодействие.

Растянем триггер, сделав его больше основного коллайдера. Скопируем компонент триггера и применим его ко всем машинкам.

Изменим метод в скрипте на OnTriggerEnter, срабатывающий при активации триггера:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Car"))
    {
        isClicked = false;
    }
}

gameObject не нужен, так как Collider сам по себе является gameObject.

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

Улучшение логики столкновений и отталкивание

Даже с OnTriggerStay машинки могут смещаться. При столкновении будем слегка отталкивать машинку назад.

Добавим проверку на горизонтальное расположение машинок (Car.axis == Axis.Horizontal) и будем добавлять или вычитать значение к координате Z в зависимости от направления движения:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Car"))
    {
      if (Car.axis == Axis.Horizontal)
      {
        float adding = Car.direction == Direction.Left ? 0.5f : -0.5f;
        transform.position = new Vector3(transform.position.x, 0, transform.position.z + adding);
      }
      //Добавить аналогичную логику для вертикального расположения машин
    }
}

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

Добавление препятствий

Добавим препятствия, непроходимые для машинок. Создадим тег «Barrier» и добавим его к новым объектам-препятствиям. Добавим к препятствиям коллайдеры (Box Collider или Capsule Collider).

В скрипте добавим проверку на тег «Barrier» в метод OnTriggerEnter и применим логику отталкивания, аналогичную машинкам:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Car") || other.CompareTag("Barrier"))
    {
        //Логика отталкивания
    }
}

Теперь машинки не смогут проехать сквозь препятствия.

Управление на мобильных устройствах

Рассмотрим адаптацию кода для управления на мобильных устройствах. Вместо Input.mousePosition используем Input.GetTouch(0).position для получения координат касания. Код не будет работать в Unity Editor, но пригодится при портировании на мобильные платформы.

//Пример замены кода для мобильных устройств
Vector2 touchPosition = Input.GetTouch(0).position;
//Использование touchPosition.x и touchPosition.y вместо Input.mousePosition.x и Input.mousePosition.y

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

Что будем искать? Например,программа