OverlapSphere и SphereCast
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 40 из 71.
Луч задаёт вопрос о линии. Physics.OverlapSphere(center, radius) проверяет шарообразную область: он возвращает массив всех коллайдеров, которые соприкасаются со сферой в точке center, без направления и расстояния. Эта бомба уничтожает все ящики в пределах 3 единиц при взрыве:
void Explode()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
foreach (Collider c in hits)
{
if (c.CompareTag("Crate"))
{
Destroy(c.gameObject);
}
}
Destroy(gameObject);
}Массив содержит всё, что находится в пределах досягаемости: пол, стены и собственный коллайдер бомбы, потому что проверки перекрытия не пропускают коллайдер, внутри которого они начинаются. Поэтому цикл проверяет тег, прежде чем что-либо сделать. attachedRigidbody каждого коллайдера — это Rigidbody, к которому он относится, или null для статических объектов, таких как пол.
Physics.SphereCast(origin, radius, direction, out hit, maxDistance) — это толстый луч: он перемещает сферу вдоль линии и сообщает о первом коллайдере, с которым сфера столкнулась бы. Камень радиусом 1, катящийся к проходу шириной 1.5 между двумя столбами, с его помощью проверяет, пройдёт ли он: тонкий луч по центру прохода ни во что не попадёт, а сферический луч заденет столб. Как и обычный луч, сферический луч пропускает коллайдеры, которых он уже касается в точке старта.
Задание
СреднеСоздай для пушки широкий луч с помощью Physics.SphereCast.
- При нажатии пробела проводи сферу:
Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range). - При попадании записывай в журнал
"Hit " + hit.collider.name(первый выстрел записываетHit Pole) и уничтожай этот объект. - При промахе записывай в журнал
Miss.
Нажми «Играть» и выстрели три раза: сначала исчезнет Pole, затем Crate, потом будет Miss. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
public class Beam : MonoBehaviour
{
public float radius = 0.5f;
public float range = 12f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Проведите сферу радиуса radius вперёд: уничтожьте первый объект, которого она коснётся.
}
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity