MODULAR INVENTORYPRO · DOCUMENTACIÓN
← Retroid
ESEN
Unity 2021.3+
GUÍA OFICIAL

Construye inventarios modulares sin atar tu juego a una sola arquitectura.

Configuración, objetos, interfaz, contenedores, equipamiento, crafting, loot, peso y persistencia entre escenas. Todo lo necesario para integrar el asset en un proyecto de Unity.

Motor
Unity 2021.3 LTS+
Render
Built-in y URP
Dependencias
Ninguna externa
01 La escena Demo incluye objetos, equipamiento, un cofre y un barril interactivo.
01

PRIMEROS PASOS

Instalación y escena Demo

1

Importa el paquete

Importa ModularInventoryPro en la carpeta Assets. Espera a que Unity termine de compilar antes de abrir herramientas o escenas.

2

Abre la demo

Ve a Assets/ModularInventoryPro/Demo/Scenes/DemoScene y pulsa Play para comprobar el sistema completo.

3

Prueba el flujo

Recoge objetos, abre el inventario, equipa, suelta objetos y transfiere contenido entre el jugador y los contenedores.

WASDMover al jugador
EInteractuar o cerrar un contenedor
IAbrir o cerrar el inventario
TabOrdenar el inventario
Shift + clicDividir una pila
Clic derechoAbrir acciones del objeto
02

CONFIGURACIÓN

Crea el inventario

RECOMENDADO

Inventory Designer

  1. Abre Tools → ModularInventoryPro → Inventory Designer.
  2. Elige el número de slots y columnas.
  3. Selecciona los módulos que necesita el proyecto.
  4. Pulsa Quick Setup para generar el inventario y su interfaz.
  5. Asigna tu ItemDatabase y el tema visual.

CONFIGURACIÓN MANUAL

  1. Crea un Item Database.
  2. Añade InventorySystem al jugador.
  3. Asigna Database y Slot Count.
  4. Crea un Canvas con InventoryUIManager.
  5. Asigna Inventory, Slot Container, Slot Prefab y Theme.
  6. Asegúrate de tener un EventSystem en la escena.
02 Los modelos 3D pueden sustituirse sin cambiar la lógica: conserva el componente interactivo y asigna materiales compatibles con tu render pipeline.
03

DATOS

Objetos, categorías y rarezas

Cada objeto es un ItemDefinition. Esto permite reutilizar la misma definición en pickups, recetas, loot tables, inventarios y equipamiento.

UnityAssets → Create → ModularInventoryPro → Item Definition

Identidad

Item ID
Identificador estable y único.
Display Name
Nombre visible.
Description
Texto del tooltip.
Icon
Sprite utilizado por la UI.

Clasificación

Category
Agrupa objetos por tipo.
Rarity
Color y nivel de rareza.
Price
Valor base para tiendas.
Weight
Peso por unidad.

Comportamiento

Stackable
Permite apilar unidades.
Max Stack
Límite de cada pila.
Actions
Usar, consumir, equipar o soltar.
World Prefab
Representación en el mundo.

Orden recomendado

  1. Crea categorías y rarezas.
  2. Crea las acciones necesarias.
  3. Crea cada Item Definition.
  4. Registra los objetos en Item Database.
  5. Asigna icono y prefab del mundo.

Rutas de creación

  • ModularInventoryPro/Item Category
  • ModularInventoryPro/Item Rarity
  • ModularInventoryPro/Actions/Consume
  • ModularInventoryPro/Actions/Equip
  • ModularInventoryPro/Actions/Drop

Acciones incluidas

ConsumeActionElimina una unidad. Heal Amount es un dato de ejemplo: conecta tu sistema de vida dentro de una acción propia o una clase derivada si quieres curar realmente al jugador.
EquipActionBusca EquipmentManager en el mismo GameObject del inventario, elimina una unidad y la equipa en Target Slot ID.
DropActionElimina una unidad del inventario lógico. Si quieres crear un objeto físico, instancia Model Prefab o usa el flujo de DemoHandEquip.
04

EXPERIENCIA DE USO

Interfaz y controles

03 Panel generado con slots, selección, footer de acciones y ordenación.

Arrastrar y soltar

Mueve, intercambia y combina pilas. También funciona entre el inventario y otro contenedor.

½

Dividir pilas

Usa Shift + clic para separar la mitad en el primer slot disponible.

•••

Menú contextual

El clic derecho muestra las acciones disponibles para ese objeto.

i

Tooltip

Muestra nombre, descripción, rareza, estadísticas, peso y valor al pasar el cursor.

Personalizar el tema

