Importa el paquete
Importa ModularInventoryPro en la carpeta Assets. Espera a que Unity termine de compilar antes de abrir herramientas o escenas.
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.
PRIMEROS PASOS
Importa ModularInventoryPro en la carpeta Assets. Espera a que Unity termine de compilar antes de abrir herramientas o escenas.
Ve a Assets/ModularInventoryPro/Demo/Scenes/DemoScene y pulsa Play para comprobar el sistema completo.
Recoge objetos, abre el inventario, equipa, suelta objetos y transfiere contenido entre el jugador y los contenedores.
CONFIGURACIÓN
Tools → ModularInventoryPro → Inventory Designer.ItemDatabase y el tema visual.CONFIGURACIÓN MANUAL
Item Database.InventorySystem al jugador.InventoryUIManager.EventSystem en la escena.DATOS
Cada objeto es un ItemDefinition. Esto permite reutilizar la misma definición en pickups, recetas, loot tables, inventarios y equipamiento.
ModularInventoryPro/Item CategoryModularInventoryPro/Item RarityModularInventoryPro/Actions/ConsumeModularInventoryPro/Actions/EquipModularInventoryPro/Actions/DropConsumeActionElimina 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.EXPERIENCIA DE USO
Mueve, intercambia y combina pilas. También funciona entre el inventario y otro contenedor.
Usa Shift + clic para separar la mitad en el primer slot disponible.
El clic derecho muestra las acciones disponibles para ese objeto.
Muestra nombre, descripción, rareza, estadísticas, peso y valor al pasar el cursor.
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);
ALMACENAMIENTO
DemoChest al objeto raíz.SISTEMA MODULAR
Añade EquipmentManager, crea Slot Definitions y asigna EquipAction a los objetos equipables.
GetTotalStat("attack")Añade CraftingSystem, crea recetas con ingredientes y resultados, y usa opcionalmente una Crafting Station.
CraftInstant(recipe)Crea una Loot Table con pesos, cantidades y niveles; usa LootDropper en cofres o enemigos.
DropLootInto(inventory)Añade WeightInventoryProvider y un Weight Config para limitar carga y definir umbrales.
RecalculateWeight()EquipmentManager al mismo GameObject que InventorySystem.head, chest, mainHand o offHand.EquipAction y escribe en Target Slot ID exactamente el mismo identificador.EquipmentManager y sobrescribe GetModifiersFromItem.Si se equipa otro objeto en un slot ocupado, el anterior se devuelve para que puedas reinsertarlo en el inventario.
CraftingStation, Station Type debe coincidir exactamente con el de la receta.CraftingSystem.CanCraft valida cantidades; CraftInstant consume ingredientes y entrega resultados; CraftTimed emite los eventos de inicio, finalización o fallo.
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.
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.
INSPECTOR
Esta referencia explica qué debes asignar en el Inspector y qué ocurre si dejas un campo vacío.
Add Component → ModularInventoryPro → Inventory System
Resize; reducirlo elimina lo que quede fuera.Add Component → ModularInventoryPro → UI → Inventory UI Manager
SlotUI y sus referencias visuales.Normalmente configurado en SlotUI.prefab
ADAPTACIÓN AL PROYECTO
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.
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.
Duplica DefaultTheme, edita los colores, Slot Size, Spacing, Padding, sprites y tipografía. Asigna el nuevo tema al UI Manager o llama a SetTheme.
Usa InventoryPanelStyle para fondo, marco y módulos inferiores. Si creas tu propio prefab de slot, conserva SlotUI y enlaza sus cinco referencias.
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.
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.
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.
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.
Hereda de ItemAction, implementa Execute y opcionalmente CanExecute. Crea el asset de la acción y añádelo a Actions del Item Definition.
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.
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.
Implementa IInventoryProvider para límites por cuadrícula, peso, reglas de clase o filtros. Regístralo con SetProvider.
PERSISTENCIA
Añade InventorySaveManager junto al inventario y asigna Inventory, Database y una Save Key única.
Save() en un punto de guardado.HasSave().Load() después de inicializar Inventory y Database.DeleteSave().ClearSessionData() para eliminar la caché entre escenas.DeleteSave().Clear().Player_1, Player_2…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);
public class MySerializer : IInventorySerializer
{
public string Serialize(InventorySaveData data) { /* ... */ }
public InventorySaveData Deserialize(string json) { /* ... */ }
}
saveManager.Serializer = new MySerializer();
INTEGRACIÓN
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 => { };
REFERENCIA RÁPIDA
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.
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.
PERSONALIZACIÓN
[CreateAssetMenu(menuName = "MyGame/Actions/Teleport")]
public class TeleportAction : ItemAction
{
public Vector3 destination;
public override void Execute(ItemInstance item, InventorySystem inventory)
{
inventory.transform.position = destination;
}
}
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");
MANTENIMIENTO
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.AYUDA
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.
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.
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.
Activa Persist Between Scenes y usa la misma Save Key en ambas escenas. Cada Inventory Save Manager debe tener Inventory y Database asignados.
No uses simultáneamente dos gestores con la misma Save Key para inventarios diferentes. Para una partida nueva, limpia la sesión con ClearSessionData().
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.