Menu
CoddyTech

OverlapSphere e SphereCast

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 38 de 63.

Um raio consulta uma linha. Physics.OverlapSphere(center, radius) consulta uma região em forma de esfera: 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 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 no qual começam. É por isso que 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 em que a esfera esbarraria. Uma pedra de raio 1 rolando em direção a uma abertura de 1.5 de largura entre dois postes pergunta se ela 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 partida.

challenge icon

Desafio

Médio

Arme o canhão com um feixe largo. O script Beam fica no canhão, e o Inspector define um radius de 0.5 e um range de 12. As setas para a esquerda e para a direita giram o canhão.

  • Quando a tecla Espaço for pressionada, varra uma esfera de radius para a frente a partir do canhão, com range unidades de comprimento.
  • Se atingir algo, registre Hit Pole com o nome do que foi atingido e destrua esse objeto.
  • Se não atingir nada, registre Miss.

O poste fino fica um pouco ao lado da linha central do canhão. Pressione Play e atire, depois Check.

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 o primeiro objeto que ela atingir.
        }
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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