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.
Задание
СреднеСделай дверь магазина автоматической. Скрипт 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, во что-нибудь попадает.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора