Pattuglia e insegui
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 52 di 63.
Una guardia di pattuglia percorre un tragitto finché non vede il giocatore, lo insegue e torna al suo tragitto quando il giocatore non c’è più. Entrambi i comportamenti guidano il movimento nello stesso modo, verso un punto, quindi un unico metodo può gestire gli spostamenti in entrambi i casi. Questa sentinella cammina avanti e indietro tra due postazioni e insegue il giocatore entro 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);
}Il controllo dell’inseguimento viene prima e il suo return salta il codice di pattuglia, quindi l’inseguimento ha la precedenza ogni volta che il giocatore è vicino. goal è un campo, quindi la sentinella se lo ricorda durante un inseguimento: quando il giocatore non c’è più, prosegue verso la postazione che stava raggiungendo.
Il controllo dell’arrivo misura la distanza sul terreno. Le postazioni sono indicatori sul pavimento e il centro della sentinella si trova 1 unità sopra di esse, quindi una distanza che include l’altezza non scende mai sotto 1 e la sentinella non si girerebbe mai. Il controllo verifica che la distanza sia inferiore a 0.2, non esattamente 0: a 2 unità al secondo la sentinella si sposta di 0.04 unità per passo e quasi mai arriva esattamente alla postazione.
Sfida
MedioUn robot di sicurezza pattuglia il magazzino. Scrivi lo script Robot. L’Inspector gli fornisce waypoints (i quattro indicatori gialli da W0 a W3, in ordine), player, speed (4) e chaseRange (4). Lo script Player è pronto.
- Un campo
intchiamatonext, che parte da 0, è l’indice del waypoint verso cui il robot sta camminando. - Pattuglia: cammina fino a
waypoints[next]. Quando la distanza da esso sul terreno è inferiore a 0.2, passanextal waypoint successivo e, dopo l’ultimo, torna a 0. - Inseguimento: finché la distanza del giocatore sul terreno è inferiore a
chaseRange, cammina invece verso il giocatore. - Quando il giocatore si allontana, riprendi a dirigerti verso
waypoints[next], il waypoint verso cui eri diretto. - Muoviti impostando la velocità del Rigidbody a
speedsul terreno, mantenendo la sua velocità y.
Premi Play, osserva un giro di pattuglia e attraversa il suo percorso, poi premi Check.
Provalo tu
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()
{
// insegui il giocatore quando è vicino, altrimenti segui il percorso di pattuglia
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere3Trigger
Collider di triggerOnTriggerEnterOggetti da raccogliereZone letaliEntrata e uscitaRiepilogo: chiave e porta6Raycast
Physics.RaycastRaycastHitControllo del terreno con un RayLayer e LayerMaskLinea di vistaOverlapSphere e SphereCastRiepilogo: filo laser9Nemici
Insegui il giocatoreInsegui nel raggioPattuglia e inseguiSalute e danniContraccolpoRiepilogo: cane da guardia