Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Colora la sentinella di rosso quando riesce a vedere il giocatore, altrimenti di verde.

  1. Scrivi bool CanSee(): con Vector3 toPlayer = player.position - transform.position;, restituisci false quando toPlayer.magnitude > range.
  2. Poi esegui il raycast Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) e restituisci hit.transform == player; se non colpisce nulla, restituisci false.
  3. In Update(), imposta il colore della torre su Color.red o Color.green in base a CanSee().

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

Esercitati da solo: Playground Unity