Menu
CoddyTech

OverlapSphere e SphereCast

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 40 de 71.

Um raio pergunta sobre uma linha. Physics.OverlapSphere(center, radius) pergunta sobre uma região em forma de bola: ele retorna um array de todos os colliders que tocam uma esfera em center, sem direção nem distância. Esta bomba destrói todas as caixas a até 3 unidades de distância quando explode:

void Explode()
{
    Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
    foreach (Collider c in hits)
    {
        if (c.CompareTag("Crate"))
        {
            Destroy(c.gameObject);
        }
    }
    Destroy(gameObject);
}

O array contém tudo o que está ao alcance: o chão, as paredes e o próprio collider da bomba, porque os testes de sobreposição não ignoram o collider dentro do qual começam. Por isso o loop verifica a tag antes de agir. O attachedRigidbody de cada collider é o Rigidbody ao qual ele pertence, ou null para objetos estáticos, como o chão.

Physics.SphereCast(origin, radius, direction, out hit, maxDistance) é um raio espesso: ele varre uma esfera ao longo da linha e informa o primeiro collider com o qual a esfera colidiria. Uma pedra com raio 1 rolando em direção a uma abertura de 1.5 de largura entre dois postes pergunta se cabe: um raio fino no meio da abertura não atinge nada, enquanto o sphere cast atinge um poste. Assim como um raio, um sphere cast ignora os colliders que já toca no ponto de origem.

challenge icon

Desafio

Médio

Dê ao canhão um feixe amplo com Physics.SphereCast.

  1. Ao pressionar Espaço, varra uma esfera: Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range).
  2. Ao acertar, registre "Hit " + hit.collider.name (o primeiro disparo registra Hit Pole) e destrua esse objeto.
  3. Ao errar, registre Miss.

Pressione “Jogar” e atire três vezes: o Pole desaparece, depois o Crate, depois Miss. Em seguida, clique em “Verificar”.

Experimente você mesmo

using UnityEngine;

public class Beam : MonoBehaviour
{
    public float radius = 0.5f;
    public float range = 12f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Varra uma esfera de raio radius para a frente: destrua a primeira coisa que ela atingir.
        }
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity