Linea di vista
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 37 di 63.
Essere vicino a una guardia non è la stessa cosa che essere visto da essa: una parete in mezzo blocca la visuale. Per verificare la linea di vista, lancia un raggio dall'occhio verso il bersaglio e controlla che la prima cosa che colpisce sia il bersaglio stesso. La direzione è la posizione del bersaglio meno la tua, e un raggio di quella lunghezza raggiunge il bersaglio:
public Transform target;
bool CanSee()
{
Vector3 toTarget = target.position - transform.position;
if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
{
return hit.transform == target;
}
return false;
}Una telecamera di sicurezza su un pilastro registra I see you mentre CanSee() è true. Con il bersaglio allo scoperto, il primo oggetto colpito dal raggio è il bersaglio. Con il bersaglio dietro una cassa, il raggio colpisce prima la cassa, hit.transform è quello della cassa e il risultato è false. Physics.Raycast da solo restituisce true anche per la cassa, ed è per questo che l'oggetto colpito viene confrontato con il bersaglio.
Il bersaglio ha bisogno di un collider perché il raggio possa individuarlo. Il raggio non ha bisogno di una direzione normalizzata, poiché la sua lunghezza è determinata da maxDistance. Physics.Linecast(from, to) pone la domanda al contrario, chiedendo se ci sia un collider tra due punti: !Physics.Linecast(eye, target.position, wallMask) significa che non ci sono pareti di mezzo.
Sfida
MedioLa torre di guardia sorveglia il giocatore. Lo script Sentry si trova sulla torre e l’Inspector gli assegna il player e un range pari a 8. Il colore della torre mostra cosa vede:
- Quando riesce a vedere il giocatore, colora la torre di rosso (
Color.red) e, altrimenti, di verde (Color.green). - Vede il giocatore solo quando questo si trova a una distanza non superiore a
rangeunità e non c’è nulla in mezzo.
Premi Play e fai muovere il giocatore intorno al muro con le frecce, poi premi Check.
Provalo tu
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// Rosso quando la sentinella può vedere player, verde altrimenti.
}
}
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 raccogliere