Объявление
public static RaycastHit[] CapsuleCastAll(Vector3 point1, Vector3 point2, float radius, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);Параметры
point1 | Центр сферы в start капсулы. |
point2 | Центр сферы на end капсулы. |
radius | Радиус капсулы. |
direction | Направление, в котором следует перемещать капсулу. |
maxDistance | Максимальная длина развертки. |
layermask | Маска слоя, которая используется для выборочного игнорирования коллайдеров при использовании капсулы. |
queryTriggerInteraction | Указывает, должен ли этот запрос вызывать триггеры.. |
Возвращает
RaycastHit[] Массив всех коллайдеров попал в развертку.
Описание
То же, что и Physics.CapsuleCast, но эта функция возвращает все совпадения, которые пересекает развертка капсулы.
Применяет капсулу ко всем коллайдерам в сцене и возвращает подробную информацию о каждом коллайдере, с которым произошло столкновение.
Капсула определяется двумя сферами с radius
вокруг point1
и point2
, которые образуют два конца капсулы.
Попадания возвращаются всем коллайдерам, которые столкнулись бы с этой капсулой, если бы капсула была перемещена в direction
. Это полезно, когда Raycast не дает достаточной точности, потому что вы хотите узнать, сможет ли объект определенного размера, например персонаж, двигаться куда-то, не сталкиваясь ни с чем на пути.
Примечания. Для коллайдеров, перекрывающих капсулу в начале развертки, RaycastHit.normal устанавливается напротив направления развертки, RaycastHit.distance устанавливается равным нулю, и нулевой вектор возвращается в RaycastHit.point. Возможно, вы захотите проверить, так ли это в вашем конкретном запросе, и выполнить дополнительные запросы для уточнения результата. Передача нулевого радиуса приводит к неопределенным результатам и не всегда ведет себя так же, как Physics.Raycast.
Смотрите так же: Physics.SphereCast, Physics.CapsuleCast, Physics.Raycast, Rigidbody.SweepTest.
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
void Update()
{
RaycastHit[] hits;
CharacterController charCtrl = GetComponent<CharacterController>();
Vector3 p1 = transform.position + charCtrl.center + Vector3.up * -charCtrl.height * 0.5F;
Vector3 p2 = p1 + Vector3.up * charCtrl.height;
// Бросьте фигуру контроллера персонажа на 10 метров вперед, чтобы увидеть, не ударит ли он что-нибудь
hits = Physics.CapsuleCastAll(p1, p2, charCtrl.radius, transform.forward, 10);
// Изменить материал всех ударных коллайдеров
// чтобы использовать прозрачный шейдер
for (int i = 0; i < hits.Length; i++)
{
RaycastHit hit = hits[i];
Renderer rend = hit.transform.GetComponent<Renderer>();
if (rend)
{
rend.material.shader = Shader.Find("Transparent/Diffuse");
Color tempColor = rend.material.color;
tempColor.a = 0.3F;
rend.material.color = tempColor;
}
}
}
}