ENGLISH l ESPAÑOL


PASTO INTERACTIVO EN UNITY

Crear pasto interactivo en Unity no es algo muy complicado, sin embargo hay poca información en la web de como lograrlo y más importante aún, nadie parece explicarlo del todo. En este artículo voy a mostrarte como hacer reaccionar el pasto con tu jugador de manera simple.


  • Utilizaremos Shader Graph y C# 
  • Uitlizaremos URP, pero también funciona con HDRP o LWRP
  • Se necesita conocimiento básico de programación en C# y Shaders


CREANDO EL OBJETO DE VEGETACIÓN

Primero, necesitaremos crear la geometría y texturas de nuestra vegetación, para eso puedes utilizar cualquier programa de modelado como Blender, Maya, 3Ds Max, etc. Únicamente debes prestar atención a lo siguiente:

Necesitas pintar los vértices de tu geometría, siendo negro absoluto en los vértices del piso y un color (Blanco, azul, rojo, verde) en la parte de arriba. Yo utilizaré rojo. ¿Por qué esto es importante?, dentro de nuestro Shader, le diremos que cuando nuestro pasto interactúe con el jugador se moverá todo lo que está pintado de color excepto el valor en negro, esto para asegurarnos que la raíz no se mueva y se quede pegada al suelo.




NOTA: Es importante que el objeto sea de extensión FBX, ya que el OBJ no contiene información de los 'Vertex Color'.


SHADER GRAPH

OBTENER LA DISTANCIA ENTRE LA HIERBA Y EL JUGADOR


Una vez que tengas tu objeto de pasto, lo importaremos a Unity y crearemos un Shader con shader graph. 

Comenzaremos determinar la distancia entre el jugador y el pasto, necesitamos saber esto para decirle al pasto que solo se mueva si el jugador está lo suficientemente cerca de él. 

Agregaremos una variable que nos permitirá controlar el radio de interacción entre el jugador y el pasto.



Comenzamos determinando la distancia entre nuestro objeto (el pasto) y la posición del jugador, para esto, usaremos un nodo de POSITION en WORLD SPACE (esto determinará la posición de los vértices de nuestro pasto), y crearemos un VECTOR3 y lo convertiremos en una propiedad nombrada como "trackerPosition", es muy importante que la referencia del VECTOR3 tenga un nombre que puedas identificar, ya que lo usaremos más adelante.

Finalmente, colocaremos un nodo de DISTANCE para determinar la distancia entre ambos objetos.

Procederemos a dividir el resultado por una variable flotante que podrás nombrar como quieras, en mi caso lo llamaré 'RADIUS' y lo convertiré en una propiedad para poderlo editar desde el inspector.



Saturamos el resultado con un nodo de SATURATE; Crearemos un nodo SUBTRACT con valor 1 al que restaremos nuestro resultado previo, esto nos permitirá invertir los valores. 

OBTENER LA DIRECCIÓN DEL JUGADOR CON RELACIÓN A LA HIERBA




Siguiendo, ahora debemos crear un nodo SUBTRACT para restar la posición del jugador a a la posición de nuestro pasto, y teniendo este resultado lo multiplicaremos por nuestro resultado anterior para obtener un único valor final.



Estamos a punto de acabar, vamos a crear un nodo "SPLIT" para conectar el resultado de nuestra multiplicación, esto va a separar el resultado en RGBA o XYZW.

Creamos un nodo 'POSITION' en WORLD SPACE y también vamos a conectarlo a un nodo 'SPLIT' para separar los mismos vectores,  crearemos dos nodos 'ADD' y conectaremos los vectores correspondientes como se muestra en la siguiente imágen:



Esto quiere decir que a nuestros vértices se les añadirá un valor que hará que se muevan en X(R) cuando el jugador esté en rango (o lo suficientemente cerca), lo mismo pasará con los vértices en la posición Z(B), mientras que en el eje Y(G) no se moverán, es decir, nuestro pasto en este ejemplo no se hará ni más alto ni más bajo, solo se moverá hacía los lados en los ejes X y Z.
Finalmente, combinamos el resultado en un nodo "COMBINE".



Crearemos un nodo "TRANSFORM" y conectaremos nuestro resultado anterior, esto nos permitirá transformar los cálculos anteriores desde 'World Space' a 'Object Space' y conectaremos eso al Output Position de nuestro Vertex Shader. 

CREANDO EL CÓDIGO DE C# PARA OBTENER LAS COORDENADAS DEL JUGADOR

Con esto hemos terminado parcialmente nuestro shader, sin embargo, aún no podemos saber la posición de nuestro jugador, para esto debemos crear un script de C# muy sencillo. 
El script encontrará a nuestro jugador por su nombre, y enviará la posición de éste a nuestro vector3 definida como "_trackerPosition".




Para que este script en particular funcione, tu objeto o jugador que tendrá interacción con el pasto debe llamarse "tracker" ya que nuestro código lo encontrará por nombre, y es muy importante que en el shader tu variable "trackerPosition" esté nombrada en la referencia de igual manera que en tu código de C#, ya que si no tiene el mismo nombre no podrá encontrar la variable y no podrá enviar la información a tu shader.


Una vez que tengas tu script listo, el material de tu shader creado y tu objeto jugador llamado 'tracker', puedes asignar el script a tu objeto de pasto y este funcionará, si ves que éste se mueve muy poco, podrás modificar el radio de interacción en el material del pasto con la variable pública que creamos previamente.


Recuerda presionar el botón "Play" para que esto funcione.


¡Nuestro pasto ya está funcionando! sin embargo tenemos un último problema estético, y es que la raíz de nuestro pasto se está moviendo también, cuando debería quedarse aferrada al piso.



Solucionar esto es muy sencillo, simplemente añadiremos un nodo 'VERTEX COLOR' y vamos a separarlo con un nodo 'SPLIT', este nodo tomará los colores que definimos al momento de crear nuestro mesh en el programa de modelado 3D (primera sección de este artículo) en donde el color negro (valor 0) no se verá afectado por el movimiento, y el resto de los colores se verán afectados en mayor medida mientras se acerquen al valor 1 (o completamente blanco)


Creamos un nodo 'LERP' y conectamos en el input 'A' el nodo 'Position' en World Space, esto quiere decir que mantendremos la posición original de nuestros vértices mientras estos tengan un valor de 0 (o negro) y en el input 'B' conectaremos el resultado de nuestro nodo 'Combine', que hará que mueva los vértices mientras el valor recibido sea mayor a 0.


FINALIZANDO EL SHADER

Listo, hemos terminado nuestro shader de pasto, podemos agregar movimiento de viento para que nuestra hierba siempre se esté moviendo, pero esto lo dejaremos para otro artículo.




Recuerda que esto es solo una manera de hacerlo, puedes experimentar con lo que hemos hecho aquí para lograr variantes de este mismo efecto. 


DESCARGAR

Si te interesa descargar directamente este shader, puedes hacerlo aquí a través de Ko-fi, en esta ocasión de manera gratuita como celebración por los 1000 followers en Instagram:


Estás en completa libertad de usarlo para cualquier fin una vez adquirido. 


Para cualquier duda o aclaración, házmelo saber en los comentarios o ponte en contacto directo conmigo aquí. De igual manera, si deseas contribuir a la página puedes hacerlo mediante mi cuenta en Ko-fi:




Comentarios

Publicar un comentario