C# Unity: Физика в играх (Rigidbody, Collider, Collision)

Перемещение объектов с помощью физики

В предыдущем уроке перемещение игрока осуществлялось изменением значений компонента Transform. Этот подход не всегда подходит, особенно при отслеживании столкновений. Для этого необходимо использовать физику и компонент Rigidbody.

Добавление Rigidbody и создание платформы

Основной игровой объект имеет Collider, но не обладает физическими свойствами. Добавим компонент Rigidbody. После запуска объект начнет падать под действием силы тяжести. Создадим платформу (Platform) размером 20×0.1×20 и немного опустим её, чтобы сфера (игрок) находилась над платформой. Переименуем сферу в Player и добавим ей материал для лучшей визуализации. Сфера падает на платформу и остается на ней. Демонстрируется перемещение объекта без использования физики.

Переход на куб и использование FixedUpdate

Заменим сферу на куб, изменив компонент Mesh Filter. Удалим код из метода Update, поскольку для работы с физикой будем использовать FixedUpdate. FixedUpdate вызывается через равные промежутки времени, что оптимально для физических расчетов.

Перемещение с помощью Rigidbody

Создадим переменные для хранения данных о нажатии клавиш со стрелками:

float horizontalSpeed = 10f;
float verticalSpeed = 10f;

Получим данные о нажатии клавиш с помощью Input.GetAxis:

float horizontalInput = Input.GetAxis("Horizontal") * horizontalSpeed * Time.fixedDeltaTime;
float verticalInput = Input.GetAxis("Vertical") * verticalSpeed * Time.fixedDeltaTime;

Создадим публичное поле для ссылки на Rigidbody:

public Rigidbody rb;

В методе Awake получим компонент Rigidbody:

void Awake() {
    rb = GetComponent<Rigidbody>();
}

В FixedUpdate изменим скорость объекта:

rb.velocity = new Vector3(-horizontalInput, rb.velocity.y, verticalInput);

Заморозим вращение объекта, установив ограничения в компоненте Rigidbody -> Constraints.

Отслеживание столкновений

Добавим куб (Block), увеличим его размер и изменим цвет. Для отслеживания столкновений объект должен иметь Collider и Rigidbody (для игрока). Для Block достаточно Collider.

В скрипте MovePlayer добавим метод OnCollisionEnter:

void OnCollisionEnter(Collision collision) {
    if (collision.gameObject.name == "Block") {
        Debug.Log("Collision with Block detected");
        rb.AddForce(Vector3.up * 500f);
    }
}

Этот метод вызывается при каждом столкновении с твердым объектом. При столкновении с объектом Block игрок будет отталкиваться вверх.

Обработка столкновений: OnCollisionStay и OnCollisionExit

Метод OnCollisionStay вызывается постоянно во время столкновения, а OnCollisionExit – по его окончании.

Отслеживание столкновений с триггерами

Создадим куб (TriggerMain), добавим ему Box Collider и установим флажок Is Trigger. Теперь можно проходить сквозь него. Обычно для триггеров скрывают Renderer.

Для триггеров используются методы OnTriggerEnter, OnTriggerStay и OnTriggerExit. В OnTriggerEnter и OnTriggerStay выведем сообщения, а в OnTriggerExit – удалим игрока:

void OnTriggerEnter(Collider other) {
    if (other.gameObject.name == "TriggerMain") {
        Debug.Log("Trigger enter");
    }
}

void OnTriggerStay(Collider other) {
    if (other.gameObject.name == "TriggerMain") {
        Debug.Log("Trigger stay");
    }
}

void OnTriggerExit(Collider other) {
    if (other.gameObject.name == "TriggerMain") {
        Debug.Log("Trigger exit");
        Destroy(gameObject);
    }
}

Мы научились перемещать объекты с помощью физики, отслеживать столкновения с твердыми объектами и триггерами. Использование Rigidbody, Collider и соответствующих методов позволяет создавать сложные и реалистичные взаимодействия в играх Unity.

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