Sombra Dinámica con Line Trace | Tutorial Unreal Engine Paso a Paso

Te voy a mostrar cómo implementé una sombra que sigue al player. Esto es muy común en juegos como Crash o incluso Mario, y su utilidad principal es permitir al jugador saber exactamente dónde va a aterrizar el personaje. Es una ayuda visual clave en juegos de plataforma.

Detectar los estados del salto

Primero, debes detectar los estados del personaje: cuándo va a saltar, cuándo está en el aire, y cuándo termina el salto. Justamente eso es lo que tengo aquí. La lógica comienza con el estado JumpStart (cuando inicia el salto), seguido por Jumping (cuando está en el aire), y finalmente JumpEnd.

Estos eventos los llamo como:

  • EventJumpStart
  • EventJumpEnd
  • EventOnLanded

En este caso uso el evento Event OnLanded de Unreal, que se ejecuta cuando el personaje aterriza, es decir, al terminar el salto.

Estos eventos los personalicé. Por ejemplo, EventStart lo llamo directamente en el Event Graph, cuando se ejecuta la tecla de salto:

EventStart Jump Start

 Aquí puedes verlo. El resto de la lógica no importa tanto, lo relevante es el momento del llamado.

Una vez detectado que el jugador está en el aire, puedo llamar al evento EventJumping. Para eso uso el nodo SetTimerByFunctionName, que me permite ejecutar una función repetidamente cada cierto tiempo. En lugar de un Tick, uso este sistema porque solo quiero detectar el estado de salto, no hacer procesamiento continuo.

En este caso, llamo el evento cada 0.01 segundos, lo que me da un control fino sin consumir demasiados recursos. Esta función lo que hace es actualizar la posición de la sombra:

Set timer by function Name

Configuración de la sombra

Primero, tengo un halo de referencia (HaloJumpRef), que es un plane oculto posicionado en el suelo. Aunque podrías usar directamente la posición del jugador, así evito hacer cálculos extra, simplemente lo uso como punto base.

La sombra se mueve junto con el player. Podría haber usado GetActorLocation, pero preferí utilizar la posición del halo como punto de referencia:

 

Line trace

Proyección con Line Trace

Por eso decidí usar LineTraceByChannel, que es muy usado en juegos de disparos. En mi caso, proyecto un rayo hacia abajo, no hacia la cámara ni la dirección del jugador.

Esto simplifica todo, ya que no tengo que calcular la dirección con forward vector. El rayo comienza unos 20 unidades por debajo de los pies del player para evitar colisiones consigo mismo (uso IgnoreSelf por precaución).

El tamaño del vector lo fijé en -100, ya que el rayo va hacia abajo. Si lo colocas positivo, iría hacia arriba, lo cual no tiene sentido para esta lógica. Solo ten en cuenta que el valor negativo indica la dirección vertical descendente.

Lo más importante de todo es la información que devuelve el Hit Result. Nos interesa específicamente:

  • El actor golpeado (por si necesitas lógica adicional).
  • La posición del impacto, que usaremos para colocar la sombra.

En mi caso, tomo la coordenada Z del impacto (la altura) y la combino con las coordenadas X e Y del halo de referencia, para mantener la sombra sincronizada con el player.

Visualización y depuración

Activa el modo Debug para ver los rayos, que en mi caso duran 5 segundos. Esto es útil para ver qué se está proyectando y si está funcionando bien.

También es buena práctica imprimir qué actor está golpeando el rayo (Hit Actor). Así podrás ver, por ejemplo, si está devolviendo None o Ninguno, lo cual indica que el rayo no está golpeando nada.

Problema de proyección con el Line Trace y solución

En algunos casos, la sombra no se proyectaba correctamente. Por ejemplo, cuando el personaje salta, la sombra a veces desaparece o no aparece del todo. Esto es porque el Line Trace fallaba aleatoriamente.

Después de varias pruebas, descubrí que el problema estaba en la posición del escenario. Algunos de mis niveles tenían posiciones negativas en el eje Z. Al mover todo el escenario hacia arriba (posición positiva), el problema desapareció mágicamente.

Conclusión

De esta forma, implementé el efecto de sombra dinámica que sigue al jugador. Es una solución extremadamente útil, sencilla, y muy efectiva en juegos de plataforma.

En resumen:

  • El evento se ejecuta cada 0.01 segundos usando SetTimerByFunctionName.
  • Se detiene al aterrizar usando PauseTimerByFunctionName.
  • Si el Line Trace falla, verifica la posición del nivel.

Acepto recibir anuncios de interes sobre este Blog.

Te muestro cómo Hacer que una Sombra Siga al Player con Line Trace en Unreal Engine

- Andrés Cruz

In english