Unity 6.3
0 онлайн 78 гостей 3 в системе
Вход

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); } } } }