Insegui nel raggio
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 51 di 63.
La maggior parte dei nemici ti lascia in pace finché non ti avvicini. Misura la distanza dal giocatore a ogni aggiornamento fisico e inseguilo solo entro un certo raggio. Questo slime ti insegue entro sightRange e resta fermo al di fuori:
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 clausola else è importante: un Rigidbody mantiene la sua velocità finché qualcosa non la cambia. Senza di essa, uno slime che ti perde di vista continua a scivolare finché l'attrito non lo ferma, e sul ghiaccio non si ferma mai. Poiché y è stata impostata prima a 0, toPlayer.magnitude è la distanza sul terreno, quindi un giocatore in piedi su una cassa accanto allo slime risulta comunque accanto a lui.
Un unico raggio ha un punto debole. Un giocatore fermo sul suo limite entra e esce continuamente dal raggio, e lo slime parte e si ferma di continuo. I nemici evitano questo problema usando due raggi: notano il giocatore entro un raggio corto e rinunciano all'inseguimento solo 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 ciò che stava facendo.
Sfida
MedioUn lupo caccia nella foresta. Scrivi lo script Wolf sul lupo. L'Inspector gli assegna player, speed (3), noticeRange (4) e giveUpRange (8). Lo script Player è pronto.
- Un campo
boolchiamatochasingindica se il lupo sta inseguendo. Inizia confalse. - A ogni passo di fisica, misura la distanza dal giocatore sul terreno (senza altezza). Più vicino di
noticeRange:chasingdiventatrue. Più lontano digiveUpRange: diventafalse. Nel mezzo, rimane com'è. - Mentre insegue, il lupo corre verso il giocatore a
speedusando il suo Rigidbody, mantenendo la velocità y. Altrimenti resta fermo: velocità x e z pari a 0.
Premi Play, avvicinati al lupo e scappa, poi Check.
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, poi inseguilo o resta fermo
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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 rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere3Trigger
Collider di triggerOnTriggerEnterOggetti da raccogliereZone letaliEntrata e uscitaRiepilogo: chiave e porta6Raycast
Physics.RaycastRaycastHitControllo del terreno con un RayLayer e LayerMaskLinea di vistaOverlapSphere e SphereCastRiepilogo: filo laser9Nemici
Insegui il giocatoreInsegui nel raggioPattuglia e inseguiSalute e danniContraccolpoRiepilogo: cane da guardia