Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Dale al cañón un haz amplio con Physics.SphereCast.

  1. Al pulsar Espacio, barre una esfera: Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range).
  2. Si hay un impacto, registra "Hit " + hit.collider.name (el primer disparo registra Hit Pole) y destruye ese objeto.
  3. 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

Practica por tu cuenta: Playground de Unity