Physics.CapsuleCast
Declaration
public static bool CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);Параметры
| Параметр | Описание |
|---|---|
| point1 | Центр сферы в start капсулы. |
| point2 | Центр сферы в end капсулы. |
| радиус | Радиус капсулы. |
| направление | Направление, в котором должна перемещаться капсула. |
| maxDistance | Максимальная длина развертки. |
| layerMask | Маска слоя Маска слоя, которая используется для выборочной фильтрации коллайдеров, которые рассматриваются при отливке капсулы. |
| queryTriggerInteraction | Указывает, должен ли этот запрос вызывать триггеры. |
Возвращаемое значение
логическое True, если капсула пересекает любой коллайдер, в противном случае false.
Описание
Бросает капсулу на все коллайдеры в Scene и возвращает подробную информацию о том, что попало.
Капсула определяется двумя сферами с radius вокруг point1 и point2, которые образуют два конца капсулы. Поиски возвращаются для первого коллайдера, который столкнется с этой капсулой, если капсула будет перемещена вдоль direction. Это полезно, когда Raycast не дает достаточной точности, потому что вы хотите узнать, сможет ли объект определенного размера, например, персонаж, переместиться куда-то без столкновения с чем-либо на пути.
Примечания: CapsuleCast не будет обнаруживать коллайдеры, для которых капсула перекрывает коллайдер. Передача нулевого радиуса приводит к неопределенному выходу и не всегда ведет себя так же, как Physics.Raycast.
Дополнительные ресурсы: Physics.SphereCast, Physics.CapsuleCastAll, Physics.Raycast, Rigidbody.SweepTest.
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { void Update() { RaycastHit hit; CharacterController charContr = GetComponent<CharacterController>(); Vector3 p1 = transform.position + charContr.center + Vector3.up * -charContr.height * 0.5F; Vector3 p2 = p1 + Vector3.up * charContr.height; float distanceToObstacle = 0;
// Cast character controller shape 10 meters forward to see if it is about to hit anything. if (Physics.CapsuleCast(p1, p2, charContr.radius, transform.forward, out hit, 10)) distanceToObstacle = hit.distance; } }
Declaration
public static bool CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);Параметры
| Параметр | Описание |
|---|---|
| point1 | Центр сферы в start капсулы. |
| point2 | Центр сферы в end капсулы. |
| радиус | Радиус капсулы. |
| направление | Направление, в котором должна перемещаться капсула. |
| maxDistance | Максимальная длина развертки. |
| hitInfo | Если вернётся true, hitInfo будет содержать больше информации о месте удара коллайдера. (Дополнительные ресурсы: RaycastHit). |
| layerMask | Маска слоя Маска слоя, которая используется для выборочной фильтрации коллайдеров, которые рассматриваются при отливке капсулы. |
| queryTriggerInteraction | Указывает, должен ли этот запрос вызывать триггеры. |
Возвращаемое значение
логическое True, если капсула пересекает любой коллайдер, в противном случае false.
Описание
Бросает капсулу вдоль луча и сообщает о первом попадании в коллайдер. Помимо проверки на столкновения, эта перегрузка предоставляет подробную информацию о попадании в коллайдер через параметр out RaycastHit hitInfo. Капсула определяется двумя сферами radius, центрированными на point1 и point2. Они определяют начало и конец оси капсулы. Затем капсула перемещается в direction на максимальное расстояние maxDistance. Это особенно полезно, когда вы хотите симулировать движение объемного объекта (например, персонажа или транспортного средства) и нужно определить, где, что и как он ударился о что-то.
using UnityEngine;
public class CapsuleCastExample : MonoBehaviour { public Transform pointStart; public Transform pointEnd; public float radius = 0.5f; public float maxDistance = 10f;
void Update() { RaycastHit hit; Vector3 direction = transform.forward;
if (Physics.CapsuleCast(pointStart.position, pointEnd.position, radius, direction, out hit, maxDistance)) { Debug.Log("Hit: " + hit.collider.name + " at " + hit.point); } } }