Menu
CoddyTech

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 между двумя столбами, с его помощью проверяет, пройдёт ли он: тонкий луч по центру прохода ни во что не попадёт, а сферический луч заденет столб. Как и обычный луч, сферический луч пропускает коллайдеры, которых он уже касается в точке старта.

challenge icon

Задание

Средне

Создай для пушки широкий луч с помощью Physics.SphereCast.

  1. При нажатии пробела проводи сферу: Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range).
  2. При попадании записывай в журнал "Hit " + hit.collider.name (первый выстрел записывает Hit Pole) и уничтожай этот объект.
  3. При промахе записывай в журнал 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 вперёд: уничтожьте первый объект, которого она коснётся.
        }
    }
}

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

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