Menu
CoddyTech

Разрушение при столкновении

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 10 из 71.

Насколько сильным был удар? collision.relativeVelocity показывает, с какой скоростью два объекта сближались друг с другом в момент столкновения, а его magnitude — это скорость удара в м/с. Это разность скоростей: автомобиль, движущийся со скоростью 10 м/с и врезающийся в автомобиль, который едет в том же направлении со скоростью 8 м/с, ударяет его всего на скорости 2 м/с, и оба автомобиля фиксируют одинаковую скорость удара.

Это яйцо разбивается, если приземляется быстрее, чем со скоростью crackSpeed. При падении с высоты 1 м оно ударяется со скоростью около 4,4 м/с (квадратный корень из 2 x 9.81 x 1), а с высоты 2 м — около 6,3 м/с:

public float crackSpeed = 5f;

void OnCollisionEnter(Collision collision)
{
    if (collision.relativeVelocity.magnitude > crackSpeed)
    {
        Debug.Log("Splat!");
        Destroy(gameObject);
    }
}

Почему не использовать собственную rb.linearVelocity яйца? К моменту вызова OnCollisionEnter физика уже обработала удар, поэтому скорость яйца — это то, что осталось после него, то есть она близка к нулю. relativeVelocity сохраняет скорость самого удара. Это скорость, поэтому масса роли не играет: тяжёлое и лёгкое яйцо, приземлившиеся со скоростью 6 м/с, показывают одно и то же значение — 6.

challenge icon

Задание

Легко

Напиши Window.cs: каждый удар ослабляет окно, а при значении 0 оно разбивается.

  1. В OnCollisionEnter окна вычитай collision.relativeVelocity.magnitude из strength.
  2. Когда strength <= 0f, вызови Destroy(gameObject);.

Нажми «Играть», запускай мягкие шары клавишей со стрелкой вверх, затем сильный шар клавишей Space: окно разобьётся. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Window : MonoBehaviour
{
    public float strength = 10f;

    // При каждом ударе скорость столкновения вычитается из strength; когда strength достигает 0, окно разбивается
}

Все уроки раздела Физика и игровой процесс

Потренируйтесь самостоятельно: Песочница Unity