Crea un tema desde Assets → Create → ModularInventoryPro → UI Theme. Puedes cambiar colores, tamaños, separación y sprites, o aplicarlo en ejecución:

uiManager.SetTheme(miTema);
05

ALMACENAMIENTO

Cofres y barriles

04 Al abrir un contenedor aparecen ambos inventarios para transferir objetos en las dos direcciones.

Uso durante el juego

  • Pulsa E cerca del contenedor.
  • Doble clic en la derecha: llevar al jugador.
  • Doble clic en la izquierda: guardar en el contenedor.
  • Arrastra entre paneles para mover manualmente.
  • Cierra con E, I o la X.

Crear un contenedor

  1. Añade un Collider al objeto o a uno de sus hijos.
  2. Añade DemoChest al objeto raíz.
  3. Asigna Loot Table, número de slots, panel UI, UI Manager y Database.
  4. El nombre del GameObject será el título mostrado.
  5. Mantén el componente en el padre si cambias solamente el modelo visual.
06

SISTEMA MODULAR

Módulos opcionales

EQ

Equipamiento

Añade EquipmentManager, crea Slot Definitions y asigna EquipAction a los objetos equipables.

GetTotalStat("attack")
CR

Crafting

Añade CraftingSystem, crea recetas con ingredientes y resultados, y usa opcionalmente una Crafting Station.

CraftInstant(recipe)
LT

Loot

Crea una Loot Table con pesos, cantidades y niveles; usa LootDropper en cofres o enemigos.

DropLootInto(inventory)
KG

Peso

Añade WeightInventoryProvider y un Weight Config para limitar carga y definir umbrales.

RecalculateWeight()
CreaciónAssets → Create → ModularInventoryPro → [Equipment / Crafting / Loot / Weight]
Equipamiento: configuración completa
  1. Añade EquipmentManager al mismo GameObject que InventorySystem.
  2. Crea cada Slot Definition: usa un Slot ID único como head, chest, mainHand o offHand.
  3. Asigna una categoría aceptada si ese slot debe filtrar objetos.
  4. Crea un EquipAction y escribe en Target Slot ID exactamente el mismo identificador.
  5. Añade esa acción al Item Definition.
  6. Para estadísticas propias, hereda de EquipmentManager y sobrescribe GetModifiersFromItem.

Si se equipa otro objeto en un slot ocupado, el anterior se devuelve para que puedas reinsertarlo en el inventario.

Crafting: recetas, tiempos y estaciones
  1. Crea una receta y completa Recipe Name y Description.
  2. Añade cada Item Definition y cantidad en Ingredients.
  3. Añade uno o varios Results.
  4. Usa Crafting Time 0 para fabricación instantánea o un valor en segundos para fabricación temporizada.
  5. Si necesita una estación, escribe Required Station Type.
  6. En CraftingStation, Station Type debe coincidir exactamente con el de la receta.
  7. Asigna Player Inventory y la lista de Recipes en CraftingSystem.

CanCraft valida cantidades; CraftInstant consume ingredientes y entrega resultados; CraftTimed emite los eventos de inicio, finalización o fallo.

Loot: probabilidades y generación

El campo Weight es relativo: una entrada con peso 10 es el doble de probable que otra con peso 5. Configura Min/Max Drops en la tabla y Min/Max Quantity en cada entrada.

  • Allow Duplicates: permite que un mismo objeto salga más de una vez en una tirada.
  • Min Level: excluye la entrada si el nivel recibido es menor.
  • Drop Prefab: prefab físico que representa el botín generado.
  • Drop Spread Radius: dispersión alrededor del emisor.
  • One Time Only: impide generar de nuevo desde el mismo Loot Dropper.
Peso: límite y penalización
  1. Crea un Weight Config y define Max Weight.
  2. Decide si Allow Overweight permite superar el límite.
  3. Configura Warning Threshold entre 0 y 1; por ejemplo, 0.8 avisa al 80 %.
  4. Define Overweight Speed Multiplier si tu controlador aplicará una penalización.
  5. Añade WeightInventoryProvider, asigna Config e Inventory.

El proveedor se registra en Awake. Puedes leer Current Weight, Remaining Weight, Weight Ratio, Is Near Capacity e Is Overweight, y escuchar OnWeightChanged.

07

INSPECTOR

Componentes y campos

Esta referencia explica qué debes asignar en el Inspector y qué ocurre si dejas un campo vacío.

Inventory System

Add Component → ModularInventoryPro → Inventory System

Slot Count
Número de huecos. Puede cambiarse con Resize; reducirlo elimina lo que quede fuera.
Database
Base de datos usada para resolver objetos. Debe contener todas las definiciones utilizadas.
Events
UnityEvents para añadido, eliminado, usado e inventario lleno.

