Demo5 Containers
Examples/Demo5 Containers/Containers Demo.unity
Este es un ejemplo de items-inventario que contienen su propio conjunto de items anidado.
Qué muestra la demo
- item instances en lugar de simples filas de lista
- un contenedor como item normal en el inventario del jugador
- un panel de UI separado para el contenido del contenedor activo
- acción de context menu para abrir un contenedor
- soltar un item directamente sobre el icono de un contenedor para meterlo dentro
- protección contra ciclos al anidar contenedores
Cómo está estructurada
Datos:
Scripts/Data/ItemInstance.csScripts/Data/ContainerItemInstance.csScripts/Data/IContainerizeItemInstance.csScripts/ContainerDemoManager.cs
Bindings y UI:
Scripts/Bindings/PlayerContainerInventoryDataBinding.csScripts/Bindings/ContainerInventoryDataBinding.csScripts/UI/ContainerUIController.csScripts/ContextMenu/OpenContainerMenuEntrySO.cs
Cómo funciona
Apertura de contenedor:
ContainerItemInstanceestá en el inventario del jugador.- El context menu llama a
OpenContainerMenuEntrySO. - Mediante
Events.OnOpenClick, el contenedor seleccionado se pasa aContainerUIController. - El controller establece el contenedor activo.
ContainerInventoryDataBindingreconstruye el tamaño del inventario y carga el contenido del contenedor.
Movimiento de objetos:
- Las operaciones drag/drop normales funcionan entre el inventario del jugador y el del contenedor.
- Los bindings sincronizan la transferencia con la lista del jugador o
ContainerItemInstance.Items. - Si se suelta un item sobre un slot que contiene un contenedor,
IPreRuleOccupiedSlotDropHandlerintercepta el intento antes de las reglas normales de drop. - El binding comprueba que el contenedor tenga capacidad y que el movimiento no coloque un contenedor dentro de sí mismo ni dentro de uno de sus hijos.
- Si la comprobación pasa,
ContainerViewRegistry.InsertIntoContainer(...)mete el item en el contenedor y devuelveOccupiedSlotDropResult.Handled. - Si la comprobación falla, el handler devuelve
Rejectedy el item se queda en su lugar original.
Cuándo usar este ejemplo como base
- un item debe contener un inventario anidado
- necesitas context menu para operaciones sobre items
- soltar sobre un slot ya ocupado debe significar una acción aparte, por ejemplo "meter esto dentro del contenedor"