RaycastCommand
структура в UnityEngine
Выполнено в:UnityEngine.PhysicsModule
Описание
Структура, используемая для настройки команды raycast для асинхронного выполнения во время задания.
Когда с помощью этой структуры вы планируете пакет трассировок лучей, они выполняются асинхронно и параллельно друг другу. Результаты записываются в буфер результатов. Поскольку запись асинхронна, обращаться к буферу результатов можно только после завершения задания.
Результаты для команды с индексом N в буфере команд хранятся в индексе N * maxHits в буфере результатов.
Если maxHits больше, чем фактическое число результатов для команды, буфер результатов будет содержать некоторые неверные результаты, которые не попали ни в что. Первый неверный результат идентифицируется коллайдером, который является нулевым. Второй и последующие неверные результаты не записываются командой raycast, так что их коллайдеры не гарантировано будут нулевыми. При итерации результатов цикл должен прекратиться, когда будет найден первый неверный результат.
Команда Raycast также контролирует, генерируют ли коллайдеры Trigger и треугольники с обратной стороной попадания. Если hitMultipleFaces установлено в true, команда Raycast возвращает несколько попаданий на сетку. Вы должны соответственно настроить maxHits и размер массива результатов, чтобы хранить все попадания. Для твёрдых объектов (Сфера, Капсула, Коробка, Выпуклость) это возвращает максимум один результат. QueryParameters для управления флагами попаданий.
Примечание: В профиле регистрируется только BatchQuery.ExecuteRaycastJob. Информация о количестве запросов не регистрируется.
Дополнительные ресурсы: Physics.Raycast, Physics.RaycastAll.
using Unity.Collections; using Unity.Jobs; using UnityEngine;
public class RaycastExample : MonoBehaviour { [SerializeField] private int rayCount = 5; [SerializeField] private float spacing = 2.0f; [SerializeField] private float rayLength = 100f;
private void Start() { // Allocate raycast commands and results var commands = new NativeArray<RaycastCommand>(rayCount, Allocator.TempJob); var results = new NativeArray<RaycastHit>(rayCount, Allocator.TempJob);
// Set up raycast commands for (int i = 0; i < rayCount; i++) { Vector3 origin = new Vector3(i * spacing, 0, -10); Vector3 direction = Vector3.forward; commands[i] = new RaycastCommand(origin, direction, QueryParameters.Default); }
// Schedule and complete batch JobHandle handle = RaycastCommand.ScheduleBatch(commands, results, 1, default); handle.Complete();
// Process results for (int i = 0; i < rayCount; i++) { if (results[i].collider != null) { Debug.DrawLine(commands[i].from, results[i].point, Color.green, 5f); Debug.Log($"Ray {i} hit {results[i].collider.name} at {results[i].point}"); } else { Debug.DrawRay(commands[i].from, commands[i].direction * rayLength, Color.red, 5f); Debug.Log($"Ray {i} missed."); } }
// Dispose memory results.Dispose(); commands.Dispose(); } }
Свойства
| Свойство | Описание |
|---|---|
| direction | Направление луча. |
| distance | Максимальное расстояние, на котором луч должен проверять столкновения. |
| from | Начальная точка луча в мировых координатах. |
| physicsScene | Сцена физики, в которой запускается эта команда. |
| queryParameters | Структура для указания дополнительных параметров для пакетного запроса, таких как маска слоя, попадание на несколько сеток, попадание на триггеры и попадание на задние поверхности. |
Конструкторы
| Конструктор | Описание |
|---|---|
| RaycastCommand | Создайте RaycastCommand. |
Статические методы
| Метод | Описание |
|---|---|
| ScheduleBatch | Расписание пакета raycast для выполнения в задании. |