Menu
CoddyTech

Physics.Raycast

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

Лучевой запрос испускает невидимую линию из точки в заданном направлении и сообщает, пересекла ли она коллайдер. Physics.Raycast(origin, direction, maxDistance) возвращает true, если коллайдер находится на линии в пределах maxDistance единиц, и false в противном случае. Этот автомобиль тормозит, когда что-либо находится менее чем в 2 единицах перед его носом:

public float brakeDistance = 2f;

void Update()
{
    if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
    {
        Debug.Log("Brake!");
    }
}

transform.forward поворачивается вместе с автомобилем, поэтому луч всегда направлен от его носа; Vector3.forward всегда указывал бы вдоль мировой оси z. Луч начинается в центре автомобиля, внутри его собственного коллайдера, а луч никогда не сообщает о коллайдере, внутри которого он начинается, поэтому автомобиль не видит сам себя. Не укажите maxDistance — и луч будет идти бесконечно: автомобиль тормозил бы перед стеной на другом конце карты.

Лучевые запросы обнаруживают коллайдеры, а не то, что нарисовано: объект с Renderer и без коллайдера для них невидим, а коллайдер-триггер считается попаданием. Во время тестирования Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) отображает луч в окне Scene в Unity.

challenge icon

Задание

Средне

Сделай дверь магазина автоматической. Скрипт DoorSensor находится на датчике над дверным проёмом, на высоте 3.5 единицы над землёй. В Inspector ему назначают door и reach со значением 3.

  • Каждый кадр запускай луч от датчика строго вниз, длиной reach единиц.
  • Пока луч во что-то попадает, дверь открыта: скрой её с помощью SetActive(false). Если луч ни во что не попадает, снова покажи дверь.

Земля находится за пределами досягаемости луча, поэтому дверь остаётся закрытой, пока кто-нибудь не встанет под датчиком. Нажми Play и проведи Посетителя под ним с помощью стрелок, затем нажми Check.

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

using UnityEngine;

public class DoorSensor : MonoBehaviour
{
    public GameObject door;
    public float reach = 3f;

    void Update()
    {
        // Открывать дверь, пока луч, направленный вниз от Sensor, во что-нибудь попадает.
    }
}
quiz iconПроверьте себя

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

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