OverlapSphere y SphereCast
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 38 de 63.
Un rayo pregunta por una línea. Physics.OverlapSphere(center, radius) pregunta por una región con forma de bola: devuelve un array de todos los colliders 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 array contiene todo lo que está al alcance: el suelo, las paredes y el propio collider de la bomba, porque las pruebas de superposición no omiten el collider en cuyo interior empiezan. Por eso el bucle comprueba el tag antes de actuar. El attachedRigidbody de cada collider es el Rigidbody al que pertenece, o null para los 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 collider con el que chocaría la esfera. Una roca de radio 1 que rueda hacia una abertura de 1.5 de ancho entre dos postes pregunta si cabe: un rayo fino por el centro de la abertura no choca con nada, mientras que el sphere cast choca con un poste. Al igual que un rayo, un sphere cast omite los colliders que ya toca en el punto donde empieza.
Desafío
IntermedioArma el cañón con un haz amplio. El script Beam está en el cañón, y el Inspector le asigna un radius de 0.5 y un range de 12. Las flechas izquierda y derecha giran el cañón.
- Cuando se pulsa Space, barre una esfera de
radiushacia delante desde el cañón, con una longitud derangeunidades. - Si alcanza algo, registra
Hit Polejunto con el nombre de lo que alcanzó y destruye ese objeto. - Si no alcanza nada, registra
Miss.
El poste delgado está un poco desplazado respecto a la línea central del cañón. Pulsa Play y dispara; luego, pulsa Check.
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))
{
// Haz un barrido hacia adelante con una esfera de radio radius: destruye el primer objeto que encuentre.
}
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger