Menu
CoddyTech

Línea de visión

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 39 de 71.

Estar cerca de un guardia no es lo mismo que ser visto por él: una pared en medio bloquea la visión. Para comprobar la línea de visión, lanza un rayo desde el ojo hacia el objetivo y verifica que lo primero que alcanza sea el propio objetivo. La dirección es la posición del objetivo menos la tuya, y un rayo de esa longitud llega hasta el objetivo:

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 cámara de seguridad sobre un pilar registra I see you mientras CanSee() sea verdadero. Con el objetivo a la vista, el primer impacto del rayo es el objetivo. Si el objetivo está detrás de una caja, el rayo alcanza primero la caja, hit.transform es el de la caja y la respuesta es falsa. Physics.Raycast por sí solo también devuelve verdadero para la caja, por eso se compara el impacto con el objetivo.

El objetivo necesita un colisionador para que el rayo lo encuentre. El rayo no necesita una dirección normalizada, ya que su longitud proviene de maxDistance. Physics.Linecast(from, to) plantea la pregunta al revés: si hay algún colisionador entre dos puntos. !Physics.Linecast(eye, target.position, wallMask) significa que no hay ninguna pared en medio.

challenge icon

Desafío

Intermedio

Colorea al centinela de rojo mientras pueda ver al jugador y de verde en caso contrario.

  1. Escribe bool CanSee(): con Vector3 toPlayer = player.position - transform.position;, devuelve false cuando toPlayer.magnitude > range.
  2. Después, lanza Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) y devuelve hit.transform == player; si no hay impacto, devuelve false.
  3. En Update(), establece el color de la torre en Color.red o Color.green según el resultado de CanSee().

Pulsa «Jugar» y camina detrás de la pared. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Rojo mientras el centinela pueda ver al jugador; verde en caso contrario.
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity