Menu
CoddyTech

Patrouillieren und Verfolgen

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

Eine Wache auf Patrouille läuft eine Route ab, bis sie den Spieler sieht, verfolgt ihn und kehrt zu ihrer Route zurück, sobald der Spieler verschwunden ist. Beide Verhaltensweisen steuern auf dieselbe Weise, auf einen Punkt zu, daher kann eine Methode das Laufen für beide übernehmen. Dieser Wächter läuft zwischen zwei Posten hin und her und verfolgt den Spieler innerhalb von chaseRange:

[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;

void Start()
{
    rb = GetComponent<Rigidbody>();
    goal = pointA;
}

void FixedUpdate()
{
    if (Flat(player.position - rb.position).magnitude < chaseRange)
    {
        WalkTo(player.position);
        return;
    }
    if (Flat(goal.position - rb.position).magnitude < 0.2f)
    {
        goal = goal == pointA ? pointB : pointA;
    }
    WalkTo(goal.position);
}

void WalkTo(Vector3 target)
{
    Vector3 dir = Flat(target - rb.position).normalized;
    rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}

Vector3 Flat(Vector3 v)
{
    return new Vector3(v.x, 0f, v.z);
}

Die Verfolgungsprüfung kommt zuerst, und ihr return überspringt den Patrouillencode, sodass das Verfolgen Vorrang hat, wenn der Spieler in der Nähe ist. goal ist ein Feld, daher merkt sich der Wächter sein Ziel während einer Verfolgung: Sobald der Spieler verschwunden ist, läuft er weiter zu dem Posten, auf den er bereits zugesteuert hat.

Die Ankunftsprüfung misst die Entfernung über den Boden. Die Posten sind Markierungen auf dem Boden und der Mittelpunkt des Wächters befindet sich 1 Einheit über ihnen. Eine Entfernung, die die Höhe berücksichtigt, wird daher nie kleiner als 1, und der Wächter würde sich nie umdrehen. Die Prüfung verlangt weniger als 0.2, nicht genau 0: Bei 2 Einheiten pro Sekunde bewegt sich der Wächter pro Schritt um 0.04 Einheiten und landet fast nie genau auf dem Posten.

challenge icon

Aufgabe

Mittel

Ein Sicherheitsroboter patrouilliert im Lagerhaus. Schreibe das Skript Robot. Der Inspector weist ihm waypoints (die vier gelben Markierungen W0 bis W3, in dieser Reihenfolge), player, speed (4) und chaseRange (4) zu. Das Skript Player ist fertig.

  • Ein int-Feld namens next, das bei 0 beginnt, ist der Index des Wegpunkts, zu dem der Roboter läuft.
  • Patrouille: Laufe zu waypoints[next]. Sobald der Roboter am Boden weniger als 0.2 davon entfernt ist, setze next auf den folgenden Wegpunkt und nach dem letzten wieder auf 0.
  • Verfolgung: Solange der Spieler am Boden weniger als chaseRange entfernt ist, laufe stattdessen zum Spieler.
  • Wenn sich der Spieler entfernt, laufe weiter zu waypoints[next], dem Wegpunkt, zu dem der Roboter unterwegs war.
  • Bewege dich, indem du die Geschwindigkeit des Rigidbody am Boden auf speed setzt und dabei seine y-Geschwindigkeit beibehältst.

Drücke Play, beobachte eine Runde der Patrouille und kreuze ihren Weg, dann Check.

Probier es selbst

using UnityEngine;

public class Robot : MonoBehaviour
{
    [SerializeField] private Transform[] waypoints;
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 4f;
    [SerializeField] private float chaseRange = 4f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // Verfolge den Spieler, wenn er in der Nähe ist, oder laufe die Patrouillenroute ab
    }
}
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