Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Un 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 int chiamato next, 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, passa next al 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 speed sul 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
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay