Menu
CoddyTech

OverlapSphere e SphereCast

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 40 di 71.

Un raggio chiede informazioni su una linea. Physics.OverlapSphere(center, radius) chiede informazioni su una regione a forma di sfera: restituisce un array di ogni collider che tocca una sfera in center, senza direzione né distanza. Quando esplode, questa bomba distrugge ogni cassa entro 3 unità:

void Explode()
{
    Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
    foreach (Collider c in hits)
    {
        if (c.CompareTag("Crate"))
        {
            Destroy(c.gameObject);
        }
    }
    Destroy(gameObject);
}

L'array contiene tutto ciò che è a portata: il pavimento, le pareti e il collider della bomba stessa, perché i test di sovrapposizione non ignorano il collider al cui interno iniziano. Ecco perché il ciclo controlla il tag prima di agire. attachedRigidbody di ciascun collider è il Rigidbody a cui appartiene, oppure null per gli elementi statici, come il pavimento.

Physics.SphereCast(origin, radius, direction, out hit, maxDistance) è un raggio spesso: fa scorrere una sfera lungo la linea e segnala il primo collider contro cui la sfera urterebbe. Un masso di raggio 1 che rotola verso un varco largo 1.5 tra due pali chiede se ci passa: un raggio sottile diretto al centro del varco non colpisce nulla, mentre il SphereCast colpisce un palo. Come un raggio, uno SphereCast ignora i collider che tocca già nel punto di partenza.

challenge icon

Sfida

Medio

Dai al cannone un raggio ampio con Physics.SphereCast.

  1. Alla pressione di Space, esegui una scansione con una sfera: Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range).
  2. In caso di impatto, registra "Hit " + hit.collider.name (il primo colpo registra Hit Pole) e distruggi quell'oggetto.
  3. In caso di mancato impatto, registra Miss.

Premi «Gioca» e spara tre volte: il Pole scompare, poi il Crate, poi Miss. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class Beam : MonoBehaviour
{
    public float radius = 0.5f;
    public float range = 12f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Effettua uno sweep in avanti di una sfera di raggio radius: distruggi il primo oggetto che colpisce.
        }
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity