Menu
CoddyTech

Den Spieler verfolgen

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

Ein Gegner, der den Spieler verfolgt, braucht ein Rigidbody, damit Wände ihn aufhalten und er schieben und geschoben werden kann. Die Verfolgung selbst erfolgt über eine Geschwindigkeit in Richtung des Spielers, die einmal pro Physikschritt festgelegt wird. Dieser Zombie läuft auf alles zu, was sich in seinem player-Feld befindet:

[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;

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

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

player.position - rb.position zeigt vom Zombie zum Spieler. Der y-Wert wird auf 0 gesetzt, damit der Zombie auf ebener Höhe läuft, wenn der Spieler höher oder tiefer steht, und normalized gibt dem Vektor die Länge 1, sodass der Zombie mit speed läuft, egal, ob der Spieler 2 oder 20 Einheiten entfernt ist. Die neue Geschwindigkeit übernimmt die alte y-Geschwindigkeit, sodass die Schwerkraft den Zombie weiterhin von einer Stufe herunterzieht. Bei seinem Rigidbody ist Freeze Rotation aktiviert, damit er beim Laufen nicht umkippt.

Eine festgelegte Geschwindigkeit sorgt für einen Läufer, der sofort losläuft und die Richtung ändert. Ein schwerer Gegner, etwa ein rollendes Fass, wird stattdessen im selben FixedUpdate mit AddForce angeschoben: Er nimmt an Geschwindigkeit zu, behält seinen Schwung bei und schießt über das Ziel hinaus, wenn der Spieler zur Seite tritt.

Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);

Vermeide es, den Transform eines Verfolgers zu bewegen: So landet er genauso leicht in einer Wand wie an jeder anderen Stelle, und die Physik-Engine kann ihn anschließend nur wieder hinausschieben.

challenge icon

Aufgabe

Mittel

Lass den Felsbrocken dem Spieler hinterherrollen.

  1. Setze in FixedUpdate() Vector3 toPlayer = player.position - rb.position; und toPlayer.y = 0f;, damit der Schub am Boden entlang wirkt.
  2. Rufe rb.AddForce(toPlayer.normalized * force); auf, damit der Schub in der Nähe und in der Ferne gleich bleibt. Lass die Rotation frei, damit die Reibung ihn ins Rollen bringt.

Drücke „Spielen“ und laufe Kreise um den Felsbrocken. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class Boulder : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float force = 6f;
    private Rigidbody rb;

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

    void FixedUpdate()
    {
        // Schiebe den Felsbrocken am Boden entlang in Richtung des Spielers
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground