Menu
CoddyTech

RaycastHit

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 36 из 71.

Physics.Raycast также может сообщить, во что попал луч. Добавь out RaycastHit hit после направления: когда метод возвращает true, он записывает подробности в hit. С помощью out метод C# возвращает дополнительное значение через переданную ему переменную. Этот дальномер выводит в журнал объект, на который он направлен, и расстояние до него, когда ты нажимаешь пробел:

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

Задание

Средне

Добавь к оружию лазерный прицел: красную точку там, куда попадает лазер.

  1. В Update() выполни проверку с помощью Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range).
  2. При попадании вызови dot.gameObject.SetActive(true); и установи dot.position = hit.point;.
  3. При промахе вызови dot.gameObject.SetActive(false);.

Нажми «Играть» и поверни оружие: точка будет скользить по стене и ящикам. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class LaserSight : MonoBehaviour
{
    public Transform dot;
    public float range = 15f;

    void Update()
    {
        // Разместите dot в точке, где лазер пересекает поверхность; скройте его, если лазер ни во что не попадает.
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity