Physics.RaycastNonAlloc
Declaration
public static int RaycastNonAlloc(Ray ray, RaycastHit[] results, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);Параметры
| Параметр | Описание |
|---|---|
| луч | Начальная точка и направление луча. |
| результаты | Буфер для хранения запросов. |
| maxDistance | Максимальное расстояние, на котором может находиться удар по лучу от начала луча. |
| layerMask | Маска слоя Маска слоя, которая используется для выборочного фильтрования коллайдеров, рассматриваемых при создании луча. |
| queryTriggerInteraction | Указывает, должен ли этот запрос вызывать триггеры. |
Возвращаемое значение
инт Количество запросов, хранящихся в буфере results.
Описание
Пропускает луч через Scene и хранит попадания в буфере.
Как и Physics.RaycastAll, но не генерирует мусора.
Запрос raycast заканчивается, когда больше нет попаданий и/или буфер результатов заполнен. Порядок результатов не определен. Когда возвращается полный буфер, не гарантируется, что результаты будут ближайшими попаданиями, и возвращается длина буфера. Если передан нулевой буфер, то не возвращается никаких результатов и не возникает никаких ошибок или исключений.
Declaration
public static int RaycastNonAlloc(Vector3 origin, Vector3 direction, RaycastHit[] results, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);Параметры
| Параметр | Описание |
|---|---|
| происхождение | Начальная точка и направление луча. |
| результаты | Буфер для хранения запросов. |
| направление | Направление луча. |
| maxDistance | Максимальное расстояние, на котором может находиться удар по лучу от начала луча. |
| queryTriggerInteraction | Указывает, должен ли этот запрос вызывать триггеры. |
| layerMask | Маска слоя Маска слоя, которая используется для выборочного фильтрования коллайдеров, рассматриваемых при создании луча. |
Возвращаемое значение
инт Количество запросов, хранящихся в буфере results.
Описание
Пропускает луч через Scene и хранит попадания в буфере.
using UnityEngine;
public class RaycastFanNonAlloc : MonoBehaviour { public int rayCount = 10; // Number of rays in the fan public float angle = 60f; // Total spread angle in degrees public float maxDistance = 20f; // Ray length
// The size of the array determines how many raycasts will occur RaycastHit[] m_Results = new RaycastHit[5]; // Reused buffer to avoid GC allocations
// See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { Vector3 origin = transform.position; Vector3 forward = transform.forward; float halfAngle = angle / 2f;
for (int i = 0; i < rayCount; i++) { // Interpolate angle across the spread range float lerp = (float)i / (rayCount - 1); float currentAngle = Mathf.Lerp(-halfAngle, halfAngle, lerp);
// Rotate direction around Y axis Quaternion rotation = Quaternion.AngleAxis(currentAngle, Vector3.up); Vector3 direction = rotation * forward;
// Note: The buffer is overwritten from index 0 up to the number of hits returned. Unused slots remain unchanged. int hits = Physics.RaycastNonAlloc(origin, direction, m_Results, maxDistance);
if (hits > 0) { for (int j = 0; j < hits; j++) { Debug.Log($"Ray {i} hit {m_Results[j].collider.gameObject.name}"); Debug.DrawLine(origin, m_Results[j].point, Color.green); } } else { Debug.DrawRay(origin, direction * maxDistance, Color.red); } } } }