OverlapSphere und SphereCast
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 40 von 71.
Ein Strahl fragt nach einer Linie. Physics.OverlapSphere(center, radius) fragt nach einem kugelförmigen Bereich: Es gibt ein Array aller Collider zurück, die eine Kugel bei center berühren, ohne Richtung und ohne Entfernung. Diese Bombe zerstört bei ihrer Explosion jede Kiste im Umkreis von 3 Einheiten:
void Explode()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
foreach (Collider c in hits)
{
if (c.CompareTag("Crate"))
{
Destroy(c.gameObject);
}
}
Destroy(gameObject);
}Das Array enthält alles in Reichweite: den Boden, die Wände und den eigenen Collider der Bombe, denn Überlappungstests überspringen den Collider nicht, in dem sie beginnen. Deshalb prüft die Schleife das Tag, bevor sie handelt. Das attachedRigidbody jedes Colliders ist das Rigidbody, zu dem er gehört, oder null bei statischen Dingen wie dem Boden.
Physics.SphereCast(origin, radius, direction, out hit, maxDistance) ist ein dicker Strahl: Er bewegt eine Kugel entlang der Linie und meldet den ersten Collider, gegen den die Kugel stoßen würde. Ein Felsbrocken mit Radius 1, der auf eine 1.5 breite Lücke zwischen zwei Pfosten zurollt, fragt damit, ob er hindurchpasst: Ein dünner Strahl durch die Mitte der Lücke trifft nichts, während der Sphere Cast einen Pfosten trifft. Wie ein Strahl überspringt ein Sphere Cast Collider, die er an seinem Startpunkt bereits berührt.
Aufgabe
MittelGib der Kanone mit Physics.SphereCast einen breiten Strahl.
- Bei Druck auf die Leertaste eine Kugel durchsuchen lassen:
Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range). - Bei einem Treffer
"Hit " + hit.collider.nameprotokollieren (der erste Schuss protokolliertHit Pole) und das Objekt zerstören. - Bei einem Fehlschuss
Missprotokollieren.
Drücke „Spielen“ und feuere dreimal: Zuerst verschwindet der Pole, dann die Crate, dann wird ein Fehlschuss protokolliert. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
public class Beam : MonoBehaviour
{
public float radius = 0.5f;
public float range = 12f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Bewege eine Kugel mit dem Radius radius nach vorn: Zerstöre das erste Objekt, das sie trifft.
}
}
}
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground