Resumen

Crear sistemas de datos organizados es fundamental para cualquier proyecto en Unity, especialmente cuando se trata de juegos tipo RPG donde necesitas gestionar armas, pociones y otros objetos. Aquí aprenderás a construir una base de datos de ítems utilizando Scriptable Objects, desde la estructura básica hasta su visualización en el inspector.

¿Qué son los Scriptable Objects y por qué usarlos?

Los Scriptable Objects son contenedores de datos que funcionan de forma nativa con Unity [0:18]. A diferencia de los MonoBehaviour, no necesitan estar adjuntos a un GameObject en la escena. Permiten almacenar información, llamar métodos y actúan de manera similar a un archivo JSON pero integrados completamente en el flujo de trabajo del motor.

Para comenzar, se importa un paquete de íconos preparados previamente dándole doble clic al archivo [1:00]. Estos íconos representarán visualmente cada ítem dentro del juego.

¿Cómo se estructura un ítem con structs y enums?

El primer paso es crear la clase base. Se genera un script llamado ItemScriptableObject [1:24]. La diferencia clave respecto a un script convencional es que en lugar de heredar de MonoBehaviour, se hereda de ScriptableObject [1:39].

csharp public class ItemScriptableObject : ScriptableObject { }

Para organizar los datos del ítem, se define una estructura (struct) por fuera de la clase principal llamada Item [1:54]. Esta estructura contiene:

  • displayName: un string con el nombre visible del ítem.
  • itemType: una enumeración que define si es un arma o una poción.
  • icon: un Sprite que representa el ícono visual del objeto.
  • damage: un entero para el daño en caso de ser un arma.
  • restoreAmount: un entero para la cantidad de vida restaurada si es poción.

La enumeración (enum) se crea usando public enum ItemType con los valores Weapon y Potion [2:22]. En Visual Studio, al escribir enum y presionar doble tabulación, se genera automáticamente la plantilla.

csharp public enum ItemType { Weapon, Potion }

¿Cómo aplicar atributos para validar datos?

Para evitar valores negativos en restoreAmount, se utiliza el atributo [Min(0)] [3:23]. Este atributo garantiza que el valor nunca sea inferior a cero, una práctica recomendada para mantener la integridad de los datos.

La instancia del ítem dentro del Scriptable Object se declara como privada y serializada para que sea visible en el inspector pero inaccesible desde otras clases [3:37]:

csharp [SerializeField] private Item item;

¿Qué es el atributo CreateAssetMenu?

Para que el Scriptable Object pueda crearse desde el editor, se necesita el atributo [CreateAssetMenu] [4:02]. Este atributo funciona de forma similar a un Menu Item, pero está diseñado específicamente para crear activos de tipo Scriptable Object.

csharp [CreateAssetMenu(fileName = "Item", menuName = "Tools/Scriptable Items")] public class ItemScriptableObject : ScriptableObject

  • fileName: define el nombre por defecto del archivo creado.
  • menuName: establece la ruta dentro del menú contextual del proyecto.

Dentro de la carpeta Assets, se crea una nueva carpeta llamada Scriptables [4:40]. Al hacer clic derecho y seleccionar Create, aparece la opción Tools > Scriptable Items, generando un archivo representado por un pequeño cuadro azul.

¿Por qué no aparecen los datos en el inspector?

Al inspeccionar el Scriptable Object creado, los datos no se muestran inicialmente [5:09]. Esto ocurre porque la estructura Item, aunque el campo esté serializado, no es serializable por defecto.

La solución es agregar el atributo [System.Serializable] sobre la estructura [5:27]:

csharp [System.Serializable] public struct Item { public string displayName; public ItemType itemType; public Sprite icon; public int damage; [Min(0)] public int restoreAmount; }

Al regresar a Unity, el inspector ahora despliega todos los campos del ítem correctamente, permitiendo asignar nombre, tipo, ícono, daño y cantidad de restauración [5:35].

Con esta base funcional, el siguiente paso es personalizar el editor con Custom Editors para que la entrada de datos sea más intuitiva y visualmente clara. ¿Qué tipos de ítems agregarías a tu propia base de datos?