OverlapSphere y SphereCast
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 40 de 71.
Un rayo pregunta por una línea. Physics.OverlapSphere(center, radius) pregunta por una región con forma de esfera: devuelve un arreglo de todos los colisionadores que tocan una esfera en center, sin dirección ni distancia. Esta bomba destruye todas las cajas que estén a menos de 3 unidades cuando explota:
void Explode()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
foreach (Collider c in hits)
{
if (c.CompareTag("Crate"))
{
Destroy(c.gameObject);
}
}
Destroy(gameObject);
}El arreglo contiene todo lo que está al alcance: el suelo, las paredes y el propio colisionador de la bomba, porque las pruebas de superposición no omiten el colisionador en cuyo interior comienzan. Por eso el bucle comprueba la etiqueta antes de actuar. El attachedRigidbody de cada colisionador es el Rigidbody al que pertenece, o null en el caso de objetos estáticos como el suelo.
Physics.SphereCast(origin, radius, direction, out hit, maxDistance) es un rayo grueso: barre una esfera a lo largo de la línea e informa del primer colisionador con el que chocaría la esfera. Una roca de radio 1 que rueda hacia un hueco de 1.5 de ancho entre dos postes pregunta si cabe: un rayo delgado por el centro del hueco no choca con nada, mientras que el sphere cast choca con un poste. Al igual que un rayo, un sphere cast omite los colisionadores que ya toca en el punto donde comienza.
Desafío
IntermedioDale al cañón un haz amplio con Physics.SphereCast.
- Al pulsar Espacio, barre una esfera:
Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range). - Si hay un impacto, registra
"Hit " + hit.collider.name(el primer disparo registraHit Pole) y destruye ese objeto. - Si no hay impacto, registra
Miss.
Pulsa «Jugar» y dispara tres veces: el Pole desaparece, después el Crate y, por último, Miss. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Beam : MonoBehaviour
{
public float radius = 0.5f;
public float range = 12f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Barre hacia delante con una esfera de radio radius: destruye el primer objeto que alcance.
}
}
}
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puerta6Raycasts
Physics.RaycastRaycastHitComprobación del suelo con un rayoCapas y LayerMaskLínea de visiónOverlapSphere y SphereCastRepaso: cable trampa láserPractica por tu cuenta: Playground de Unity