Menu
CoddyTech

Inseguire il giocatore

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 52 di 71.

Un nemico che insegue il giocatore ha bisogno di un Rigidbody, così i muri lo fermano e lui può spingere ed essere spinto. L'inseguimento vero e proprio è una velocità diretta verso il giocatore, impostata una volta per ogni passo di fisica. Questo zombi cammina verso ciò che si trova nel suo slot player:

[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    Vector3 dir = toPlayer.normalized;
    rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}

player.position - rb.position punta dallo zombi al giocatore. La sua componente y viene impostata a 0, così lo zombi cammina in piano quando il giocatore si trova più in alto o più in basso, e normalized gli dà una lunghezza pari a 1, così lo zombi cammina alla velocità speed sia che il giocatore sia a 2 unità sia che sia a 20. La nuova velocità mantiene la vecchia velocità y, così la gravità continua a trascinare lo zombi giù da un gradino. Nel suo Rigidbody è attivato Freeze Rotation, così non si ribalta mentre cammina.

Impostare una velocità crea un nemico che cammina e parte e cambia direzione all'istante. Un nemico pesante, come un barile rotolante, viene spinto con AddForce nello stesso FixedUpdate: acquista velocità, mantiene il proprio slancio e supera il punto previsto quando il giocatore si sposta di lato.

Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);

Evita di spostare il Transform di un inseguitore: in questo modo può finire dentro un muro con la stessa facilità con cui può trovarsi altrove, e il motore fisico può solo spingerlo fuori in seguito.

challenge icon

Sfida

Medio

Fai rotolare il masso dietro al giocatore.

  1. In FixedUpdate(), imposta Vector3 toPlayer = player.position - rb.position; e toPlayer.y = 0f;, così la spinta resta parallela al terreno.
  2. Chiama rb.AddForce(toPlayer.normalized * force);, per ottenere la stessa spinta da vicino o da lontano. Lascia libera la rotazione, così l’attrito lo farà rotolare.

Premi «Gioca» e corri in cerchio intorno al masso. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class Boulder : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float force = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // spingi il masso verso il giocatore, lungo il terreno
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity