Menu
CoddyTech

Verfolgung in Reichweite

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

Die meisten Gegner lassen dich in Ruhe, bis du näher kommst. Miss die Entfernung zum Spieler bei jedem Physikschritt 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 etwas sie ändert. Ohne es rutscht ein Schleim, der dich aus den Augen verliert, weiter, bis die Reibung ihn stoppt, und auf Eis kommt er nie zum Stehen. Da y zuerst auf 0 gesetzt wurde, ist toPlayer.magnitude die Entfernung über dem Boden. Ein Spieler, der auf einer Kiste neben dem Schleim steht, gilt also trotzdem als neben ihm.

Eine einzelne Reichweite hat eine Schwachstelle. Ein Spieler, der an ihrem Rand steht, gerät abwechselnd hinein und hinaus, und der Schleim beginnt immer wieder, sich zu bewegen, und hält wieder an. Gegner vermeiden das mit zwei Reichweiten: Sie bemerken den Spieler innerhalb einer kurzen Reichweite und geben erst jenseits einer größeren Reichweite auf. Ein bool merkt sich, ob der Gegner gerade verfolgt, und zwischen den beiden Reichweiten ändert sich nichts daran, sodass der Gegner mit dem weitermacht, was er gerade tut.

challenge icon

Aufgabe

Mittel

Ein Wolf jagt im Wald. Schreibe das Wolf-Skript für den Wolf. Der Inspector weist ihm player, speed (3), noticeRange (4) und giveUpRange (8) zu. Das Player-Skript ist fertig.

  • Ein bool-Feld namens chasing gibt an, ob der Wolf jagt. Es beginnt mit false.
  • Miss bei jedem Physikschritt die Entfernung zum Spieler über den Boden (ohne Höhe). Näher als noticeRange: chasing wird zu true. Weiter entfernt als giveUpRange: Es wird zu false. Dazwischen bleibt der Wert unverändert.
  • Während der Wolf jagt, läuft er mit seinem Rigidbody und mit speed auf den Spieler zu und behält dabei seine y-Geschwindigkeit bei. Andernfalls steht er still: x- und z-Geschwindigkeit 0.

Drücke Play, gehe auf den Wolf zu und laufe dann weg. Klicke anschließend auf Check.

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 hinterherjagen oder stehen bleiben
    }
}
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