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.
Aufgabe
MittelSorge dafür, dass der Wolf den Spieler aus der Nähe bemerkt und ihn aus der Ferne nicht mehr verfolgt.
- Nimm in
FixedUpdate()die flache Distanz zum Spieler: Bei weniger alsnoticeRangesetze das Feldbool chasingauftrue; bei mehr alsgiveUpRangeauffalse. - Setze während
chasingrb.linearVelocityauf eine Geschwindigkeit vonspeedin Richtung des Spielers und behalte dabei den y-Wert bei. - 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
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ür3Trigger
Trigger-ColliderOnTriggerEnterSammelobjekteKisten behalten den RestTodeszonenBetreten und VerlassenRückblick: Schlüssel und Tür6Raycasts
Physics.RaycastRaycastHitBodenprüfung mit einem RayLayer und LayerMaskSichtlinieOverlapSphere und SphereCastRückblick: Laser-Lichtschranke9Gegner
Den Spieler verfolgenVerfolgung in ReichweitePatrouillieren und verfolgenGesundheit und SchadenTreffende KugelnRückstoßRückblick: WachhundÜbe selbstständig: Unity-Playground