Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Control de tercera persona con Unity y Cinemachine

Cinemachine es un paquete de extensión que se puede bajar dentro de Unity y que permite controlar más fácilmente las cámara, dentro de los ejemplos se puede ver un control de tercera persona, con una cámara asociada que gira entorno al personaje y que facilita la configuración para este tipo de videojuegos.

 

Recreando iVisual , Escuela de nuevas tecnologías de Valladolid en Unity

Primero se tomaron fotos de referencia.

Después, se recrea la geometría base utilizando Probuilder, el cual nos permite modelar dentro de Unity, colocamos un FPS Controller para movernos por el escenario, en esta fase es fundamental corregir escalas, probar q el personaje se mueve con soltura sin estar demasiado “apretado”, también se colocan cubos simples con los objetos base, que seran convertidos en Prefabs para ser sustituidos después.

Colocamos materiales con texturas, Probuilder va creando las UVs por lo que simplemente seleccionado caras podemos asignar los materiales. También colocamos los primeros modelos.

En este proyecto las luces se apagan y encienden en tiempo de juego, por lo que las pusimos mixed, hay q tener en cuenta que al añadir el postprocesing todo se volverá algo más oscuro.

Las bombillas llevan un material de emisión que se puede desactivar por código, Material.DisableKeyword(“_EMISSION”);

Finalmente añadimos los efectos de postproducción con Postprocesing v2, en esta versión podemos controlar diferentes postprocesing mediante volumen de forma que podemos tener un postprocesing en el pasillo y otro distinto en una habitación.

El efecto Bloom pertime que los materiales emisión se vean más suavizados y con un halo.

La corrección de color, colocamos todo el color en ACES el modo más fílmico y ajustamos la exposición, contraste etc.

Con Screenspace añadimos reflejos en el suelo en aquellos materiales que tienen algo de reflexión.

También metimos reflexion probes para controlar los reflejos del Ironman , los cuadros y las manillas de las puertas.

Unity luces: Recreando Cesta de pan, de Salvador Dalí

Inspirado en el cuadro de Dalí, Cesta de pan, recreo la composición y las luces en Unity, utilizo un spot light para iluminación base y area lights para marcar zonas de brillo, finalmente subo el contraste con postprocesing.
Modelos usados :
Mesa:
https://sketchfab.com/models/e9ef3eadee9d4491b7c59fdbb19c30cd

Cesta de pan:
https://sketchfab.com/models/bb7e9cf4496f420c8d825d2e507f124b

Pan:
https://sketchfab.com/models/35c647c3231b4d7ba3dfdc1d0ba4d036

Despistados portada desarrollada en Unity


Portada del videojuego Despistados, he utilizado la nueva herramienta integrada en Unity Textmeshpro , q ahora viene para descargarse dentro del sistema de paquetes, con ella se puede crear un text con más opciones de formateo, me ha parecido especialmente interesante la opción de poder darle una textura al color, en la imagen casi no se aprecia pero hay una textura de cartón junto con el color rojo.

Unity Destruir después de hacer animación

Supongamos que queremos crear un animación en un GameObject que tras ejecutarse se destruya asimismo, tendriamos varias opciones la mas sencilla es contar el tiempo en segundos y simplemente usar la funcion Destroy(gameObject,segundos_animacion); si embargo este codigo requiere ajustes y no es universal.
El codigo para que un GameObject se destruya tras ejecutar una animación seria:
public class Destruye : MonoBehaviour {

Animator animator;
float tiempo;
void Awake(){
animator = GetComponent ();
}

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
//Que la animación coincida con el tiempo
if (animator.GetCurrentAnimatorClipInfo(0).Length != 0)
{
AnimatorClipInfo[] AuxClipInfo = animator.GetCurrentAnimatorClipInfo(0);
tiempo = animator.GetCurrentAnimatorStateInfo(0).normalizedTime * AuxClipInfo[0].clip.length;

if (tiempo > AuxClipInfo[0].clip.length)
{
print (tiempo + " " + AuxClipInfo [0].clip.length);
Destroy (gameObject);
}
}

}
}

Tendremos que asignarlo al GameObject que tenga el Animator y ademas quitar el loop de la animación, este código es universal, ya que recoje el tiempo que dura el clip y lo compara con ese tiempo multiplicado por el tiempo normalizado es decir, en base 1, funcionando como un porcentaje .
Cuando tiempo sea mayor que la duración del clip, es un poco mayor por la multiplicación y el numero de decimales, destruye el gameObject que lleva este script asociado.
Respecto al 0 de animator.GetCurrentAnimatorClipInfo(0); se trata del LayerAnimation que si no hemos creado ninguno mas sera la Base Layer y por tanto valdrá 0.

Unity script saber si un número es par o impar

Un script muy sencillo de c# que pongo de ejemplo para usar el operador % modulo , y comprobar su utilidad, el cual devuelve el resto de una división.
Ya que el resto de la división de un numero par entre dos es siempre 0
public int numero;
if(numero%2=0){
print(numero+" es par");
}else{
print(numero+" es impar");
}