Raycast в Unity3D: Туториал с примерами

Этот туториал описывает создание скрипта для работы с 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, не гарантируется.

Что будем искать? Например,программа