Menu
CoddyTech

Physics.Raycast

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 35 von 71.

Ein Raycast schießt von einem Punkt aus in eine Richtung eine unsichtbare Linie und meldet, ob sie einen Collider getroffen hat. Physics.Raycast(origin, direction, maxDistance) gibt true zurück, wenn sich innerhalb von maxDistance Einheiten ein Collider auf der Linie befindet, andernfalls false. Dieses Auto bremst, wenn sich weniger als 2 Einheiten vor seiner Front etwas befindet:

public float brakeDistance = 2f;

void Update()
{
    if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
    {
        Debug.Log("Brake!");
    }
}

transform.forward dreht sich mit dem Auto, sodass der Strahl immer aus seiner Front herauszeigt; Vector3.forward würde immer entlang der z-Achse der Welt zeigen. Der Strahl beginnt in der Mitte des Autos, innerhalb seines eigenen Colliders. Ein Strahl meldet niemals einen Collider, in dem er startet, daher sieht das Auto sich selbst nicht. Lässt du maxDistance weg, läuft der Strahl endlos weiter: Das Auto würde wegen einer Wand auf der anderen Seite der Karte bremsen.

Strahlen erfassen Collider, nicht das, was gezeichnet wird: Ein Objekt mit einem Renderer, aber ohne Collider, ist für sie unsichtbar, und ein Trigger-Collider zählt als Treffer. Während du testest, zeichnet Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) den Strahl in Unitys Scene-Ansicht.

challenge icon

Aufgabe

Mittel

Lass die Ladentür öffnen, während jemand unter dem Sensor steht.

  1. Teste in Update() Physics.Raycast(transform.position, Vector3.down, reach): einen Strahl gerade nach unten, der reach Einheiten lang ist und oberhalb des Bodens endet.
  2. Wenn die Bedingung wahr ist, rufe door.SetActive(false); auf und im else-Zweig door.SetActive(true);.

Drücke „Spielen“ und gehe mit dem Besucher unter den Sensor: Die Tür öffnet sich und schließt sich hinter ihm. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class DoorSensor : MonoBehaviour
{
    public GameObject door;
    public float reach = 3f;

    void Update()
    {
        // Öffne die Tür, solange der vom Sensor nach unten gerichtete Strahl auf etwas trifft.
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground