Menu
CoddyTech

Physics.Raycast

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

Un raycast dispara una línea invisible desde un punto en una dirección e informa si ha chocado con un colisionador. Physics.Raycast(origin, direction, maxDistance) devuelve true cuando hay un colisionador en la línea dentro de una distancia 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 el morro; Vector3.forward siempre apuntaría a lo largo del eje z del mundo. El rayo comienza en el centro del coche, dentro de su propio colisionador, y un rayo nunca informa de un colisionador en cuyo interior comienza, así que el coche no se detecta a sí mismo. Omite maxDistance y el rayo se prolonga 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 un impacto. Mientras haces pruebas, Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) dibuja el rayo en la vista Scene de Unity.

challenge icon

Desafío

Intermedio

Haz que la puerta de la tienda se abra cuando alguien esté debajo del sensor.

  1. En Update(), comprueba Physics.Raycast(transform.position, Vector3.down, reach): un rayo recto hacia abajo, de reach unidades de longitud, que se detiene sobre el suelo.
  2. Cuando sea verdadero, llama a door.SetActive(false); y, en el else, a door.SetActive(true);.

Pulsa «Jugar» y lleva al visitante debajo del sensor: la puerta se abre y se cierra detrás de él. Después, pulsa «Comprobar».

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 que apunta hacia abajo desde el Sensor impacte contra algo.
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity