Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Category: cortos

Resumen de métodos de List I

Voy ha hacer un resumen de los diferentes metodos de List<t> y su aplicación al mundo de los videojuegos con Csharp y Unity

En vez de poner cada uno de los diferentes métodos y traducirlo, voy a ponerlo como preguntas para que resulte más sencillo:

¿Qué es un List?

List<T> son como arrays vitaminados, una lista de objetos con propiedades y métodos propios pensada para realizar tareas habituales en los array pero mas rápidamente. List<T> significa genérico pueden ser de cualquier tipo

¿Cuando usar array y cuando List?

Los arrays son estructuras menos complejas, mas livianas y mas rápidas al ejecutarse que un List, en general diremos que si no se van a realizar tareas como añadir, eleminar o buscar probablemente con utilizar un array será suficiente, por otro lado cuando creamos una clase propia por ejemplo Carta, es cuando solemos utilizar List , quedando List<Carta>=new List<Carta>(); ya que nos permite hacer operaciones muy rapidamente con una pocas lineas de codigo.

Un #list puede no tener un número de elementos definido, funcionando como un papel en blanco, una lista de la compra, donde vamos añadiendo elementos, borrando, buscando.. Ejemplo con clase propia: List<Carta> Baraja

¿Como saber cuantos elementos tiene un List?

Dado el List Baraja, por ejemplo, con el método Count obtendremos el numero de elementos, asi Baraja.Count nos devolvería 40 en una baraja española

He visto que hay otro método llamado Capacity ¿Es lo mismo que Count?

No , Capacity se refiere a la reserva de memoria que hace para no tener que estar modificando el espacio reservado cada vez que se añade o elimina un elemento. Ambos pueden coincidir cuando tienes el mismo numero de elementos que la capacidad.

#Count vs #Capacity en List<T> un estadio tiene capacidad para 100000 (Capacity) pero solo hay 5000 espectadores (Count). Daremos una capacidad cuando ya sabemos el número de elementos que va albergar, reservando memoria.

List<T> puede modificar Capacity cuando el número de elementos la supera, “crece” para albergar los nuevos elementos. En una fiesta has reservado para 4 personas pero vienen 5 el restaurante te da otra mesa

¿Se puede ajustar Capacity al numero exacto de elementos que tiene el List?

Si, hay un metodo especifico para eso : TrimExcess () , el cual ajusta Capacity para que sea igual a Count.

Vas a dar una fiesta para 20 personas #capacity pero solo vienen 16 #count , con Sillas.TrimExcess () ajusta #capacity al #count para que no sobren sillas (más memoria de la necesaria)

Unity movimiento con Coseno

El uso de Mathf para implementar funciones matemáticas es muy sencillo, y permite hacer muchas cosas curiosas con muy pocas lineas de código.

Uso de Mathf.Cos para la creación de movimiento, ya que la fluctuación del coseno es -1 y 1

En el Update
pos_x += velocidad;
pos_y += velocidad;
transform.position = new Vector2(pos_x, Mathf.Cos(pos_y));

YouTube player

Unity creación de menús por código

Cuando uno se inicia en la programación es una buena practica entender lo más esencial, es por ese motivo que en clase empiezo explicando la creación de menús por código con la función OnGUI, en vez de ir directamente a la creación de menús con Canvas en Unity.

Unas pocas lineas de código son suficientes para poder crear un menú básico , que forme parte de un prototipo inicial y que más adelante se pueda cambiar.

El uso de Arrays para contener los nombres de textos y botones, hace que el proceso de construcción se vuelva todavía mas optimizado.

YouTube player

Remodelación 3D de Cocina con Unity y Blender

Cocina en Unity

En Blender hice unos modelos sencillos basados en un concepto que la empresa de cocinas nos dio, el mayor reto es decidir entre las múltiples posibilidades que la combinación de colores de muebles, encimera y suelo ofrece, para lo cual al hacer el sistema con Unity puede implementar una selección de materiales y hacer cambios muy rápidos.

Por otro lado para el suelo, miramos diferentes azulejos, que luego hay que tratar en photoshop u otro programa de retoque grafico para hacerlos repetibles tanto horizontal como verticalmente, ya que si la textura está preparada podremos utilizar fácilmente la propiedad tiling del material, la cual nos permite controlar la repetición de la textura.

Ad debug output

The ad is displayed on the page

current post: Remodelación 3D de Cocina con Unity y Blender, ID: 2560

Ad: Anuncio2 (2573)

Display Conditions
general conditions
Adwp_the_query
term_id0111
taxonomy0category
is_main_query11
page01
numpages01
is_archive11
is_search1
is_home1
is_4041
is_attachment1
is_singular1
is_front_page1
is_feed1




Find solutions in the manual

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.