Demo5 Containers
Examples/Demo5 Containers/Containers Demo.unity
Это пример предметов-инвентарей, которые сами содержат вложенный набор предметов.
Что показывает демо
- item instances вместо простых записей списка
- контейнер как обычный предмет в инвентаре игрока
- отдельную UI-панель для содержимого активного контейнера
- context menu action для открытия контейнера
- drop предмета прямо на иконку контейнера, чтобы положить предмет внутрь
- защиту от циклов при вложении контейнеров
Как устроено
Данные:
Scripts/Data/ItemInstance.csScripts/Data/ContainerItemInstance.csScripts/Data/IContainerizeItemInstance.csScripts/ContainerDemoManager.cs
Bindings и UI:
Scripts/Bindings/PlayerContainerInventoryDataBinding.csScripts/Bindings/ContainerInventoryDataBinding.csScripts/UI/ContainerUIController.csScripts/ContextMenu/OpenContainerMenuEntrySO.cs
Как работает
Открытие контейнера:
- В инвентаре игрока лежит
ContainerItemInstance. - Контекстное меню вызывает
OpenContainerMenuEntrySO. - Через
Events.OnOpenClickвыбранный контейнер передаётся вContainerUIController. - Контроллер выставляет активный контейнер.
ContainerInventoryDataBindingперестраивает размер inventory и загружает содержимое контейнера.
Перенос предметов:
- Между инвентарем игрока и контейнера работают обычные drag/drop операции.
- Binding-и синхронизируют перенос в player list или в
ContainerItemInstance.Items. - Если предмет бросают на слот, где лежит контейнер,
IPreRuleOccupiedSlotDropHandlerперехватывает эту попытку до обычных drop-правил. - Binding проверяет, что в контейнере есть место и что перенос не создаст вложение контейнера в самого себя или своего потомка.
- Если проверка прошла,
ContainerViewRegistry.InsertIntoContainer(...)кладет предмет внутрь контейнера и возвращаетOccupiedSlotDropResult.Handled. - Если проверка не прошла, handler возвращает
Rejected, и предмет остается на исходном месте.
Когда брать этот пример за основу
- предмет должен содержать вложенный инвентарь
- нужен context menu для операций над предметом
- нужен drop на уже занятый слот как отдельное действие, например “положить внутрь контейнера”