Physics.Raycast
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 33 de 63.
Un raycast lanza una línea invisible desde un punto en una dirección e informa de si ha alcanzado un colisionador. Physics.Raycast(origin, direction, maxDistance) devuelve true cuando hay un colisionador en la línea dentro de maxDistance unidades, y false en caso contrario. Este coche frena cuando hay algo a menos de 2 unidades por delante del morro:
public float brakeDistance = 2f;
void Update()
{
if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
{
Debug.Log("Brake!");
}
}transform.forward gira con el coche, así que el rayo siempre apunta hacia fuera desde su morro; Vector3.forward siempre apuntaría a lo largo del eje z del mundo. El rayo empieza en el centro del coche, dentro de su propio colisionador, y un rayo nunca informa de un colisionador en cuyo interior empieza, así que el coche no se detecta a sí mismo. Si omites maxDistance, el rayo se extiende para siempre: el coche frenaría ante una pared al otro lado del mapa.
Los rayos detectan colisionadores, no lo que se dibuja: un objeto con un Renderer y sin colisionador es invisible para ellos, y un colisionador de tipo trigger cuenta como impacto. Mientras haces pruebas, Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) dibuja el rayo en la vista Scene de Unity.
Desafío
IntermedioHaz automática la puerta de la tienda. El script DoorSensor está en el Sensor situado sobre la entrada, a 3.5 unidades del suelo. El Inspector le asigna door y un reach de 3.
- En cada fotograma, lanza un rayo desde el Sensor directamente hacia abajo, de
reachunidades de longitud. - Mientras el rayo golpee algo, la puerta está abierta: ocúltala con
SetActive(false). Cuando no golpee nada, vuelve a mostrar la puerta.
El suelo queda fuera del alcance del rayo, así que la puerta permanece cerrada hasta que alguien se coloca debajo del Sensor. Pulsa Play y haz que el Visitante camine debajo con las flechas; después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
public class DoorSensor : MonoBehaviour
{
public GameObject door;
public float reach = 3f;
void Update()
{
// Abre la puerta mientras el rayo proyectado hacia abajo desde el Sensor impacte contra algo.
}
}
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