Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Category: cortos

Diseño y remodelación de baño 3d con Unity

Partiendo de una fotografia del antes y con las medidas exactas he levantado en 3d el baño , añadiendo detalles que lo hacen más creíble.

Para crear la habitación en 3d utilice blender , existe un addon interesante archimesh que nos ayudara a resolver facilmente algunas cuestiones , como la colocación de ventanas y puertas.

Despues el modelo lo podemos importar directamente en unity como .blend para hacer las modificaciones sobre ese archivo, hay que tener en cuenta q una vez importado si añadimos elementos en el .blend estos no apareceran directamente en la escena de unity sino que tendremos que volver a meterla en la escena, por eso es preferible importar el modelo cuando este lo mas acabado posible.

Galería de Youtube

Añadir y quitar elementos de una lista en Unity

Siempre digo que los List son como Arrays o Matrices vitanimadas, ya que tienen implementados sus propios metodos lo que facilitar la labor a la hora de manejarlas.

En c# y Unity para poder utilizar los List tendremos que tener la librería

using System.Collections.Generic;

Depues podemos declarar nuestra lista del tipo que queramos , normalmente usaremos listas con tipos mas complejos que una variable, numero o cadena, es decir, usaremos listas sobre todo con objetos definidos por una clase.

Imaginemos que queremos llevar un registro de los enemigos que hay en el juego,

Tendremos una clase Enemigo

Declaramos nuestro List

public List<Enemigo> enemigos=new List<Enemigo>();

Ahora queremos almacenar un nuevo enemigo, pero no queremos almacenarlo si esta repetido, es decir, solo almacenaremos un enemigo que no este ya en la lista, con arrays seria un proceso mas lento, habria que recorrer el array para saber si esta ya o no, crear una copia del array con una dimensión mayor y volcar de un array a otro.

Con listas es mucho más sencillo, podemos crearnos una función que es publica y que no delvuelve ningun valor void llamada RegitraEnemigo, la cual recibe un parametro de tipo Enemigo llamado e

Lo primero que hace es comprobar si la lista ya contiene a ese enemigo con enemigos.Contais(e) una funcion propia de las listas que devuelve un bool es decir, verdadero o falso, si devuelve false, entonces e no esta en la lista enemigos por lo que lo podemos añadir con enemigos.Add(e) que mete ese enemigo en la lista

public void RegistraEnemigo(Enemigo e){

if (enemigos.Contains (e) == false) {
enemigos.Add (e);
}
}

Por el contrario si lo que queremos es borrar un enemigo que ya esta en la lista , lo que haremos sera comprobar previamente que esta en la lista y después borrarlo.

public void  QuitarEnemigo(Enemigo e){

if (enemigos.Contains (e)) {
enemigos.Remove (e);
}
}

Hay que aclarar que un eliminado de un objeto de un List no lo borrara de la jerarquía , lo que hacemos es borrar la referencia que estaba guardada en la lista para borrarlo de la jerarquía habría que usar Destroy(gameObject);

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.

Cuchillo sangriento 3D

Me he creado una cuenta en Skechfab , para ir subiendo algunos modelos 3D y escenas de Unity, ya que se pueden subir scenes desde Unity a Skechfab de una forma fácil y rápida,  simplemente metiendo un unitypackage que se descarga desde la página de Skechfab.

 

La escena se puede bajar y ser usada para cualquier proyecto.

Y si os gusta podéis apoyarme en

https://www.patreon.com/unityhorror

Unity : Buenas practicas -> Etiquetas (Assests Labels)

A veces ponemos el foco en la creación del videojuego , y nuestra mayor preocupación es desarrollarlo rapido, sin embargo si vamos a trabajar con más personas en el proyecto , el caos que podemos ir acumulando hará que se pierda un tiempo precioso, que con algunas Buenas practicas se podria haber evitado.

Hoy voy a hablar de las Etiquetas, un sistema de búsqueda interno de Unity que suelen pasar desapercibidas pero que pueden ser muy interesante para estructurar bien y encontrar rápidamente lo que necesitemos.

1 ¿Qué son los Assets Labels?

Son etiquetas con las que podemos categorizar los elementos de nuestro videojuego y  facilitar su búsqueda.

2 ¿Cómo se etiqueta?

Simplemente tenemos que seleccionar un elemento en nuestro Project, en Inspector al final del todo encontraremos Assets Labels, pinchamos sobre el icono de etiqueta azul y asignamos una etiqueta a ese elemento.

3 ¿Cómo se crea una etiqueta nueva?

Esta opción esta algo “escondida”, ya que no hay ningún botón para crearla, lo que hay que hacer es pulsar sobre el icono de etiqueta, nos aparecerá un campo de busqueda, simplemente escribimos el nombre de nuestra etiqueta por ejemplo Setup y pulsamos intro, la nueva etiqueta aparecerá en la lista.

Podemos asignar más de una etiqueta a un elemento, repitiendo el proceso 2.

4 ¿Cómo se buscan elementos marcados con etiquetas?

Dentro de Project , vemos que hay un icono etiqueta, pinchamos sobre él , buscamos la etiqueta y nos aparecen todos los elementos que tienen esa etiqueta.

5 ¿Qué utilidad tiene el etiquetado?

Sirve para poder encontrar rápidamente los elementos de nuestro videojuego, independientemente de su tipo y de la carpeta donde se encuentren.

Por ejemplo podemos tener una etiqueta Setup con todos los prefabs básicos que necesitamos para construir un nivel, buscamos Setup con el proceso 4 y arrastramos todos esos elementos a nuestra jerarquia y tendríamos todos los elementos iniciales.

También nos sirve para trabajar en equipo, el jefe de proyecto etiqueta los elementos con una etiqueta llamada nivel1, el diseñador de nivel sabe que sólo puede utilizar los elementos marcados con nivel1 para construir su nivel.

¿Alguna vez has usado etiquetas en tu proyecto de Unity? Dejame un comentario con tu experiencia.