Этот туториал описывает создание скрипта для работы с Raycast в Unity3D. Рассмотрены методы Raycast и RaycastAll, а также визуализация результатов с помощью LineRenderer.
Объявление структуры и массива
Объявляем структуру RaycastHit для хранения информации о результатах Raycast:
public struct RaycastHit
{
public GameObject hitObject; // Объект, в который попал луч
// ... другая информация о попадании ...
}
Объявляем массив для хранения результатов RaycastAll:
RaycastHit[] hits;
Получение точки начала луча
Точка начала луча вычисляется на основе размеров экрана:
Vector3 origin = new Vector3(Screen.width / 2f, Screen.height / 2f, 0f);
origin = Camera.main.ScreenToWorldPoint(origin);
Центральная точка экрана преобразуется в мировые координаты и используется как начало луча. Z-компонент равен 0, так как луч исходит из плоскости экрана.
Использование Physics.Raycast
Physics.Raycast выполняет единичный Raycast:
bool hit = Physics.Raycast(origin, direction, out hitInfo, Mathf.Infinity, layerMask);
- origin: Начальная точка луча.
- direction: Направление луча.
- hitInfo: Структура, содержащая информацию о попадании (используется модификатор out).
- Mathf.Infinity: Максимальная дистанция луча (бесконечность).
- layerMask: Маска слоев, с которыми луч взаимодействует.
Метод возвращает true, если луч попал в объект, и false в противном случае. Информация о попадании записывается в hitInfo.
Использование Physics.RaycastAll
Physics.RaycastAll выполняет Raycast и возвращает массив всех объектов, с которыми луч столкнулся:
hits = Physics.RaycastAll(origin, direction, Mathf.Infinity, layerMask);
Параметры такие же, как у Physics.Raycast, но возвращается массив RaycastHit. Длина массива равна количеству столкновений. Порядок объектов в массиве не гарантируется.
Визуализация луча с помощью LineRenderer
Для визуализации используется компонент LineRenderer:
LineRenderer lr = GetComponent<LineRenderer>();
lr.SetPosition(0, origin);
if (hit)
{
lr.SetPosition(1, hit.point);
}
else
{
lr.SetPosition(1, origin + direction * 100f); // конечная точка вне экрана
}
lr.startWidth = ширина;
lr.endWidth = ширина;
lr.widthMultiplier = ширина;
lr.material = материал; // Задать материал для линии
Устанавливаются начальная и конечная точки (точка попадания или точка на заданном расстоянии по направлению луча), ширина и материал LineRenderer.
Маска слоев (LayerMask)
Маска слоев позволяет ограничить взаимодействие луча только с определенными слоями:
public LayerMask layerMask;
Переменная определяет слои, с которыми будет взаимодействовать Raycast.
Обработка результатов RaycastAll
Обработка результатов RaycastAll:
if (hits.Length > 0)
{
foreach (RaycastHit hit in hits)
{
Debug.Log(hit.hitObject.name + " на дистанции " + hit.distance);
}
}
Цикл перебирает элементы массива hits и выводит имя объекта и дистанцию до него.
Рассмотрены основные методы работы с Raycast в Unity3D: Physics.Raycast и Physics.RaycastAll, а также визуализация результатов с помощью LineRenderer. Маска слоев позволяет управлять взаимодействием луча с объектами сцены. Порядок объектов, возвращаемых Physics.RaycastAll, не гарантируется.