Inventory UI Manager

Add Component → ModularInventoryPro → UI → Inventory UI Manager

Inventory
Inventario que se dibujará.
Slot Container
RectTransform que recibirá los slots generados.
Slot Prefab
Prefab con SlotUI y sus referencias visuales.
Tooltip / Context Menu / Drag Drop
Subcomponentes opcionales para esas funciones.
Theme
Colores, tamaños, sprites y fuente.
Grid Columns
Número de columnas visuales.
Auto Refresh
Actualiza cada frame; úsalo solo si otro sistema modifica slots sin eventos.

Slot UI

Normalmente configurado en SlotUI.prefab

Background Image
Fondo, hover y selección.
Icon Image
Icono del Item Definition.
Border Image
Borde base o borde de rareza.
Quantity Text
Cantidad de la pila.
Quantity Badge
Fondo opcional de la cantidad.

Tooltip / Context Menu / Drag Drop

Tooltip
Panel, textos, barra de rareza y offset respecto al cursor.
Context Menu
Panel, plantilla de botón y offset.
Drag Drop Handler
Canvas padre e imagen temporal que sigue el cursor.

Inventory Panel Style

Custom Background / Frame
Arte propio para el panel.
Image Type
Simple o Sliced según el sprite.
Tint / Opacity
Color y transparencia sin editar la textura.
Status Modules
Bloques inferiores configurables con visibilidad, etiqueta, valor, icono y color.

Demo Pickup

Item Definition / Quantity
Objeto y cantidad recogida.
Rotate / Rotation Speed
Rotación visual.
Bob / Amplitude / Speed
Movimiento vertical flotante.
Collider
Necesario para que el jugador lo encuentre en el rango de interacción.

Demo Player Controller

Movement
Velocidad, gravedad y sensibilidad de cámara.
Interaction Range
Radio usado para encontrar IInteractable.
Keys
Teclas de interacción, inventario y ordenación.
Interaction Mask
Capas examinadas; excluye capas que nunca sean interactuables.
References
Inventory, panel, UI Manager y Hand Equip.
Prompt
Texto que muestra la acción disponible.

Demo Hand Equip

Mount Point
Transform hijo de la cámara donde aparece el modelo equipado.
Target Size
Tamaño normalizado en mano.
Dropped Item Size
Tamaño al soltarlo al mundo.
Drop Force
Impulso hacia delante al soltar.

Demo Chest

Loot Table
Contenido inicial aleatorio; se genera una sola vez al iniciar.
Chest Slot Count
Capacidad del contenedor.
Chest UI Panel / Manager
Panel compartido y gestor que se enlazará al inventario creado.
Database
Base usada por su inventario.
Animator
Opcional para animación de apertura.

Inventory Save Manager

Inventory / Database
Fuente que se serializa y base que reconstruye definiciones.
Save Key
Clave única de PlayerPrefs y de la caché entre escenas.
Persist Between Scenes
Conserva la sesión en memoria.
Auto Save
Guarda al pausar o salir. No equivale a persistencia entre escenas.
08

ADAPTACIÓN AL PROYECTO

Cómo modificar cada parte

01

Cambiar tamaño del inventario

Edita Slot Count en InventorySystem. Cambia Grid Columns en InventoryUIManager. En ejecución usa Resize(n) y después RefreshAllSlots() si la interfaz ya estaba construida.

02

Cambiar teclas y movimiento

En DemoPlayerController modifica Interact Key, Inventory Key, Sort Key, Move Speed, Gravity y Mouse Sensitivity. Para el nuevo Input System, conserva las llamadas públicas del inventario y reemplaza solamente la lectura de entrada.

03

Cambiar colores y fuente

Duplica DefaultTheme, edita los colores, Slot Size, Spacing, Padding, sprites y tipografía. Asigna el nuevo tema al UI Manager o llama a SetTheme.

04

Cambiar completamente el panel

Usa InventoryPanelStyle para fondo, marco y módulos inferiores. Si creas tu propio prefab de slot, conserva SlotUI y enlaza sus cinco referencias.

05

Cambiar el modelo de un objeto

Asigna el nuevo prefab en Model Prefab del Item Definition. El modelo se normaliza para mano y mundo. Ajusta Target Size o Dropped Item Size si su escala visual no es adecuada.

06

Cambiar el modelo de un contenedor

Sustituye solo los hijos visuales. Mantén DemoChest en la raíz, un Collider en la raíz o un hijo y las referencias UI/Database. Si el material aparece rosa, usa un shader compatible.

07

Crear un pickup propio

