RaycastHit
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 34 из 63.
Physics.Raycast также может сообщить, во что он попал. Добавь out RaycastHit hit после направления: когда метод возвращает true, он заполняет hit подробностями. out — это способ, с помощью которого метод C# возвращает дополнительное значение через переданную ему переменную. Этот дальномер записывает, на что он направлен и как далеко это находится, когда ты нажимаешь Space:
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f))
{
Debug.Log(hit.collider.name + " is " + hit.distance + " units away");
}
}
}Если направить его на стену, передняя сторона которой находится в 12 единицах, он запишет Wall is 12 units away. Другие поля: hit.point — это точка в мире, где луч коснулся поверхности, hit.normal — направление, в котором обращена поверхность в этой точке ((0, 1, 0) на ровной земле), а hit.transform — Transform объекта, в который попал луч. Через hit.collider.gameObject можно получить доступ ко всему остальному, что относится к нему, например к его тегу.
Читай hit только внутри if. Когда луч промахивается, Raycast возвращает false, а в hit нет ничего полезного: его collider равен null.
Задание
СреднеОснастите пушку лазерным прицелом. Скрипт LaserSight находится на объекте Gun, а в Inspector ему задают красную точку dot (Transform) и дальность range, равную 15. Стрелки влево и вправо поворачивают пушку.
- Каждый кадр выпускайте луч из пушки вдоль её собственного направления вперёд на расстояние
range. - При попадании показывайте точку и размещайте её точно в месте, где луч коснулся поверхности.
- Если луч ни во что не попал, скрывайте точку с помощью
SetActive(false).
Точка находится на слое Ignore Raycast, поэтому луч проходит сквозь неё. Нажмите Play и проведите лазером по стене, ящику и бочке, затем нажмите Check.
Попробуйте сами
using UnityEngine;
public class LaserSight : MonoBehaviour
{
public Transform dot;
public float range = 15f;
void Update()
{
// Поместите dot в точку, где лазер пересекает поверхность; скрывайте его, когда лазер ни во что не попадает.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора