Verfolge den Spieler
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 50 von 63.
Ein Gegner, der den Spieler verfolgt, benötigt einen Rigidbody, damit Wände ihn aufhalten und er schieben und geschoben werden kann. Die Verfolgung selbst erfolgt über eine Geschwindigkeit, die auf den Spieler ausgerichtet und einmal pro Physikschritt festgelegt wird. Dieser Zombie läuft auf alles zu, was sich in seinem player-Slot 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. Sein y-Wert wird auf 0 gesetzt, damit der Zombie auf ebener Höhe läuft, wenn der Spieler höher oder tiefer steht. Durch normalized erhält der 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 behält die alte y-Geschwindigkeit bei, 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 lässt einen Läufer sofort loslaufen und abbiegen. Einen schweren Gegner kannst du stattdessen im selben FixedUpdate mit AddForce anschieben: Er nimmt Geschwindigkeit auf, behält seinen Schwung bei und schießt über das Ziel hinaus, wenn der Spieler zur Seite tritt. Vermeide es, den Transform eines Verfolgers zu bewegen: So kann er genauso leicht in einer Wand landen wie irgendwo anders, und die Physik-Engine kann ihn erst danach wieder hinausschieben.
Aufgabe
MittelEin Felsbrocken rollt dem Spieler hinterher. Schreibe das Skript Boulder für den Felsbrocken, eine Kugel mit einem Rigidbody. Im Inspector weist du ihm player (den Player) und force (6) zu. Das Skript Player ist fertig: Mit den Pfeiltasten bewegst du den Spieler.
- Schiebe den Felsbrocken bei jedem Physikschritt mit
AddForcein Richtung des Spielers, und zwar mit einer Kraft vonforce, egal ob der Spieler nah oder weit entfernt ist. - Schiebe ihn nur über den Boden, ohne nach oben oder unten gerichteten Anteil, selbst wenn der Spieler auf der Kante steht.
- Bewege seinen Transform nicht und friere seine Rotation nicht ein: Durch Reibung rollt er.
Drücke Play, laufe Kreise um den Felsbrocken und klicke dann auf Check.
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
}
}
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
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand3Trigger
Trigger-ColliderOnTriggerEnterSammelobjekteTodeszonenBetreten und VerlassenRückblick: Schlüssel und Tür6Raycasts
Physics.RaycastRaycastHitBodenprüfung mit einem RayLayer und LayerMaskSichtlinieOverlapSphere und SphereCastRückblick: Laser-Lichtschranke9Gegner
Verfolge den SpielerVerfolgung in ReichweitePatrouillieren und VerfolgenGesundheit und SchadenRückstoßRückblick: Wachhund