Errores y caos si no usas listas en Unity
011. Hoy vamos a explorar una forma muy efectiva en el manejo de datos: las listas. Veremos los motivos principales por los que siempre procuro usarlas. Además, he preparado un tutorial básico donde aprenderemos a gestionar un par de listas.
Ventajas de Usar Listas
A medida que trabajas en Unity, las listas se convierten en tu mejor aliado. ¿Por qué? Aquí te doy algunas razones:
Flexibilidad Dinámica: Las listas ofrecen una flexibilidad increíble al gestionar datos. En lugar de lidiar con estructuras rígidas, las listas te permiten ajustar el tamaño según lo que necesites. Es como tener un armario que puede expandirse o contraerse según la cantidad de ropa que tienes. Esto hace que trabajar con datos dinámicos sea mucho más fácil y menos restrictivo.
Operaciones eficientes: Las listas proporcionan métodos y propiedades muy eficientes a la hora de manipular datos. Algunos ejemplos son:
Facilidad de uso: proporcionan una interfaz simple y clara para trabajar con conjuntos dinámicos de datos:
En definitiva, las listas son la forma ideal para manjar grandes cantidades de datos y no morir en el intento.
Ahora, veamos un ejemplo muy básico de una lista, para ello, vamos a nuestra carpeta de scripts, y creamos un nuevo script C# y lo llamamos ManejoDeListas y lo editamos.
Borramos todo el contenido y pegamos el siguiente código:
using System.Collections.Generic;
using UnityEngine;
public class ManejoDeListas : MonoBehaviour
{
public List<string> nombresDeFrutas = new List<string>();
void Start()
{
nombresDeFrutas.Add("Manzana");
nombresDeFrutas.Add("Banana");
nombresDeFrutas.Add("Fresa");
nombresDeFrutas.Add("Uva");
}
}
Pero veamos que significa todo esto
public List<string> nombresDeFrutas = new List<string>();
En esta línea, declaramos e inicializamos nuestra lista y vemos que se llama nombresDeFrutas y que solo puede contener cadenas de textos (string).
Para añadir elementos nuevos a la lista lo hacemos de la siguiente forma:
nombresDeFrutas.Add(“Manzana”);
Ahora volvemos Unity y en nuestra ventana de jerarquía creamos un GameObject vacío, lo llamamos Lists y le añadimos el script que acabamos de crear.
Si ejecutamos el programa, seleccionamos en nuestra jerarquía el objeto Lists y nos fijamos en el inspector, vemos que dentro de nuestra variable nombresDeFrutas hay datos
Vamos a ir complicando las cosas con un nuevo ejemplo. En la carpeta de scripts creamos un nuevo archivo y lo llamamos EnemiesDeclaration, lo editamos, borramos todo el contenido y pegamos el siguiente código:
using UnityEngine;
using System;
using System.Collections.Generic;
[Serializable]
public class EnemyDescription
{
public string name;
public string ability;
public int damageForce;
}
public class EnemiesDeclaration : MonoBehaviour
{
public List<EnemyDescription> enemies = new List<EnemyDescription>();
void Start()
{
EnemyDescription enemy1 = new EnemyDescription() { name = "Goblin", ability = "Lanza afilada", damageForce = 10 };
EnemyDescription enemy2 = new EnemyDescription();
enemy2.name = "Esqueleto";
enemy2.ability = "Toque helado";
enemy2.damageForce = 15;
enemies.Add(enemy1);
enemies.Add(enemy2);
}
}
Vamos a analizar poco a poco lo que estamos haciendo
Recomendado por LinkedIn
[Serializable]
public class EnemyDescription
{
public string name;
public string ability;
public int damageForce;
}
Básicamente aquí estamos creando un nuevo tipo de dato con las características de nuestros enemigos. Ojo con [Serializable], esta línea hace (entre otras cosas) que podamos ver en el inspector la información de las variables que tenemos definidas dentro de la clase.
List<EnemyDescription> enemies = new List<EnemyDescription>();
En esta línea declaramos e inicializamos una lista nueva. La información que contendrá esta lista, será la estructura de datos que acabamos de crear (las características de nuestros enemigos).
Para añadir datos ya no es tan sencillo como hemos visto en el ejemplo de las frutas. Ahora, nuestra lista, está esperando la estructura de datos de la descripción de un enemigo. Entonces, tenemos que crear tantas estructuras de datos (de tipo EnemyDescription) como enemigos tengamos y luego añadirlas a la lista.
Para hacer esto hay dos formas diferentes, pero que en el fondo están haciendo exactamente lo mismo.
EnemyDescription enemy1 = new EnemyDescription() { name = "Goblin", ability = "Lanza afilada", damageForce = 10 };
Aquí declaramos un nuevo enemigo, lo inicializamos y llenamos de datos las características del enemigo. Todo en una línea.
La otra forma de crear una estructura de datos es la siguiente:
EnemyDescription enemy2 = new EnemyDescription();
enemy2.name = “Esqueleto”;
enemy2.ability = “Toque helado”;
enemy2.damageForce = 15;
EnemyDescription enemy2 = new EnemyDescription();
Aquí declaramos e inicializamos un nuevo enemigo.
Y de esta forma le añadimos la información:
enemy2.name = “Esqueleto”;
enemy2.ability = “Toque helado”;
enemy2.damageForce = 15;
Personalmente uso esta última forma, porque tiene una mejor comprensión a la hora de leer el código.
Para finalizar, tenemos que añadir la información a la lista:
enemies.Add(enemy1);
enemies.Add(enemy2);
Vamos a Unity, creamos un objeto vacío y lo llamamos Enemies.
Le asignamos el script que acabamos de crear, ejecutamos el programa, vamos a nuestra ventana de jerarquía.
Seleccionamos Enemies y vemos que contiene en el inspector.
Si desplegamos Enemies, vemos que contiene Goblin y Esqueleto.Y si desplegamos tanto Goblin como Esqueleto veremos la información que contienen