OverlapSphere и SphereCast
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 38 из 63.
Луч ищет линию. 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 между двумя столбами, с помощью этого метода проверяет, поместится ли он: тонкий луч по центру прохода ничего не заденет, а сферический каст столкнётся со столбом. Как и луч, сферический каст пропускает коллайдеры, которых он уже касается в начальной точке.
Задание
СреднеЗаряди пушку широким лучом. Скрипт Beam находится на объекте Cannon, а в Inspector ему задаются radius равный 0.5 и range равный 12. Стрелки влево и вправо поворачивают пушку.
- При нажатии Space просканируй пространство перед пушкой сферой радиуса
radiusи длинойrangeединиц. - Если сфера что-то заденет, выведи в журнал
Hit Poleи имя объекта, в который она попала, а затем уничтожь этот объект. - Если она ничего не заденет, выведи в журнал
Miss.
Тонкий Pole стоит немного в стороне от центральной линии пушки. Нажми Play и выстрели, затем нажми Check.
Попробуйте сами
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 для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора