Menu
CoddyTech

Sichtlinie

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 37 von 63.

In der Nähe einer Wache zu sein, ist nicht dasselbe, wie von ihr gesehen zu werden: Eine Wand dazwischen versperrt die Sicht. Um die Sichtlinie zu prüfen, schießt du einen Strahl vom Auge zum Ziel und prüfst, ob das erste getroffene Objekt das Ziel selbst ist. Die Richtung ergibt sich aus der Position des Ziels minus deiner eigenen Position, und ein Strahl dieser Länge erreicht das Ziel:

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

Eine Überwachungskamera auf einem Pfeiler protokolliert I see you, solange CanSee() true ist. Befindet sich das Ziel im Freien, trifft der Strahl zuerst das Ziel. Befindet sich das Ziel hinter einer Kiste, trifft der Strahl zuerst die Kiste, hit.transform ist das der Kiste, und das Ergebnis ist false. Physics.Raycast allein gibt auch für die Kiste true zurück. Deshalb wird der Treffer mit dem Ziel verglichen.

Das Ziel benötigt einen Collider, damit der Strahl es finden kann. Der Strahl benötigt keine normalisierte Richtung, da seine Länge durch maxDistance bestimmt wird. Physics.Linecast(from, to) stellt die Frage andersherum: ob sich irgendein Collider zwischen zwei Punkten befindet. !Physics.Linecast(eye, target.position, wallMask) bedeutet, dass keine Wand im Weg ist.

challenge icon

Aufgabe

Mittel

Der Wachturm beobachtet den Spieler. Das Skript Sentry befindet sich auf dem Turm, und im Inspector werden ihm der player und eine range von 8 zugewiesen. Die Farbe des Turms zeigt, was er sieht:

  • Wenn er den Spieler sehen kann, färbe den Turm rot (Color.red), andernfalls grün (Color.green).
  • Er sieht den Spieler nur, wenn dieser höchstens range Einheiten entfernt ist und sich nichts dazwischen befindet.

Drücke Play und bewege den Spieler mit den Pfeiltasten um die Wand herum. Klicke danach auf Check.

Probier es selbst

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Rot, solange der Wachposten den Spieler sehen kann, andernfalls grün.
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Physik und Gameplay