Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Fai pattugliare al robot i suoi punti di passaggio e inseguire il giocatore che si avvicina.

  1. Scrivi WalkTo(Vector3 target), impostando rb.linearVelocity verso di esso sul terreno alla velocità speed, mantenendo la velocità sull’asse y.
  2. In FixedUpdate(), quando il giocatore è più vicino di chaseRange, usa WalkTo(player.position) e return.
  3. Altrimenti, quando la distanza da waypoints[next] è inferiore a 0.2, imposta next = (next + 1) % waypoints.Length;, quindi cammina verso waypoints[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

Esercitati da solo: Playground Unity