Physics.Raycast() — ваш главный инструмент для "пуль", детекции препятствий и взаимодействий. Разберём всё самое важное коротко!
🔍 Базовое использование
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 10f))
{
Debug.Log($"Попал в: {hit.collider.name}");
Debug.DrawLine(transform.position, hit.point, Color.red); // Визуализация
}
Ключевые параметры:
- origin — откуда выпускаем луч
- direction — направление (обязательно нормализуйте!)
- hit — информация о столкновении
- maxDistance — дальность луча
💡 Фишки RaycastHit
- hit.point — точка попадания
- hit.normal — нормаль поверхности
- hit.distance — дистанция до объекта
⚡️ Оптимизация
1. Фильтр по слоям
int enemyLayer = 1 << LayerMask.NameToLayer("Enemy");
Physics.Raycast(..., enemyLayer);2. NonAlloc-версия (без лишних выделений памяти)
RaycastHit[] hits = new RaycastHit[5];
int count = Physics.RaycastNonAlloc(..., hits);
3. Короткие лучи → Быстрее расчеты
Physics.Raycast(..., maxDistance: 5f);
🛠 Вариации Raycast
- RaycastAll — все пересечения луча
- SphereCast — луч с радиусом (толстые объекты)
- BoxCast — луч в форме куба
⚠️ Частые ошибки
- Луч из коллайдера → Игнорируйте свой объект:
if (hit.collider != myCollider) { ... }- FixedUpdate → Raycast зависит от физики, поэтому лучше вызывать там.
- Ненормализованный direction → Используйте transform.forward, а не transform.forward * 10.
📌 Пример для пуль:
if (Physics.Raycast(gun.position, gun.forward, out hit, 100f, enemyLayer))
{
hit.collider.GetComponent<Enemy>().TakeDamage(10);
}