The Inventory System package was heavily refactored in the 1.5.x architecture shift.
It now follows a more modular runtime layout and is designed to work well with the Data package and CatalogKey-driven authoring patterns.
IInventoryItemDatabase)UI and inventory code take IInventoryItemDatabase (lookup definitions, icons, CreateItem, etc.). Resolve it with ServiceLocator.Get<IInventoryItemDatabase>() after registration.
Default implementation: InventoryItemDatabaseSO — a ScriptableObject that reads item definitions from IAssetCatalog<InventoryItemDefinitionSO> / ICatalog registered under the items provider id (same pattern as samples). Use the asset as-is, subclass it, or provide your own IInventoryItemDatabase and register that instance against the interface.
The old InventoryItemDatabase type name is removed; migrate your ItemDatabase (or similar) to InventoryItemDatabaseSO or IInventoryItemDatabase.
InventoryItemDefinitionSO)Definitions are always DataSO<InventoryItemDefinition> via InventoryItemDefinitionSO. There is no InventoryItemDefinitionSO<T>—catalogs and samples expect that concrete SO type.
class EquipmentSO : InventoryItemDefinitionSO { } with [CreateAssetMenu(...)].EquipableFeature (and related RPG bridge features) on InventoryItemDefinition.Features, instead of a parallel generic definition type on the SO.CatalogKey) while still showing rich inspector previews.Inventory tooltips no longer call a virtual like GetItemStatDisplayLines on definitions. The slot tooltip builder calls InventoryItem.BuildItemTooltipStats, which loops InventoryItemDefinition.Features and, for each IItemFeature, calls BuildTooltipContent(VisualElement host, in ItemTooltipContext context).
Migrate custom stat/ingredient lines by implementing IItemFeature (plus IFeature.CloneFeature), add an instance to the item definition’s Features list, and build VisualElement children on the host (see ItemTierFeature for a small example, EquipableFeature for RPG stat text). Use ItemTooltipContext for IInventoryItemDatabase, optional attribute-name filtering, and equipment comparison via GetComparison.
Note:
InventoryItemDefinition.Featuresis typed asList<IFeature>(the base interface). If your project has otherIFeaturesub-interfaces (e.g. unit feature definitions), the Inspector dropdown will show all types. To restrict the dropdown to inventory features only, change the list type toList<IItemFeature>and register a[CustomPropertyDrawer(typeof(IItemFeature), true)]that scans only forIItemFeaturetypes. See Sub-interface type filtering for the full pattern.
ItemTierFeature tooltips resolve the tier line through IValueCatalog registered under InventoryConstants.ItemTierCatalogId (GetDisplayValue on the effective CatalogKey, fallback to the raw key). Slot USS on the Background button adds a slug derived from that display when available (e.g. common from Common), otherwise from the key (e.g. 0 stays 0). Style tier chrome in USS against those slugs; ClearSlotVisual removes slugs and legacy raw-key classes for all keys listed in the tier ICatalog.
A slot click closes the tooltip, runs your OnClick handler, then re-shows the tooltip — right for inspect-style clicks, wrong when the handler moved, replaced, or consumed from the item (place-into-loadout flows): the stale tooltip floated over the new state until the pointer left the slot. Since 0.3.2 the re-show requires the same item instance at the same amount; handlers that mutate the slot get a clean close with no re-show. No consumer changes needed — delete any deferred close-all workarounds.
The 0.4.1 release carried only a version bump; these modes ship in 0.4.2.
InventoryViewPagination reads its items in one of two ways, chosen at construction:
inventory given): the view pages the live InventoryBase.Items and re-reads them on Refresh(). Attach it to the screen or modal view with AttachToView(uiView) and it also rebuilds on every show — fade-in and occlusion reveal alike — so a grid built at scene boot never pages a stale snapshot. SetItemList on a bound view is a caller bug and logs an error (it was a silent no-op before 0.4.2).inventory: null): the view pages whatever list you pass to SetItemList — a gift picker showing only giftable items, a shop stock, a reward roll. Call Refresh() after mutating that list in place.// bound: live inventory, refreshes itself on every show
var grid = new InventoryViewPagination(itemDatabase, player.Inventory, slotTemplate, gameObject, root, container, tooltip);
grid.AttachToView(UIView);
// unbound: a curated list
var picker = new InventoryViewPagination(itemDatabase, null, slotTemplate, gameObject, root, container, tooltip);
picker.SetItemList(giftableItems);ShowOnlyFilterButtons (hide filter chips by index) is removed. Declare the group's universe on the grid instead: view.SetFilterOptions(0, new[] { FilterIds.Meal, FilterIds.Potion }). Values outside the set are ignored, their chips are hidden, and with nothing active the grid shows the union of the allowed values, so no click sequence can widen a curated view (Luna GridViewBase, 2.1.4).
Runtime/Item/Core: definitions, references, item databasesRuntime/Item/Features: feature modules (compose behavior)Runtime/Item/Slot: slot controllers, visuals, tooltip buildersRuntime/UI: inventory/equipment UI controllers and viewsRuntime/ItemStats: stat line data and controllers (UI-friendly formatting)Data.DropTable/Runtime: weighted drop sources and roll helpers — see Drop TableSettings
Theme
Light
Contrast
Material
Dark
Dim
Material Dark
System
Sidebar(Light & Contrast only)
Font Family
DM Sans
Wix
Inclusive Sans
AR One Sans
Direction