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.
Aufgabe
MittelLass den Felsbrocken dem Spieler hinterherrollen.
- Setze in
FixedUpdate()Vector3 toPlayer = player.position - rb.position;undtoPlayer.y = 0f;, damit der Schub am Boden entlang wirkt. - 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
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground