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.
Desafio
MédioArme 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
radiuspara a frente a partir do canhão, comrangeunidades de comprimento. - Se atingir algo, registre
Hit Polecom 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.
}
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar