Patrouillieren und Verfolgen
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 52 von 63.
Eine Wache auf Patrouille läuft eine Route ab, bis sie den Spieler sieht, verfolgt ihn und kehrt zu ihrer Route zurück, sobald der Spieler verschwunden ist. Beide Verhaltensweisen steuern auf dieselbe Weise, auf einen Punkt zu, daher kann eine Methode das Laufen für beide übernehmen. Dieser Wächter läuft zwischen zwei Posten hin und her und verfolgt den Spieler innerhalb von chaseRange:
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;
void Start()
{
rb = GetComponent<Rigidbody>();
goal = pointA;
}
void FixedUpdate()
{
if (Flat(player.position - rb.position).magnitude < chaseRange)
{
WalkTo(player.position);
return;
}
if (Flat(goal.position - rb.position).magnitude < 0.2f)
{
goal = goal == pointA ? pointB : pointA;
}
WalkTo(goal.position);
}
void WalkTo(Vector3 target)
{
Vector3 dir = Flat(target - rb.position).normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
Vector3 Flat(Vector3 v)
{
return new Vector3(v.x, 0f, v.z);
}Die Verfolgungsprüfung kommt zuerst, und ihr return überspringt den Patrouillencode, sodass das Verfolgen Vorrang hat, wenn der Spieler in der Nähe ist. goal ist ein Feld, daher merkt sich der Wächter sein Ziel während einer Verfolgung: Sobald der Spieler verschwunden ist, läuft er weiter zu dem Posten, auf den er bereits zugesteuert hat.
Die Ankunftsprüfung misst die Entfernung über den Boden. Die Posten sind Markierungen auf dem Boden und der Mittelpunkt des Wächters befindet sich 1 Einheit über ihnen. Eine Entfernung, die die Höhe berücksichtigt, wird daher nie kleiner als 1, und der Wächter würde sich nie umdrehen. Die Prüfung verlangt weniger als 0.2, nicht genau 0: Bei 2 Einheiten pro Sekunde bewegt sich der Wächter pro Schritt um 0.04 Einheiten und landet fast nie genau auf dem Posten.
Aufgabe
MittelEin Sicherheitsroboter patrouilliert im Lagerhaus. Schreibe das Skript Robot. Der Inspector weist ihm waypoints (die vier gelben Markierungen W0 bis W3, in dieser Reihenfolge), player, speed (4) und chaseRange (4) zu. Das Skript Player ist fertig.
- Ein
int-Feld namensnext, das bei 0 beginnt, ist der Index des Wegpunkts, zu dem der Roboter läuft. - Patrouille: Laufe zu
waypoints[next]. Sobald der Roboter am Boden weniger als 0.2 davon entfernt ist, setzenextauf den folgenden Wegpunkt und nach dem letzten wieder auf 0. - Verfolgung: Solange der Spieler am Boden weniger als
chaseRangeentfernt ist, laufe stattdessen zum Spieler. - Wenn sich der Spieler entfernt, laufe weiter zu
waypoints[next], dem Wegpunkt, zu dem der Roboter unterwegs war. - Bewege dich, indem du die Geschwindigkeit des Rigidbody am Boden auf
speedsetzt und dabei seine y-Geschwindigkeit beibehältst.
Drücke Play, beobachte eine Runde der Patrouille und kreuze ihren Weg, dann Check.
Probier es selbst
using UnityEngine;
public class Robot : MonoBehaviour
{
[SerializeField] private Transform[] waypoints;
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float chaseRange = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Verfolge den Spieler, wenn er in der Nähe ist, oder laufe die Patrouillenroute ab
}
}
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