Перемещение объектов с помощью физики
В предыдущем уроке перемещение игрока осуществлялось изменением значений компонента 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.