Menu
CoddyTech

Sichtlinie

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

In der Nähe einer Wache zu sein, ist nicht dasselbe, wie von ihr gesehen zu werden: Eine dazwischenliegende Wand versperrt die Sicht. Um die Sichtlinie zu prüfen, sende einen Strahl vom Auge zum Ziel und überprüfe, ob das Erste, worauf er trifft, das Ziel selbst ist. Die Richtung ist die Position des Ziels minus deine eigene, und ein so langer Strahl 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() wahr ist. Befindet sich das Ziel im Freien, trifft der Strahl zuerst auf das Ziel. Befindet sich das Ziel hinter einer Kiste, trifft der Strahl zuerst auf die Kiste, hit.transform ist die der Kiste, und das Ergebnis ist falsch. 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 braucht keine normalisierte Richtung, da seine Länge von maxDistance bestimmt wird. Physics.Linecast(from, to) stellt die Frage umgekehrt: ob sich zwischen zwei Punkten irgendein Collider befindet. !Physics.Linecast(eye, target.position, wallMask) bedeutet, dass sich keine Wand im Weg befindet.

challenge icon

Aufgabe

Mittel

Färbe den Wachposten rot, solange er den Spieler sehen kann, andernfalls grün.

  1. Schreibe bool CanSee(): Verwende Vector3 toPlayer = player.position - transform.position; und gib false zurück, wenn toPlayer.magnitude > range.
  2. Führe dann Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) aus und gib hit.transform == player zurück; bei einem Fehlschuss gib false zurück.
  3. Setze in Update() die Farbe des Turms anhand von CanSee() auf Color.red oder Color.green.

Drücke „Spielen“ und gehe hinter die Wand. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

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

    void Update()
    {
        // Rot, solange die Wache den Spieler sehen kann, sonst grün.
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground