Чтобы физическое поведение было правдоподобной, объект в игре нужно правильно ускорить и задействовать столкновения, гравитацию и другие силы. Встроенный в 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}");
}
}
}