Физика. Какие компоненты позволяют работать с физикой. Что такое rigid body? Что такое рейкаст? Отличие от лайнкаста?

Чтобы физическое поведение было правдоподобной, объект в игре нужно правильно ускорить и задействовать столкновения, гравитацию и другие силы. Встроенный в Unity физические движки обеспечивают вас компонентами для обработки симуляции физики. С помощью настройки всего нескольких параметров, можно создать объекты, которые ведут себя пассивно реалистично (т.е., они будут перемещены в результате столкновений и падений, но не начнут двигаться сами по себе). Управляя физикой из скриптов, вы можете придать объекту динамику автомобиля, машины или даже подвижного куска ткани. На этой странице рассматриваются основные компоненты физики в Unity со ссылками для дальнейшего чтения.

Примечание: На самом деле в Unity есть два отдельных физических движка, один для 3D физики и один для 2D физики. Основные понятия идентичны в обоих движках (за исключением дополнительного измерения в 3D), но они реализованы с разными компонентами. Так, например, существует компонент Rigidbody для 3D физики и аналогичный Rigidbody 2D для 2D физики.

Collider

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

Самые простые (и наименее ресурсоемкие) коллайдеры относятся к примитивным типам коллайдеров. В 3D это Box Collider, Sphere Collider и Capsule Collider. В 2D вы можете использовать Box Collider 2D и Circle Collider 2D. Вы можете добавить любое их количество к одному игровому объекту для создания составных коллайдеров.

Raycast

Raycast это некоторый луч, испускаемый из некоторого объекта в некотором направлении некоторой длины (либо бесконечный) для определения коллизий (столкновений) с объектами. После испускания луча мы получаем объект (либо массив объектов если используем Physics.RaycastAll), с которыми он столкнулся и далее можем определить попали ли в нужный нам объект. Часто используется в стрельбе

using UnityEngine;
/// <summary>
/// Use example for Raycast method.
/// </summary>
public class RayExample : MonoBehaviour
{
    /// <summary>
    /// Called each physics frame.
    /// </summary>
    private void FixedUpdate()
    {
        Ray ray = new Ray(transform.position, transform.forward); // Defines ray
        RaycastHit hitResult; // Stores the result
        // Call Raycast
        if (Physics.Raycast(ray, out hitResult)) {
            Debug.Log($"Raycast hitted: {hitResult.collider.name}");
        }
    }
}

Linecast

Метод Linecast очень похож на метод Raycast.

Разница между ними заключается в определении. В Raycast мы определяем начальную позицию и направление. В Linecast мы определяем начальную и конечную позиции.

Этот метод проверяет, есть ли что-то между этими двумя точками.

using UnityEngine;
/// <summary>
/// Use example for Linecast method.
/// </summary>
public class LineExample : MonoBehaviour
{
    /// <summary>
    /// Called each physics frame.
    /// </summary>
    private void FixedUpdate()
    {
        Vector3 startPosition = transform.position; // Line begin
        Vector3 endPosition = startPosition + Vector3.right * 10; // Line end
        RaycastHit hitResult; // Stores the result
        // Call Linecast
        if (Physics.Linecast(startPosition, endPosition, out hitResult))
        {
            Debug.Log($"Linecast hitted: {hitResult.collider.name}");
        }
    }
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *