Resumen

Programar el disparo de un arma en un first person shooter requiere entender cómo detectar colisiones a distancia. Unity ofrece una herramienta poderosa llamada raycast que permite proyectar un rayo invisible desde un punto del espacio y determinar con qué objetos colisiona. A continuación se explica paso a paso cómo implementar esta mecánica directamente en el motor.

¿Qué es un raycast y para qué sirve en Unity?

Un raycast es una utilidad de Unity que proyecta una línea invisible —un rayo— desde un punto específico en una dirección determinada [0:06]. Al colisionar con otros elementos del escenario, devuelve información sobre el objeto impactado. Sus aplicaciones son enormes:

  • Detectar la distancia al piso en juegos 2D.
  • Identificar enemigos para sistemas de proyectiles.
  • Implementar mecánicas de disparo en shooters.
  • Crear interacciones en juegos de realidad virtual o RPGs.

En este caso se utiliza en su forma más sencilla: disparar desde la cámara del jugador y registrar qué objeto fue impactado.

¿Cómo se configura el script de disparo con raycast?

El primer paso es crear un nuevo script en C# dentro de la carpeta de scripts del proyecto [1:30]. Dentro de este script se necesitan dos elementos fundamentales.

¿Qué variables se deben declarar?

Se declara una variable de tipo RaycastHit llamada hit. Esta variable almacenará toda la información de salida cuando el rayo colisione con algo [1:38]. También se declara una variable pública de tipo Camera llamada playerCam, que representa la cámara del jugador desde la cual se lanzará el rayo [2:28]. Es importante usar un nombre descriptivo como playerCam en lugar de solo cam, para que cualquier persona que edite el código entienda a qué se refiere.

¿Cómo se construye la llamada a Physics.Raycast?

Dentro de un bloque if, se invoca Physics.Raycast con los siguientes parámetros [2:50]:

  • playerCam.transform.position: define el punto de origen del rayo, que es la posición de la cámara del jugador.
  • playerCam.transform.forward: establece la dirección del rayo, es decir, hacia enfrente de la cámara.
  • out hit: indica que la información de la colisión se almacenará en la variable hit.
  • Rango: un valor numérico que determina la distancia máxima que recorrerá el rayo.

El orden lógico es claro: primero se invoca el raycast, luego se le indica desde dónde sale, en qué dirección viaja, dónde guarda los datos y qué alcance tiene.

¿Cómo se prueba el raycast en el editor de Unity?

Dentro del bloque if, se coloca un Debug.Log que imprime hit.transform.name en la consola [3:50]. Esto permite verificar exactamente a qué objeto del mundo le está pegando el rayo cada vez que se dispara.

Una vez guardado el script, se asigna al objeto del jugador (player) desde el inspector de Unity. Al agregarlo, el motor solicita la referencia a la cámara, así que se arrastra la cámara correspondiente al campo playerCam [4:18].

Para visualizar los raycasts durante la ejecución, conviene activar la opción de Gizmos en la vista de escena [4:30]. Al dar play y hacer clic con el mouse, el raycast se dispara hacia donde apunta la cámara.

¿Cómo verificar que funciona correctamente?

Al abrir la consola de Unity después de disparar, se puede ver el nombre del objeto impactado [4:50]. Por ejemplo, si se dispara hacia el terreno, la consola mostrará el nombre de ese terreno. Unity además agrupa los mensajes repetidos con un contador: si aparece un número quince junto al mensaje, significa que se disparó quince veces contra el mismo objeto [5:10].

Este debug es solo el primer paso. A partir de aquí se puede construir toda la lógica de daño, efectos visuales y mecánicas de combate sobre la base sólida que proporciona el raycast.

Si tu consola muestra el nombre del objeto al que disparaste, todo está funcionando perfectamente. ¿Qué mecánica te gustaría implementar sobre este raycast? Comparte tu avance y tus ideas.