Inseguire a portata
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 53 di 71.
La maggior parte dei nemici ti lascia in pace finché non ti avvicini. Misura la distanza dal giocatore a ogni passo della fisica e inseguilo solo entro un certo raggio. Questo slime insegue entro sightRange e resta fermo al di fuori di esso:
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
if (toPlayer.magnitude < sightRange)
{
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
else
{
rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
}
}La parte else è importante: un Rigidbody mantiene la sua velocità finché qualcosa non la modifica. Senza questa parte, uno slime che ti perde di vista continua a scivolare finché l'attrito non lo ferma, e sul ghiaccio non si ferma mai. Poiché prima abbiamo impostato y su 0, toPlayer.magnitude è la distanza sul terreno, quindi un giocatore in piedi su una cassa accanto allo slime è comunque considerato accanto a lui.
Un solo raggio ha un punto debole. Un giocatore fermo sul suo bordo entra e esce dal raggio, e lo slime continua ad avviarsi e fermarsi. I nemici evitano questo problema usando due raggi: notano il giocatore entro un raggio breve e rinunciano solo quando è oltre un raggio più ampio. Un bool ricorda se il nemico sta inseguendo e, tra i due raggi, nulla lo modifica, quindi il nemico continua a fare quello che stava facendo.
Sfida
MedioFai in modo che il lupo noti il giocatore da vicino e rinunci quando è lontano.
- In
FixedUpdate(), calcola la distanza sul piano dal giocatore: se è inferiore anoticeRange, imposta il campobool chasingsutrue; se è superiore agiveUpRange, impostalo sufalse. - Quando
chasingè attivo, impostarb.linearVelocityverso il giocatore alla velocitàspeed, mantenendo il valore y. - Altrimenti imposta
rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.
Premi «Gioca», avvicinati al lupo e poi scappa. Quindi premi «Verifica».
Provalo tu
using UnityEngine;
public class Wolf : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float speed = 3f;
[SerializeField] private float noticeRange = 4f;
[SerializeField] private float giveUpRange = 8f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// individua il player, rinuncia a inseguirlo e inseguilo oppure resta fermo
}
}
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