Menu
CoddyTech

OverlapSphere i SphereCast

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 40 z 71.

Promień pyta o linię. Physics.OverlapSphere(center, radius) pyta o obszar w kształcie kuli: zwraca tablicę wszystkich colliderów, które dotykają kuli w punkcie center, bez kierunku i odległości. Ta bomba niszczy każdą skrzynię w promieniu 3 jednostek, gdy wybucha:

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

Tablica zawiera wszystko, co znajduje się w zasięgu: podłogę, ściany i własny collider bomby, ponieważ testy nakładania się nie pomijają collidera, wewnątrz którego się zaczynają. Dlatego pętla sprawdza tag przed podjęciem działania. Właściwość attachedRigidbody każdego collidera zwraca Rigidbody, do którego on należy, lub null w przypadku obiektów statycznych, takich jak podłoga.

Physics.SphereCast(origin, radius, direction, out hit, maxDistance) to gruby promień: przesuwa kulę wzdłuż linii i zgłasza pierwszy collider, na który kula by natrafiła. Głaz o promieniu 1, toczący się w stronę szczeliny o szerokości 1.5 między dwoma słupkami, pyta tę metodę, czy się zmieści: cienki promień poprowadzony środkiem szczeliny niczego nie trafia, a rzut kuli trafia w słupek. Podobnie jak promień, rzut kuli pomija collidery, których dotyka już w miejscu, w którym się zaczyna.

challenge icon

Wyzwanie

Średni

Nadaj działu szeroką wiązkę za pomocą Physics.SphereCast.

  1. Po naciśnięciu spacji omiataj przestrzeń sferą: Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range).
  2. Po trafieniu zapisz w logu "Hit " + hit.collider.name (pierwszy strzał zapisuje w logu Hit Pole) i zniszcz ten obiekt.
  3. Po chybieniu zapisz w logu Miss.

Naciśnij „Graj” i strzel trzy razy: najpierw znika Pole, potem Crate, a następnie pojawia się Miss. Potem naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Przesuń kulę o promieniu radius do przodu: zniszcz pierwszy obiekt, w który trafi.
        }
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity