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.
Aufgabe
MittelEin 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 namenschasinggibt an, ob der Wolf jagt. Es beginnt mitfalse. - Miss bei jedem Physikschritt die Entfernung zum Spieler über den Boden (ohne Höhe). Näher als
noticeRange:chasingwird zutrue. Weiter entfernt alsgiveUpRange: Es wird zufalse. Dazwischen bleibt der Wert unverändert. - Während der Wolf jagt, läuft er mit seinem Rigidbody und mit
speedauf 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
}
}
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