Patrouillieren und verfolgen
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 54 von 71.
Eine Wache auf Patrouille geht eine Route ab, bis sie den Spieler sieht, nimmt die Verfolgung auf 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 Gehen für beide übernehmen. Dieser Wachposten geht 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. Dadurch hat die Verfolgung Vorrang, sobald der Spieler in der Nähe ist. goal ist ein Feld, daher behält der Wachposten sein Ziel während einer Verfolgung bei: Sobald der Spieler verschwunden ist, geht er weiter zu dem Posten, auf den er unterwegs war.
Die Ankunftsprüfung misst die Entfernung entlang des Bodens. Die Posten sind Markierungen auf dem Boden, und der Mittelpunkt des Wachpostens befindet sich 1 Einheit über ihnen. Eine Entfernung, in die auch die Höhe einfließt, wird daher nie kleiner als 1, und der Wachposten würde sich niemals umdrehen. Die Prüfung verlangt weniger als 0.2, nicht genau 0: Bei 2 Einheiten pro Sekunde bewegt sich der Wachposten pro Schritt um 0.04 Einheiten und kommt fast nie genau auf dem Posten an.
Aufgabe
MittelLass den Roboter seine Wegpunkte ablaufen und den Spieler verfolgen, wenn dieser sich nähert.
- Schreibe
WalkTo(Vector3 target)und setzerb.linearVelocityin Richtung des Ziels über den Boden aufspeed, wobei die y-Geschwindigkeit erhalten bleibt. - Rufe in
FixedUpdate(), wenn der Spieler näher alschaseRangeist,WalkTo(player.position)auf und führereturnaus. - Wenn der Abstand zu
waypoints[next]weniger als 0.2 beträgt, setzenext = (next + 1) % waypoints.Length;und gehe dann zuwaypoints[next].
Drücke „Spielen“ und kreuze seinen Weg. Drücke dann „Prüfen“.
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
}
}
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