Menu
CoddyTech

Physics.Raycast

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

Raycast испускает невидимую линию из точки в заданном направлении и сообщает, столкнулась ли она с коллайдером. 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

Задание

Средне

Сделай так, чтобы дверь магазина открывалась, когда кто-то стоит под датчиком.

  1. В Update() проверь Physics.Raycast(transform.position, Vector3.down, reach): луч, направленный строго вниз, длиной reach единиц, который останавливается над землёй.
  2. Если условие истинно, вызови door.SetActive(false);, а в блоке else — door.SetActive(true);.

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

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

using UnityEngine;

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

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

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

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