Menu
CoddyTech

Verfolgung in Reichweite

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

Die meisten Gegner lassen dich in Ruhe, bis du näher kommst. Miss in jedem Physikschritt die Entfernung zum Spieler und verfolge ihn nur innerhalb einer bestimmten Reichweite. Dieser Schleim verfolgt dich innerhalb von sightRange und bleibt außerhalb davon stehen:

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    if (toPlayer.magnitude < sightRange)
    {
        Vector3 dir = toPlayer.normalized;
        rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
    }
    else
    {
        rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
    }
}

Das else ist wichtig: Ein Rigidbody behält seine Geschwindigkeit bei, bis sie geändert wird. Ohne es rutscht ein Schleim, der dich aus den Augen verliert, weiter, bis die Reibung ihn stoppt; auf Eis hält er nie an. Da y zuerst auf 0 gesetzt wurde, ist toPlayer.magnitude die Entfernung über den Boden. Ein Spieler, der auf einer Kiste neben dem Schleim steht, zählt also trotzdem als direkt neben ihm.

Eine einzelne Reichweite hat eine Schwachstelle. Ein Spieler, der am Rand steht, gerät immer wieder hinein und hinaus, und der Schleim setzt sich wiederholt in Bewegung und bleibt stehen. Gegner vermeiden das mit zwei Reichweiten: Innerhalb einer kurzen Reichweite bemerken sie den Spieler und geben erst jenseits einer größeren Reichweite auf. Ein bool merkt sich, ob der Gegner den Spieler verfolgt. Zwischen den beiden Reichweiten ändert sich dieser Wert nicht, sodass der Gegner mit dem fortfährt, was er gerade getan hat.

challenge icon

Aufgabe

Mittel

Sorge dafür, dass der Wolf den Spieler aus der Nähe bemerkt und ihn aus der Ferne nicht mehr verfolgt.

  1. Nimm in FixedUpdate() die flache Distanz zum Spieler: Bei weniger als noticeRange setze das Feld bool chasing auf true; bei mehr als giveUpRange auf false.
  2. Setze während chasing rb.linearVelocity auf eine Geschwindigkeit von speed in Richtung des Spielers und behalte dabei den y-Wert bei.
  3. Andernfalls setze rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

Drück auf „Spielen“, geh auf den Wolf zu und lauf dann weg. Drück anschließend auf „Prüfen“.

Probier es selbst

using UnityEngine;

public class Wolf : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 3f;
    [SerializeField] private float noticeRange = 4f;
    [SerializeField] private float giveUpRange = 8f;
    private Rigidbody rb;

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

    void FixedUpdate()
    {
        // den Spieler bemerken, die Verfolgung aufgeben und ihn verfolgen oder stehen bleiben
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground