Menu
CoddyTech

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

challenge icon

Задание

Средне

Заряди пушку широким лучом. Скрипт 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 вперёд: уничтожь первый объект, которого она коснётся.
        }
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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