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.
Desafío
IntermedioColorea al centinela de rojo mientras pueda ver al jugador y de verde en caso contrario.
- Escribe
bool CanSee(): conVector3 toPlayer = player.position - transform.position;, devuelvefalsecuandotoPlayer.magnitude > range. - Después, lanza
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)y devuelvehit.transform == player; si no hay impacto, devuelvefalse. - En
Update(), establece el color de la torre enColor.redoColor.greensegún el resultado deCanSee().
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
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity