Menu
CoddyTech

RaycastHit

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

Physics.Raycast también puede decirte qué ha alcanzado. Añade out RaycastHit hit después de la dirección: cuando el método devuelve true, ha rellenado hit con los detalles. out es la forma en que un método de C# devuelve un valor adicional mediante una variable que le proporcionas. Este telémetro registra a qué apunta y a qué distancia está cuando pulsas Espacio:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f))
        {
            Debug.Log(hit.collider.name + " is " + hit.distance + " units away");
        }
    }
}

Si apunta a una pared cuya cara frontal está a 12 unidades, registra Wall is 12 units away. Los demás campos: hit.point es el punto del mundo donde el rayo tocó la superficie, hit.normal es la dirección hacia la que está orientada la superficie en ese punto ((0, 1, 0) en terreno llano), y hit.transform es el Transform del objeto alcanzado. Mediante hit.collider.gameObject puedes acceder a cualquier otro dato sobre él, como su etiqueta.

Lee hit solo dentro del if. Cuando el rayo no alcanza nada, Raycast devuelve false y hit no contiene nada útil: su collider es null.

challenge icon

Desafío

Intermedio

Dale a la pistola una mira láser. El script LaserSight está en el arma, y el Inspector le asigna el dot rojo (un Transform) y un range de 15. Las flechas izquierda y derecha giran el arma.

  • En cada fotograma, lanza un rayo desde el arma hacia delante, de range unidades de longitud.
  • Cuando impacte, muestra el punto y colócalo exactamente donde el rayo tocó la superficie.
  • Cuando no impacte con nada, oculta el punto con SetActive(false).

El Dot está en la capa Ignore Raycast, así que el rayo atraviesa el propio punto. Pulsa Play y barre con el láser la pared, la caja y el barril; después, pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class LaserSight : MonoBehaviour
{
    public Transform dot;
    public float range = 15f;

    void Update()
    {
        // Coloca dot donde el láser alcanza una superficie; ocúltalo cuando el láser no alcance nada.
    }
}
quiz iconPonte a prueba

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