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.
Sfida
MedioFai rotolare il masso dietro al giocatore.
- In
FixedUpdate(), impostaVector3 toPlayer = player.position - rb.position;etoPlayer.y = 0f;, così la spinta resta parallela al terreno. - 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
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 raccogliereEsercitati da solo: Playground Unity