Muchas veces me pregunté (supongo que al igual que muchas personas), cómo generar sombras en objetos 2D con Unity. Voy a explicar ahora la forma sencilla (usando un Framework), y más adelante haré otro post sobre cómo hacerlo manualmente.
El framework que vamos a utilizar es 2DDL (2D Dynamic Lights and Shadows), que lo podemos bajar del Asset Store de Unity (desde un navegador o dentro de Unity).
Bien… Una vez bajado el framework, vamos a descomprimirlo en la carpeta “Assets” de nuestro proyecto (si lo bajamos desde Unity no hace falta, ya que lo hace automáticamente). Lo primero que podemos notar es que agrega un menú más a nuestro proyecto:
Tenemos dos opciones: “Lights” y “Casters”. La primera genera una “luz”, que en realidad es un plano blanco con un degradado (o sea, la simulación de una luz), y la segunda representa un objeto que pueda castear sombras. Necesitamos ambos en todo sistema de iluminación. Por empezar podríamos agregar una luz del menú Lights del framework. Vamos a ver solamente un cuadrado azul, hasta que le demos Play (del menú “Lights” yo elegí la del medio: “* Radial Procedural Gradient”).
Vamos a notar en la pestaña “Inspector” de Unity que esta luz tiene algunas pocas propiedades que se pueden modificar.
Las opciones disponibles son sencillas:
-
RADIUS: Representa el radio de la luz en unidades de Unity. Si pusieramos un Point Light en la escena, el radio de ese Point Light podría ser el mismo que el puesto acá.
-
SEGMENTS: Cantidad de segmentos que tiene la figura plana que representa la luz. A mayor cantidad, más “precisión” a costa de un poco de rendimiento.
-
LIGHT MATERIAL: Material que utiliza para el plano que representa la luz. Si editamos este material podríamos cambiar el color de la luz.
Seteados esos parámetros, vamos a crear ahora un caster (básicamente sería el objeto que va a generar una sombra). Para ello lo que necesitamos es que el objeto que vayamos a agregar cumpla con dos cosas fundamentales:
-
DEBE TENER un PoligonCollider2D.
-
Su layer DEBE SER la misma layer que tenga la luz (es recomendable que creen una layer ustedes por cuestiones de ordenamiento).
Entonces… Podemos usar los casters ya predefinidos del menú “GameObject => 2D Dynamic Light [free] => Casters”, o podemos crear los nuestros propios, como el de la siguiente imagen:
Bien. Ahora, para darle un poco más de “copadez”, vamos a agregarle una Point Light a la luz que viene con el framework. Lo que queremos lograr con esto es que los objetos sólo se iluminen cuando la luz real se acerque. De esta manera, generamos la luz con las luces de Unity, y las sombras con el framework. Debería quedar así:
Van a notar que la luz no afecta en NADA al sprite. Esto es porque predeterminadamente, la luz no afecta a los sprites. Noten que todos los SpriteRenderer, MeshRenderer, LoQueSeaRenderer, tienen una variable (que se puede ver en el inspector), llamada “Material” (léase “matirial” in inglish). El material que pongamos ahí debería estar “preparado” para recibir luz. Así que para eso vamos a crear nuestro propio material. Tranqui… No es nada de otro mundo. Sólo 5 clicks:
-
CLICK derecho dentro de la carpeta Assets (o una subcarpeta).
-
CLICK en Create => Material.
-
CLICK en el material.
-
En el inspector, van a ver que el material tiene una parte que dice “Shader” (léase “yaider”), hagan CLICK y se despliega un menú.
-
De ese menú hagan CLICK en “Sprite” => “Diffuse” (léase “difius”).
Y listo… CINCO clicks… El seteo del material sería este:
Ahora arrastramos nuestro recientemente creado material al personaje. Lo podemos arrastrar a la variable “Material” o directamente sobre el personaje. Van a notar que si acercan la luz, el personaje se ilumina. Tengan en cuenta que la Point Light debería estar aunque sea levemente corrida del eje Z hacia adelante, puesto que sino estaría en la misma línea que el sprite y puede que no se ilumine:
Como pueden ver, aún no parece crear muy bien el efecto de iluminación. Vamos a hacer dos cosas.
-
Seleccionamos la cámara y cambiamos la propiedad “Background” a negro. Esto va a hacer que todas las partes en las cuales la cámara no encuentre ningún objeto, en lugar de pintarse de azul, se pinten de negro, simulando oscuridad.
-
Vamos a “Windows” => “Lighting”, y en la parte donde dice “Ambient Color” seleccionamos el color negro. Esto lo que hace es que todo lo que no esté afectado por una luz, se vea negro (siempre y cuando tenga un material “diffuse”).
Listo. Prueben ahora alejando la luz y van a ver cómo el objeto de a poco se va apagando. Traten de que el radio de la Point Light sea más o menos el mismo que el radio de la 2D Light. Jueguen con la intensidad para obtener el grado de iluminación deseado.
Cualquier pregunta, pueden dejarla en los comentarios.
Saludos!