Crea un GameObject con Collider y DemoPickup; asigna Item Definition y Quantity. El modelo puede ser hijo o proceder del Item Definition. Ajusta animación de giro y flotación.

08

Cambiar textos o idioma

Los títulos del contenedor usan el nombre del GameObject. Los textos de ayuda de la demo están en DemoPlayerController y DemoChest. Para localización profesional, reemplázalos por claves de tu sistema de idiomas.

09

Añadir una acción

Hereda de ItemAction, implementa Execute y opcionalmente CanExecute. Crea el asset de la acción y añádelo a Actions del Item Definition.

10

Usar otra interfaz

La lógica no depende del aspecto visual. Tu UI puede leer GetSlots(), llamar a Add/Remove/Move/Use y escuchar InventoryEvents. No es obligatorio conservar la UI de la demo.

11

Usar otra cámara o controlador

El sistema central no exige DemoPlayerController. Desde tu controlador llama a las APIs públicas y crea tu propia detección de IInteractable o interacción por raycast.

12

Inventarios especiales

Implementa IInventoryProvider para límites por cuadrícula, peso, reglas de clase o filtros. Regístralo con SetProvider.

Qué archivos conviene modificar

Seguro y recomendadoScriptableObjects, prefabs duplicados, temas, tus propios scripts y escenas.
Modificar con cuidadoScripts de Demo: son ejemplos que puedes adaptar, pero conserva una copia si quieres comparar.
Evitar si no es necesarioRuntime/Core: cambia el núcleo solo si necesitas alterar las reglas globales del asset.
09

PERSISTENCIA

Guardado y cambio de escenas

Añade InventorySaveManager junto al inventario y asigna Inventory, Database y una Save Key única.

OpciónQué conservaCuándo usarla
Persist Between ScenesInventario durante la sesión actual.Cambios de mapas o niveles.
Auto SaveInventario en PlayerPrefs.Cerrar, pausar y continuar otro día.
Save KeyIdentidad del inventario.Separar jugador, perfiles o inventarios.

Cambio de escena

  1. Activa Persist Between Scenes.
  2. Usa la misma Save Key en origen y destino.
  3. Incluye Inventory System y Save Manager en ambas escenas.
  4. Asigna la misma Item Database o una que contenga los mismos IDs.
  5. La nueva UI se construirá mostrando los slots restaurados.

Cerrar y continuar después

  1. Activa Auto Save o llama a Save() en un punto de guardado.
  2. Al comenzar, comprueba HasSave().
  3. Llama a Load() después de inicializar Inventory y Database.
  4. Para borrar la partida, usa DeleteSave().

Nueva partida

  1. Llama a ClearSessionData() para eliminar la caché entre escenas.
  2. Si también quieres borrar el guardado en disco, llama a DeleteSave().
  3. Inicializa o limpia el inventario con Clear().

Varios perfiles

  1. Usa una Save Key por perfil: Player_1, Player_2
  2. No compartas la clave entre inventarios independientes.
  3. Para cofres persistentes, cada cofre necesita una clave estable y su propio gestor o sistema de mundo.

El formato incluye índice de slot, Item ID, cantidad, Instance ID, durabilidad, durabilidad máxima y Custom Data. Al cargar, las definiciones se resuelven desde Item Database; si un ID ya no existe, ese slot se omite y Unity muestra un aviso.

// Guardado manual en PlayerPrefs
saveManager.Save();
saveManager.Load();

// Persistencia durante la sesión
saveManager.PersistBetweenScenes = true;

// Empezar una partida nueva sin el inventario de la sesión anterior
saveManager.ClearSessionData();

// Almacenamiento personalizado
string json = saveManager.SaveToString();
saveManager.LoadFromString(json);

Serializador personalizado

public class MySerializer : IInventorySerializer
{
    public string Serialize(InventorySaveData data) { /* ... */ }
    public InventorySaveData Deserialize(string json) { /* ... */ }
}

saveManager.Serializer = new MySerializer();
10

INTEGRACIÓN

Eventos

Escucha los eventos estáticos desde código o añade InventoryEventRelay para conectarlos desde el Inspector sin escribir código.

InventoryEvents.OnItemAdded += (item, qty) =>
    Debug.Log($"Añadido: {qty}x {item.Definition.displayName}");

InventoryEvents.OnItemRemoved += (item, qty) => { };
InventoryEvents.OnItemMoved += (item, from, to) => { };
InventoryEvents.OnInventoryFull += inventory => { };
InventoryEvents.OnItemUsed += item => { };
11

REFERENCIA RÁPIDA

API principal

InventorySystem

AddItem(definition, qty)Añade objetos y devuelve la cantidad añadida. AddItemInstance(instance, qty)Añade una instancia existente. RemoveItem(definition, qty)Elimina y devuelve la cantidad eliminada. RemoveItemAtSlot(index, qty)Elimina desde un slot concreto. MoveItem(from, to)Mueve, combina o intercambia slots. SplitStack(slot, amount)Divide una pila. UseItem(slot)Ejecuta la primera acción disponible. HasItem(definition, qty)Comprueba una cantidad. GetItemCount(definition)Cuenta unidades. Sort() / Clear() / Resize(size)Gestiona la estructura del inventario.

Otros sistemas

EquipmentManager.Equip(slotId, item)Equipa una instancia. EquipmentManager.Unequip(slotId)Desequipa y devuelve el objeto. EquipmentManager.GetTotalStat(name)Calcula una estadística total. CraftingSystem.CanCraft(recipe)Comprueba ingredientes. CraftingSystem.CraftInstant(recipe)Fabrica inmediatamente. CraftingSystem.CraftTimed(recipe)Inicia fabricación temporizada. ItemDatabase.GetItemById(id)Resuelve una definición por ID. InventoryUIManager.SetInventory(inv)Conecta otra fuente de inventario.
12

PERSONALIZACIÓN

Amplía el sistema

Acción personalizada

[CreateAssetMenu(menuName = "MyGame/Actions/Teleport")]
public class TeleportAction : ItemAction
{
    public Vector3 destination;

    public override void Execute(ItemInstance item, InventorySystem inventory)
    {
        inventory.transform.position = destination;
    }
}

Proveedor de inventario personalizado

public class MyCustomProvider : IInventoryProvider
{
    // Implementa capacidad, slots, añadir, eliminar y validaciones.
}

inventorySystem.SetProvider(new MyCustomProvider());

Usa datos personalizados de ItemInstance para propiedades únicas como nombre generado, nivel, encantamiento o propietario.

instance.SetCustomData("quality", "masterwork");
string quality = instance.GetCustomData("quality", "normal");
13

MANTENIMIENTO

Herramientas y estructura del paquete

Inventory Designer

  • Quick Setup: slots, columnas, tema, base de datos y módulos.
  • Items: crea y abre Item Definitions registrados.
  • Modules: resumen de los módulos seleccionados.
  • Preview: revisa tamaño, separación, colores y columnas del tema.

Herramientas Demo

  • Build Demo Scene: reconstruye la escena de ejemplo.
  • Generate Demo Assets: genera los datos iniciales de demostración.
  • Finalize Demo: prepara materiales, iconos, prefabs y referencias.
  • Fix Barrel Interaction: vuelve a enlazar el barril de la demo si cambiaste su modelo.
Runtime/CoreInventario, slots, base de datos y eventos.
Runtime/ItemsDefiniciones, instancias, categorías, rarezas y acciones.
Runtime/UISlots, temas, tooltip, menú contextual y drag & drop.
Runtime/ModulesEquipment, Crafting, Loot y Weight.
Runtime/SaveLoadDatos, JSON, PlayerPrefs y persistencia entre escenas.
EditorVentanas e inspectores que solo se compilan dentro del editor.
DemoEscena, scripts de ejemplo, prefabs, modelos e iconos.
DocumentationEsta guía, estilos, interacción e imágenes.

Checklist antes de publicar tu juego

14

AYUDA

Solución de problemas

El modelo aparece rosa o magenta

Unity no encuentra un shader compatible. Asigna al modelo un material válido para Built-in o URP. Al cambiar un modelo dentro de un prefab, confirma que sus Mesh Renderers conservan materiales asignados.

No puedo interactuar con el cofre o barril

Comprueba que existe un Collider, que el jugador está dentro del Interaction Range y que DemoChest está en el objeto raíz o en un padre del Collider. Revisa también Interaction Mask.

El panel aparece, pero no muestra objetos

Verifica que Inventory UI Manager apunta al Inventory System correcto, que Slot Prefab y Slot Container están asignados y que los objetos pertenecen al Item Database utilizado.

El inventario se vacía al cambiar de escena

Activa Persist Between Scenes y usa la misma Save Key en ambas escenas. Cada Inventory Save Manager debe tener Inventory y Database asignados.

Los objetos aparecen duplicados

No uses simultáneamente dos gestores con la misma Save Key para inventarios diferentes. Para una partida nueva, limpia la sesión con ClearSessionData().

Arrastrar no funciona

La escena necesita un EventSystem y cada Canvas debe incluir Graphic Raycaster. Comprueba que los slots reciben eventos y que el panel no está bloqueado por otro elemento gráfico.