Menu
CoddyTech

Patrouillieren und verfolgen

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

Eine Wache auf Patrouille geht eine Route ab, bis sie den Spieler sieht, nimmt die Verfolgung auf 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 Gehen für beide übernehmen. Dieser Wachposten geht 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. Dadurch hat die Verfolgung Vorrang, sobald der Spieler in der Nähe ist. goal ist ein Feld, daher behält der Wachposten sein Ziel während einer Verfolgung bei: Sobald der Spieler verschwunden ist, geht er weiter zu dem Posten, auf den er unterwegs war.

Die Ankunftsprüfung misst die Entfernung entlang des Bodens. Die Posten sind Markierungen auf dem Boden, und der Mittelpunkt des Wachpostens befindet sich 1 Einheit über ihnen. Eine Entfernung, in die auch die Höhe einfließt, wird daher nie kleiner als 1, und der Wachposten würde sich niemals umdrehen. Die Prüfung verlangt weniger als 0.2, nicht genau 0: Bei 2 Einheiten pro Sekunde bewegt sich der Wachposten pro Schritt um 0.04 Einheiten und kommt fast nie genau auf dem Posten an.

challenge icon

Aufgabe

Mittel

Lass den Roboter seine Wegpunkte ablaufen und den Spieler verfolgen, wenn dieser sich nähert.

  1. Schreibe WalkTo(Vector3 target) und setze rb.linearVelocity in Richtung des Ziels über den Boden auf speed, wobei die y-Geschwindigkeit erhalten bleibt.
  2. Rufe in FixedUpdate(), wenn der Spieler näher als chaseRange ist, WalkTo(player.position) auf und führe return aus.
  3. Wenn der Abstand zu waypoints[next] weniger als 0.2 beträgt, setze next = (next + 1) % waypoints.Length; und gehe dann zu waypoints[next].

Drücke „Spielen“ und kreuze seinen Weg. Drücke dann „Prüfen“.

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
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground