Menu
CoddyTech

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.

challenge icon

Задание

Средне

Оснастите пушку лазерным прицелом. Скрипт 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 в точку, где лазер пересекает поверхность; скрывайте его, когда лазер ни во что не попадает.
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс