Linea di vista
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 39 di 71.
Essere vicino a una guardia non significa che questa ti veda: un muro in mezzo le impedisce di vederti. Per verificare la linea di vista, lancia un raggio dall'occhio verso il bersaglio e controlla che la prima cosa che colpisce sia proprio il bersaglio. 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. Se il bersaglio è dietro una cassa, il raggio colpisce prima la cassa, hit.transform corrisponde a quella della cassa e il risultato è false. Anche Physics.Raycast da solo restituisce true per la cassa, perciò il risultato del colpo viene confrontato con il bersaglio.
Il bersaglio ha bisogno di un collider perché il raggio possa trovarlo. Non serve che la direzione del raggio sia normalizzata, perché la sua lunghezza deriva da maxDistance. Physics.Linecast(from, to) pone la domanda al contrario: se un collider si trova tra due punti. !Physics.Linecast(eye, target.position, wallMask) significa che non c'è nessun muro di mezzo.
Sfida
MedioColora la sentinella di rosso quando riesce a vedere il giocatore, altrimenti di verde.
- Scrivi
bool CanSee(): conVector3 toPlayer = player.position - transform.position;, restituiscifalsequandotoPlayer.magnitude > range. - Poi esegui il raycast
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)e restituiscihit.transform == player; se non colpisce nulla, restituiscifalse. - In
Update(), imposta il colore della torre suColor.redoColor.greenin base aCanSee().
Premi «Gioca» e cammina dietro il muro. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// Rosso quando la sentinella può vedere il giocatore, verde altrimenti.
}
}
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