Quick Start
Esta guía crea dos inventarios normales entre los que se pueden arrastrar objetos.
Esto ya está implementado en el primer ejemplo, donde puedes ver el resultado final.
Incluso en un escenario básico, normalmente necesitas algo de código de integración para tus datos. En esta guía será:
ItemSOcomo datos del itemItemSOAdaptercomo representación para el sistema de inventarioSimpleBindingcomo puente entre la UI y tu lista de datos
Paso 1. Preparar la escena
Los inventarios son uGUI normal, así que viven en un canvas de UI.
-
Crea un
Canvaspara los inventarios si la escena aún no tiene uno.En la ventana
Hierarchy, haz clic derecho en un espacio vacío y eligeUI → Canvas.Unity crea un objeto
EventSystemjunto con elCanvas. Para empezar rápido, deja elCanvasconRender Mode=Screen Space - Overlay. -
Añade
DragAndDropManagera la escena.Busca
Prefabs/DragCanvas.prefaben la ventanaProjecty arrástralo a un espacio vacío de laHierarchy— debe quedar como objeto raíz de la escena, junto a tuCanvas.DragCanvastiene su propioCanvasconSorting Order = 100, que es lo que hace que el objeto arrastrado se dibuje por encima del resto de la interfaz. Además deDragAndDropManager, el prefab llevaInputEventRouteryDragVisualPresenter. La escena necesita exactamente uno de estos objetos: gestiona todas las operaciones de transferencia y controla el visual del item "en la mano". -
Comprueba el
EventSystem.Si no está en la
Hierarchy, haz clic derecho en un espacio vacío y eligeUI → Event System.Selecciona
EventSystemy mira en elInspectorqué módulo de entrada tiene:- proyecto con input legacy — necesita
StandaloneInputModule; - proyecto con New Input System — necesita
InputSystemUIInputModule.
El asset soporta ambos.
DragAndDropManagertrae por defecto una configuración mínima funcional de acciones. Puedes ajustarla o crear tu propia copia y asignarla en la escena. - proyecto con input legacy — necesita
Paso 2. Crear dos inventarios
-
En la
Hierarchy, haz clic derecho sobre el objetoCanvasy eligeCreate Empty. Llama al nuevo objetoBackpack.Como el padre es un
Canvas, Unity le da al objeto unRectTransform. Si quieres un fondo desde el principio, eligeUI → Panelen lugar deCreate Empty. -
Dale a
Backpacktamaño y posición.Un objeto de UI tiene
RectTransformen lugar deTransform, y después deCreate EmptysuWidthyHeightvalen cero. El tamaño se define aquí, no con la escala:- selecciona
Backpacky en elInspector, en el componenteRectTransform, ponWidth=540,Height=240; - la posición se ajusta cómodamente con el botón de presets de anclaje: el cuadrado con
una cruz en la esquina superior izquierda del
RectTransform. Púlsalo y eligemiddle centerpara empezar rápido, y luego mueve el objeto con los camposPos XyPos Y.
Si usaste
UI → Panel, ya está estirado a toda la pantalla — simplemente pon elWidthy elHeightque quieras del mismo modo. - selecciona
-
Haz clic derecho sobre
Backpack, eligeCreate Emptyy llama al objetoSlotContainer.Estíralo sobre todo el
Backpack: pulsa el botón de presets de anclaje y, manteniendoAltyShift, elige la opción inferior derechastretch / stretch.Después pulsa
Add Component → Layout → Grid Layout Groupy rellena sus campos:Campo de Grid Layout GroupValor Cell Size100×100— el tamaño del slot dePrefabs/Slot.prefabSpacing5en X e YConstraintFixed Column CountConstraint Count5, así 10 slots forman una cuadrícula de 5 × 2Este componente es el que coloca los slots en cuadrícula.
-
Añade el componente
UniversalInventoryaBackpacky rellena los campos.En el Inspector están repartidos en grupos plegables:
Grupo
Slot Setup:Campo Valor Slot ContainerEl objeto SlotContainerdel paso 3 — el padre bajo el que se crean los slotsSlot PrefabPrefab de slot que quieras usar; Prefabs/Slot.prefabsirve para empezarInitial Slot CountPor ejemplo 10. Se crearán tantos slots enSlot Containeral iniciar. Si los creaste tú, cachéalos con el botónCache SlotsGrupo
Strategy— dos campos sin etiqueta, cada uno se elige en un desplegable:Qué elegir Valor desplegable superior (estrategia del inventario) UniqueItemStrategypara el inicio más simple, donde cada item ocupa su propio slotdesplegable inferior (gestión de slots) FixedSlotManagementSettingspara un número fijo de slotsLos demás grupos (
Rules,Drop Policy,Placement) puedes dejarlos como están. -
Duplica
Backpacky crea un segundo inventario, por ejemploChest. Sepáralos con el campoPos Xpara que ambos se vean a la vez.
Info
Al iniciar, el inventario intenta encontrar slots ya creados debajo de Slot Container
y cachearlos. Si no hay suficientes, crea slots desde Slot Prefab hasta
Initial Slot Count. También puedes crear todos los slots manualmente en modo edición
y cachearlos con Cache Slots, para que esta operación no ocurra durante el juego.
Paso 3. Definir el tipo de item
Supongamos que tienes un tipo de item:
[CreateAssetMenu(menuName = "Game/Item")]
public class ItemSO : ScriptableObject
{
[field: SerializeField] public string ItemName { get; private set; }
[field: SerializeField] public Sprite Icon { get; private set; }
}
Para mostrar este tipo en slots, crea un adapter que implemente IItemAdapter:
using UDND.Core;
using UnityEngine;
public class ItemSOAdapter : IItemAdapter
{
// Referencia a los datos de tu tipo.
public readonly ItemSO Data;
// Constructor.
public ItemSOAdapter(ItemSO data) => Data = data;
// Campos obligatorios de la interfaz.
public string ItemId => Data.GetInstanceID().ToString();
public Sprite Icon => Data.Icon;
public string DisplayName => Data.ItemName;
}
Significado de los campos obligatorios:
ItemId— sirve para decidir si los items pueden unirse en un slot para las estrategiasStackableySeparableStacks.Icon— sirve para mostrar la imagen del item en el slot.DisplayName— se usa principalmente en logs y algunos sistemas opcionales, como el ejemplo de tooltips. Puede ser una cadena vacía.
Paso 4. Añadir un binding simple
Para mostrar tus datos en slots, debes dar acceso al sistema a esos datos y definir cómo puede interactuar con ellos. En proyectos reales, estos conjuntos de datos normalmente viven en scripts de jugador, personajes u objetos del mundo. En este ejemplo, la lista se guarda directamente en el componente.
using UDND.Core;
using UDND.DataBinding;
using System.Collections.Generic;
using UnityEngine;
public class SimpleBinding : ListInventoryDataBinding<ItemSO, ItemSOAdapter>
{
// Tu lista de datos.
[SerializeField] private List<ItemSO> _items;
// Overrides obligatorios.
protected override IReadOnlyList<ItemSO> GetItems() => _items;
protected override ItemSOAdapter CreateAdapter(ItemSO item) => new(item);
protected override void AddToData(ItemSOAdapter adapter) => _items.Add(adapter.Data);
protected override void RemoveFromData(ItemSOAdapter adapter) => _items.Remove(adapter.Data);
}
ListInventoryDataBinding es una plantilla de DataBinding para trabajar con datos
guardados como lista. Al heredar de ella, indicas tu tipo de item y el tipo de adapter.
Significado de los métodos obligatorios:
GetItems— se usa para el render inicial de datos.CreateAdapter— crea el adapter y le pasa los datos necesarios.AddToData— se llama cuando un item se transfiere a este inventario.RemoveFromData— se llama cuando un item se transfiere fuera de este inventario.
Añade este binding a ambos inventarios o a otros objetos de la escena.
Asigna referencias a los inventarios correspondientes.
Cada binding tendrá su propia lista _items.
Info
En proyectos reales, en lugar de una lista simple _items, normalmente interactuarás
con tus propios scripts donde se almacenan los datos. Mira los ejemplos para ver cómo
se implementa este patrón.
Paso 5. Rellenar datos iniciales
- Crea varios assets
ItemSO. - Añádelos a
_itemsen tus componentesSimpleBinding. - Ejecuta la escena.
Si todo está configurado correctamente:
- ambos inventarios muestran objetos
- un objeto se puede arrastrar de un inventario a otro
- las listas de datos se actualizan automáticamente durante la transferencia
Qué ocurre internamente
flowchart LR
A["El jugador arrastra un item"] --> B["<b>UniversalInventory</b> procesa la transferencia"]
B --> C["Se llaman métodos en <b>DataBinding</b>"]
C --> D["Tu List<ItemSO> se actualiza"]
Errores comunes del primer proyecto
- el inventario se creó como objeto 2D o de escena normal en lugar de UI dentro de un
Canvas: el Inspector muestra unTransformen vez de unRectTransform BackpackoSlotContainersiguen conWidthyHeighta cero en suRectTransform, así que el inventario no se ve o aparece donde no esperabas- el tamaño se intentó ajustar con
Scaleen lugar deWidthyHeight DragCanvasse colocó dentro de tu propioCanvas, y el item arrastrado desaparece detrás de la interfazSlot Containerapunta al propio inventario en lugar de a un objeto hijo conGrid Layout GroupItemIdno coincide con tu lógica de stacking, y los items se unen o no se unen de forma inesperada- no hay
DragAndDropManageren la escena - no hay
EventSystemen la escena - el proyecto usa input legacy, pero
EventSystemno tieneStandaloneInputModule - el binding está conectado al
UniversalInventoryequivocado InventoryDataBindingno tiene asignada una referencia de inventory- los datos cambian fuera del pipeline, pero no se llama a
ReloadUI(). Añade una llamada aReloadUIen tu DataBinding cuando cambien los datos
Ver también:
- Ejemplos — si quieres elegir entre las 6 demos
- Data Binding — si necesitas entender lifecycle y puntos de extensión
- Estrategias de colocación — si quieres añadir tu propia estrategia o modo de slot management
- Troubleshooting — si la escena básica no funciona al primer intento