Archivo de la categoría: Tutoriales

2-Sided Shader para Unity

Una de las principales carencias a la hora de importar objetos .FBX  desde 3D Studio Max, Maya, Blender, etc… a Unity, es la ausencia de un material por defecto 2-Sided.

Este material es necesario para evitar el siguiente “glitch” gráfico:

1-side falda 1-side

Ocurre el mismo efecto que con un plano. Es decir: si creamos un objeto “Plane” y le asignamos un material cualquiera (Diffuse por defecto), observamos que es visible únicamente por uno de los lados.

Para que este plano, y por lo tanto, cualquier objeto .fbx tenga material visible por ambos lados, sin necesidad de modelar un polígono cerrado por completo (como son el caso de melenas, faldas, telas, etc…), necesitamos un material que haga visible a estos planos por ambos lados.

Para ello podemos programar un shader propio.

Click derecho -> Create -> Shader.

Doble click y comenzamos a programar el shader (no confundir con “Open compiled shader”, ya que éste código es el generado por Unity tras compilar el shader).

El siguiente código muestra las propiedades para crear un shader de tipo diffuse y double-sided:

La propiedad más importante para conseguir esto es “Cull Off“. Con esto estamos desactivando una propiedad que sirve para optimizar el rendimiento a la hora de renderizar texturas y propiedades gráficas Direct3D.

Backface Culling” es una técnica de optimización que por defecto está activada para que no se rendericen las caras de los polígonos que el visor (o jugador) no este visualizando en ese momento. Por tanto, no es recomendable desactivar esta propiedad en todos los materiales, puesto que incrementaría de forma desmesurada los requisitos necesarios.

El siguiente código ShaderLab crea un material de tipo “Bumped Specular” y double-sided:

Y es el que uso para solucionar el glitch gráfico del anterior ejemplo, el cual queda así:

2-sided falda 2-side zapato.gif

Nótese que tanto la falda, como la tela roja de delante, como el interior de las botas ahora sí tienen textura, por lo que el resultado final es mucho más satisfactorio.

Modelo sobre el que aplico los shaders cedido por cortesía de Miguel Ángel López Amodeo (alias Hiwa).

‘SimCity’ like in Unity

Estreno la categoría de Tutoriales con un nuevo proyecto personal llamado “UnityCity” descrito anteriormente; y en el que me he propuesto, como dice el título, hacer un juego al estilo SimCity 2000, SimCity 3000 o SimCity 4; en Unity.

Comienzo detallando el sistema de colocación de objetos (o ‘props’) en el escenario.

Comenzando por tener un grid como base de escenario, me he decantado por auto-generar una serie de minicubos prefabricados de tamaño (1, 0.25, 1) llamados “losa” con la siguiente textura:

Los “instancio” a partir de las coordenadas (0, 0, 0) con un script muy simple:

Y obtengo esto:

Captura

 

Ya tengo preparado un pequeño “grid” donde poder trastear con edificios, calles, etc…

Ahora, creo un .prefab con un par de cubos, que simulen una comisaria (o un hospital, o un colegio, o whatever…) al que llamo “edif_Test”, con un tamaño total máximo de (1, y, 1), con y un valor cualquiera (ya que es la altura del edficio).

Capturaedif Capturaedif2

Este prefab deberá anclarse a la casilla del suelo al hacer click sobre la misma. Para ello, hago uso de los famosos Raycast

Creo otro script con el siguiente código:

En este código preparo el típico Ray y RaycastHit para detectar dónde hago click. Al comenzar, cargo como recurso el prefab previamente creado del edificio en cuestión.

Mediante el método Camera.main.ScreenPointToRay(Input.mousePosition); lanzo un raycast desde la posición del ratón hacia la dirección en la que mira en la cámara. De este modo, con la cámara en modo Ortographic, donde pongo el puntero es donde pongo el edificio.

En caso de que el Raycast detecte físicas (en este caso, el grid del mapa), mediante el método Debug.DrawRay, puedo comprobar como efectivamente, la posición del puntero coincide con el lugar que señalo (aunque no se aprecia demasiado, el Debug.DrawRay es la delgada línea roja [peliculón!])

raycast_example_unitycity

Al definir

, lo que estoy haciendo es obtener las coordenadas ‘x’ y ‘z’ del centro del cuadradito del grid; de modo que al instanciar el edificio; éste aparezca justo en el centro del cuadrado.

Ya sólo queda entonces que, al hacer click, aparezca el dichoso edificio, en la posición definida:

Simple, rápido y eficaz. Ya tengo la base de UnityCity

unitycity_prev