← Назад к вопросам

Как работает Raycast в Unity и для чего он используется?

2.0 Middle🔥 271 комментариев
#Unity Core#Физика и математика

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает Raycast в Unity

Raycast (луч-просвет) — это фундаментальная физическая операция в Unity, которая позволяет "бросать" виртуальный луч из точки в заданном направлении и определять, с какими объектами он пересекается. Это один из наиболее часто используемых инструментов для взаимодействия с игровым миром.

Механизм работы Raycast

Физический движок Unity (обычно PhysX) вычисляет пересечение луча с коллайдерами на сцене. Луч представляет собой математический вектор с начальной точкой и направлением.

Базовый синтаксис метода Physics.Raycast:

// Простейший вариант
bool hit = Physics.Raycast(rayOrigin, direction, out RaycastHit hitInfo, maxDistance);

// Альтернативный вариант с использованием структуры Ray
Ray ray = new Ray(origin, direction);
bool hit = Physics.Raycast(ray, out RaycastHit hitInfo, maxDistance);

Ключевые компоненты:

  • Ray — структура, содержащая точку начала (origin) и направление (direction)
  • RaycastHit — структура, содержащая всю информацию о столкновении
  • maxDistance — максимальная дистанция поиска пересечений
  • layerMask — маска слоёв для фильтрации объектов (опционально)

Что содержится в RaycastHit?

Структура RaycastHit содержит критически важные данные:

if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 100f))
{
    GameObject hitObject = hit.collider.gameObject;
    Vector3 hitPoint = hit.point; // Точка столкновения в мировых координатах
    Vector3 hitNormal = hit.normal; // Нормаль поверхности в точке столкновения
    float distance = hit.distance; // Дистанция от начала луча до точки столкновения
    Transform hitTransform = hit.transform; // Transform объекта
}

Основные сценарии использования Raycast

  1. Определение попаданий оружия

    public void Shoot()
    {
        Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
        if (Physics.Raycast(ray, out RaycastHit hit, 100f, enemyLayerMask))
        {
            Enemy enemy = hit.collider.GetComponent<Enemy>();
            if (enemy != null) enemy.TakeDamage(damage);
        }
    }
    
  2. Интерактивность и выбор объектов — для кликов мышью или касаний на мобильных устройствах

  3. Определение поверхности под объектом — для привязки к земле, определения уклона

  4. AI и навигация — для обнаружения препятствий, проверки видимости цели

  5. Проверка линии обзора — видит ли враг игрока

Важные вариации Raycast

  • Physics.RaycastAll — возвращает все пересечения, а не только первое
  • Physics.SphereCast — луч с радиусом, полезен для обнаружения объектов рядом с прямой видимостью
  • Physics.BoxCast — проверка пересечения параллелепипедом
  • Physics.Linecast — упрощённая проверка между двумя точками

Критические аспекты оптимизации

  • Используйте LayerMask — всегда фильтруйте объекты по слоям для уменьшения проверок
  • Минимизируйте количество Raycast'ов — особенно в Update()
  • Используйте кэширование результатов там, где это возможно
  • Настройка Query Trigger Interaction — определите, должны ли триггеры учитываться

Практический пример: интерактивный луч

public class ObjectSelector : MonoBehaviour
{
    [SerializeField] private LayerMask selectableLayer;
    [SerializeField] private float maxDistance = 10f;
    
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            
            if (Physics.Raycast(ray, out RaycastHit hit, maxDistance, selectableLayer))
            {
                ISelectable selectable = hit.collider.GetComponent<ISelectable>();
                if (selectable != null)
                {
                    selectable.OnSelected();
                    Debug.Log($"Selected: {hit.collider.name} at distance {hit.distance:F2}");
                }
            }
        }
    }
}

Raycast — это мощный и эффективный инструмент, который при правильном использовании становится основой для большинства систем взаимодействия в играх на Unity. Его понимание и грамотное применение значительно повышает качество и производительность игровых механик.

Как работает Raycast в Unity и для чего он используется? | PrepBro