Use this page only when maintaining an existing legacy Bolt project with Ultimate Inventory System Version 1. Ultimate Inventory System does not ship a Bolt installer or custom Bolt units. The legacy integration works by asking Bolt to reflect the public Opsive.UltimateInventorySystem runtime assembly.
For a new project, do not interpret this page as dedicated support for the current Unity Visual Scripting package. Unity replaced Bolt’s Setup Wizard with Visual Scripting settings, while the released Ultimate Inventory System Version 1 project does not include or test a Visual Scripting integration package. Treat that combination as a project-owned compatibility evaluation.
Choose the compatible route
| Project | Recommendation |
|---|---|
| Existing Bolt graph with the Bolt Setup Wizard | Continue with the legacy reflection workflow below and test the exact Bolt version already used by the project. |
| Current Unity Visual Scripting | Prefer a supported integration or a small project-owned adapter. If you evaluate reflection, use Edit > Project Settings > Visual Scripting > Node Library and Type Options, then regenerate the Node Library. This is not a shipped Ultimate Inventory System integration. |
| Ultimate Inventory System Version 2 | Use Version 2 documentation and APIs. Version 1 types and member signatures are not a compatibility promise. |
Do not remove Antlr3.Runtime.dll from a current Ultimate Inventory System Version 1 installation. The released package no longer contains that DLL or an UltimateInventorySystem/Plugins folder. Only investigate a duplicate assembly when Unity identifies real files at two specific paths.
Configure legacy Bolt
- Install and compile Ultimate Inventory System Version 1 and the project’s existing Bolt version before changing the Bolt unit database.
- Open the Bolt Setup Wizard used by that legacy version.
- In Assemblies, add
Opsive.UltimateInventorySystem. - In Types, add only the Ultimate Inventory System types the graph needs. A practical first set is
Inventory,ItemDefinition,ItemInfo, andItemAmount. - Finish the wizard and let Bolt rebuild its reflected unit database.
- Search the graph’s unit picker for
Inventory.GetItemAmountandInventory.AddItem. Do not proceed to a production graph until both members appear with the expected parameter types.
There is no additional Ultimate Inventory System .unitypackage to import for this route. The runtime assembly is auto-referenced and its public members are the integration surface.
Build a safe first graph
Use a one-Item test before reflecting Shop, crafting, save, or UI APIs.
- Add an Ultimate Inventory System Inventory to the GameObject that owns the graph and make sure it uses the intended Inventory Database.
- Create or select the Health Potion Item Definition in that database.
- In Bolt, get the
Inventorycomponent from the graph owner. - Call
Inventory.GetItemAmount(ItemDefinition, bool, bool)with Health Potion,falsefor Check Inherently, andfalsefor Unique. Store or display the returned integer. - Call
Inventory.AddItem(ItemDefinition, int)with Health Potion and1. - Read the returned
ItemInfo.Amount. Treat an amount of1as the successful result; a flow connection alone does not prove that the Inventory accepted the Item. - Call
GetItemAmountagain and confirm that the visible Inventory and returned count both increased by one.
This graph verifies component resolution, database references, overload selection, return-value handling, and reflected units without relying on a dedicated adapter.
Use the reflected APIs deliberately
Ultimate Inventory System Version 1 does not define Bolt-specific unit names. Bolt generates ordinary member units from public C# members, and their presentation can vary with the Bolt version. Start with these source-verified signatures:
| Outcome | Version 1 public member | Result to inspect |
|---|---|---|
| Find a definition by name | InventorySystemManager.GetItemDefinition(string) |
An ItemDefinition, or null when the name is not registered. |
| Count an Item | Inventory.GetItemAmount(ItemDefinition, bool checkInherently, bool unique) |
The matching integer amount. |
| Add an Item | Inventory.AddItem(ItemDefinition, int amount) |
ItemInfo; its Amount is the amount actually added. |
| Remove an Item | Inventory.RemoveItem(ItemDefinition, int amount) |
ItemInfo; its Amount is the amount actually removed. |
| Inspect an Item result | ItemInfo.Amount, ItemInfo.Item, and ItemInfo.ItemCollection |
The result data returned by the Inventory operation. |
Reflection does not guarantee that every public generic, delegate, ref, nullable, or collection-heavy member becomes a convenient Bolt unit. Prefer simple overloads with explicit types. Add ItemInfo and ItemAmount to Bolt’s Types list only when a graph needs their ports or members; exposing every Ultimate Inventory System type makes the unit picker harder to use and does not create a supported wrapper.
Handle Inventory events
The package does not ship Bolt event units. Ultimate Inventory System Version 1 raises its Inventory notifications through Opsive.Shared.Events.EventHandler, not through Bolt Custom Events.
For a legacy graph, prefer an explicit call followed by checking its returned ItemInfo or integer. If the graph must react to changes made elsewhere, add a project-owned adapter that registers for the required Ultimate Inventory System event and forwards a simple signal to Bolt. The commonly used source events are:
Inventory_OnUpdatewith no payload.Inventory_OnAdd_ItemInfo_ItemStackwithItemInfoandItemStackpayloads.Inventory_OnRemove_ItemInfowith anItemInfopayload.
The adapter must register and unregister with the same target Inventory during the Unity lifecycle. See Events before exposing these notifications to a graph.
Editor checkpoint
Before entering Play Mode, confirm all of the following:
- The Console is clear before and after rebuilding Bolt’s unit database.
Opsive.UltimateInventorySystemappears once in Bolt’s Assemblies list.- The intended overloads show
ItemDefinition, Boolean options, and integer amounts rather than similarly namedItem,ItemInfo, or string overloads. - The graph’s Inventory and Health Potion references come from the active Ultimate Inventory System Version 1 database.
- No current Ultimate Inventory System file has been deleted or renamed to follow the obsolete Antlr instruction.
Verify in Play Mode
- Start with zero Health Potions and display the result of
GetItemAmount; it should be0. - Trigger
AddItemonce and inspect the returnedItemInfo.Amount; it should be1. - Confirm that the Inventory UI or Inspector shows one Health Potion and that a second count returns
1. - Try a null Item Definition or an Inventory restriction on a test object. The returned result should reveal that nothing was added.
- Build a Development Build for the target platform. Reflection and generated unit databases can behave differently in an AOT or stripped build, so an editor-only test is not sufficient.
Troubleshooting
| Symptom | Check | Fix |
|---|---|---|
| No Ultimate Inventory System members appear in Bolt | Check the exact Assemblies entry and the first Console error. | Add Opsive.UltimateInventorySystem, resolve compilation, and rebuild Bolt’s unit database. |
| An Ultimate Inventory System type cannot be selected for a port or variable | Check whether that exact type is present in Bolt’s Types list. | Add only the required type, such as ItemDefinition or ItemInfo, then rebuild the unit database. |
Several AddItem or GetItemAmount units look identical |
Check the full parameter types and return type. | Use the ItemDefinition overload documented above and expose all input ports before connecting the graph. |
| Add Item runs but the Inventory does not change | Inspect the returned ItemInfo.Amount, the active database, and Inventory restrictions. |
Use a registered Item Definition, verify the target Inventory, and handle a zero return amount as failure. |
| The graph cannot receive an Inventory event | Check whether the graph expects a Bolt Custom Event that Ultimate Inventory System never sends. | Read the operation’s return value or create a lifecycle-safe adapter for the exact Ultimate Inventory System event. |
| Unity reports a duplicate Antlr assembly | Inspect the Console for both concrete DLL paths. | Back up the project and resolve the actual third-party duplicate according to its provider. Do not delete a nonexistent Ultimate Inventory System DLL or rename arbitrary assemblies. |
| Instructions mention Node Library instead of Setup Wizard | Check whether the project uses current Unity Visual Scripting rather than legacy Bolt. | Follow Unity’s Visual Scripting project settings and treat Ultimate Inventory System reflection as a custom compatibility test. |
| The graph works in the Editor but not in a build | Check generated units, AOT support, managed stripping, and Development Build logs. | Regenerate the graph tool’s unit/AOT data and preserve only the Ultimate Inventory System members the graph actually reflects. |
Related pages
Developer and version reference
The archived Ultimate Inventory System Version 1 master source verified for this page is package version 1.3.0. Its runtime assembly definition is named Opsive.UltimateInventorySystem, is auto-referenced, and depends on Opsive Shared. That development checkout contains historical installers for Dialogue System, Localization, PlayMaker, and Quest Machine, but no Bolt or Unity Visual Scripting installer. Customer projects should obtain current optional bridges from Opsive Downloads; they are not present in the installed product’s Integrations folder before download. The released project also declares no com.unity.visualscripting package dependency.
Ultimate Inventory System removed its NCalc and Antlr3.Runtime.dll dependencies on April 6, 2021. Current Version 1 master contains no precompiled DLL in the Ultimate Inventory System package, so the legacy instruction to remove Assets/Opsive/UltimateInventorySystem/Plugins/Antlr3.Runtime.dll is not valid for this release.
The exact event constants above are declared in Opsive.UltimateInventorySystem.Core.EventNames and dispatched through Opsive.Shared.Events.EventHandler. They are not generated Bolt event units. A custom adapter should register and unregister the same delegate against the same Inventory target and expose only the simple payload required by the graph.