Línea de visión
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 37 de 63.
Estar cerca de un guardia no es lo mismo que estar a la vista: 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 al 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 en un pilar registra I see you mientras CanSee() sea true. Con el objetivo a la vista, el primer impacto del rayo es el objetivo. Con el objetivo detrás de una caja, el rayo impacta primero en la caja, hit.transform es el de la caja y la respuesta es false. Physics.Raycast por sí solo también devuelve true para la caja, por eso se compara el impacto con el objetivo.
El objetivo necesita un collider para que el rayo lo encuentre. El rayo no necesita una dirección normalizada, ya que su longitud se obtiene de maxDistance. Physics.Linecast(from, to) plantea la pregunta al revés: si hay algún collider entre dos puntos. !Physics.Linecast(eye, target.position, wallMask) significa que no hay ninguna pared en medio.
Desafío
IntermedioLa torre centinela vigila al jugador. El script Sentry está en la torre, y el Inspector le asigna player y un range de 8. El color de la torre muestra lo que ve:
- Mientras pueda ver al jugador, colorea la torre de rojo (
Color.red) y, de lo contrario, de verde (Color.green). - Solo ve al jugador cuando este está a una distancia de no más de
rangeunidades y no hay nada en medio.
Pulsa Play y mueve al jugador alrededor del muro con las flechas; después, pulsa Check.
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.
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger