Pattugliare e inseguire
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 54 di 71.
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 si muovono 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 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 scenderebbe mai sotto 1 e la sentinella non invertirebbe mai la direzione. Il controllo richiede una distanza inferiore a 0.2, non esattamente 0: a 2 unità al secondo la sentinella si sposta di 0.04 unità a ogni passo e quasi mai arriva esattamente alla postazione.
Sfida
MedioFai pattugliare al robot i suoi punti di passaggio e inseguire il giocatore che si avvicina.
- Scrivi
WalkTo(Vector3 target), impostandorb.linearVelocityverso di esso sul terreno alla velocitàspeed, mantenendo la velocità sull’asse y. - In
FixedUpdate(), quando il giocatore è più vicino dichaseRange, usaWalkTo(player.position)ereturn. - Altrimenti, quando la distanza da
waypoints[next]è inferiore a 0.2, impostanext = (next + 1) % waypoints.Length;, quindi cammina versowaypoints[next].
Premi «Gioca» e attraversa il suo percorso. Poi premi «Verifica».
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 player quando è vicino, altrimenti percorri il percorso di pattuglia
}
}
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 rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere3Trigger
Collider triggerOnTriggerEnterOggetti da raccogliereLe casse tengono il restoZone letaliEntrare e uscireRiepilogo: chiave e porta6Raycast
Physics.RaycastRaycastHitControllo del terreno con un RayLayer e LayerMaskLinea di vistaOverlapSphere e SphereCastRiepilogo: filo laser9Nemici
Inseguire il giocatoreInseguire a portataPattugliare e inseguireSalute e danniProiettili che colpisconoContraccolpoRiepilogo: Cane da guardiaEsercitati da solo: Playground Unity