Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Unity crear arrays o matrices

¿Qué es una matriz o array de elementos?

Podemos definir un array como una lista de elementos ordenados, de tal forma que iremos guardando datos en diferentes “cajas” las cuales están ordenadas y numeradas con un indice único que empieza en 0 en csharp y Unity la crearemos definiendo:

Primer el ámbito de aplicación, si es publica o privada

Después el tipo de variable o clase por ejemplo int

Después los corchetes que van a servir para identificar el array o matriz, de tal forma que mientras int numero solo puede contener un número int[] Numeros va a poder contener una cantidad de elementos que debemos dar al crear la matriz, reservando en memoria espacio para esos elementos.

Podemos darle el nombre que queramos, aun que yo aconsejo poner la primera letra en mayúsculas y en plural para que de una forma sencilla distingamos una matriz de otro tipo de variables.

En general determinaremos cuantos elementos va a contener el array ya que necesariamente necesita saberlos para funcionar, si no sabemos el numero de elementos que va a contener hay otras estructuras como los List que lo permiten.

Con new llamamos al constructor del array ya que en csharp los arrays o matrices funcionan como objetos, con sus propias propiedades y métodos , para dar un numero de elementos debemos usarlo, finalmente una matriz de tipo int solo podrá contener int, por eso escribimos int[20], reservando memoria para 20 enteros.

Para acceder a un elemento usaríamos Numeros[indice] , por ejemplo Numeros[0] nos devuelve el elemento que este guardado en la “caja” 0

Si definimos la matriz utilizando el constructor, en este caso al ser números enteros todos los elementos tendrían un valor inicial de 0.

Podemos también definir una matriz de esta otra forma:

En vez de usar el constructor utilizamos una colección de elementos, la cual se define con llave { elementos separados por comas y fin de llave }

Automáticamente la matriz se define con seis elementos como si se hubiese utilizado new int[6]

Numeros[0] , nos devolvería en este caso 1

Unity eliminar duplicados en un cadena

Existen diferentes formas de conseguir eliminar duplicados en una cadena, las formas más sencillas sería utilizar otros métodos como puede ser importar System.Linq la cual nos permite “limpiar” de duplicados con su método Distinct.

Sin embargo como ejercicio para comprender el funcionamiento de los arrays creo que puede ser muy útil hacerlo nosotros mismos, ya que tendremos que ver previamente como saber si un elemento está en un array y como añadir un elemento a un array.

Primer vamos con ¿Cómo saber si un elemento está en un array?

bool LetraEstaEnMatriz(char letra, char[] Letras){
		for (int i = 0; i < Letras.Length; i++) {
			if (letra == Letras [i]) {
				return true;
			}
		}
		return false;
	}

Creamos una función que devuelve un bool y recorremos el array comparando letra a letra, al hacer return si encuentra una letra se sale de la función por lo que no continua el for

La siguiente función a implementar es la que nos añade un elemento a un array , lo normal es añadirlo al final del array, la ventaja de crear nuestra propia función es que podriamos cambiar este orden si quisieramos.

char[] AñadeLetraAMatriz(char letra,char[] Letras){

		//se aumenta la matriz
		char[] Copia_letras=new char[Letras.Length+1];

		for (int i = 0; i < Letras.Length; i++) {
			Copia_letras [i] = Letras [i];

		}
		//queda la ultima
		Copia_letras[Letras.Length]=letra;
		Letras = Copia_letras;
		return Letras;
	}

Un array no permite añadir directamente, lo que hay que hacer es crear una copia previa, dejando un “espacio” para la nueva letra, despues se vuelca todo el array y finalmente se añade la última, volvemos a meter los elementos en el array original con Letras=Copia_letras y finalmente devolvemos el array con las letras

Ahora nos queda la parte final, para eliminar los duplicados, crearemos otra función

char[] SacaLetrasSinRepetir(string _palabra){
		char[] Letras=new char[0];

		for (int i = 0; i < _palabra.Length; i++) {
			for (int j = 0; j < _palabra.Length; j++) {

				if (i != j) {
					if (_palabra [i] == _palabra [j]) {
						if (!LetraEstaEnMatriz (_palabra [i], Letras)) {

							Letras = AñadeLetraAMatriz (_palabra [i], Letras);
						
							break;
						}
					} else {
						if (!LetraEstaEnMatriz (_palabra [i], Letras)) {
							Letras = AñadeLetraAMatriz (_palabra [i], Letras);

						}
					}
				}			
			}

		}
		return Letras;
	}

Primero creamos un array de dimension 0 que esta preparado para ir añadiendo letras, con char[] Letras=new char[0];

Despues recorremos _palabra , aqui hay que tener en cuenta que necesitamos dos bucles anidados para que haga la comparación de una letra con todas las demás.

Si tenemos por ejemplo una cadena “AABB”, lo que debemos hacer es comparar el elemento 0 , es decir A con ABB, despues la segunda A con BB ..

Por eso usamos los dos for, ahora bien una letra siempre será igual a si misma por eso despreciamos el caso i==j quedándonos solo con i!=j

Si la letra coincide es igual a otra, es decir esta repetida, comprobamos que no la tenemos ya en la matriz, con la función LetraEstaEnMatriz (_palabra [i], Letras) como es no , usamos la exclamación para negar el caso quedando

!LetraEstaEnMatriz (_palabra [i], Letras) si entramos en este if significa que no tenemos la letra en Letras por lo que la podemos añadir con la función

Letras = AñadeLetraAMatriz (_palabra [i], Letras); Después tenemos un break; este hace que se salga del primer for, por que ya no necesitamos comprobar más si tenemos una A que es igual a otra la guardamos solo una vez

Nos queda la otra posibilidad que la letra no sea igual, la guardamos en la misma matriz Letras, así tendremos tanto las que se repiten como las que no.

Sólo queda devolver el array que contendrá las letras sin los duplicados con un return

Como siempre digo en mis clases , este es el camino que he elegido yo, no es el único , quizá tu lógica te lleve por otro hasta es posible que el código se pueda optimizar más, para eso debes buscar tu propio camino.

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));

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.

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
is_main_query11
page01
numpages01
is_archive1
is_search1
is_home11
is_4041
is_attachment1
is_singular1
is_front_page11
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);