Installation
Four steps, and the fourth is the one people skip.
1. Add the plugin
Copy EDInventory into your project's Plugins/ folder (or install it from Fab), then enable it in
Edit → Plugins → EDInventory. Restart the editor when prompted.
Requirements:
- Unreal Engine 5.8
- Gameplay Abilities, which the plugin's
.upluginenables for you - Mutable — optional. The equipment-Mutable module compiles itself out when the engine plugin is absent, so you can ignore it entirely.
2. Add the module dependency (C++ projects only)
Blueprint-only projects can skip this. In your module's Build.cs:
PrivateDependencyModuleNames.AddRange(new string[]
{
"EDInventoryCore",
// Add only what you use.
"EDInventoryEquipment",
"EDInventoryUI",
"EDInventoryCrafting",
});
EDInventoryCore is the only one you always need. The feature modules are independent of each other.
3. Make your items discoverable
Item definitions are primary assets, resolved by FPrimaryAssetId at runtime. If the Asset
Manager does not know where they live, an entry cannot be turned back into a definition — items exist
in containers but have no name, no icon and no size.
Open Project Settings → Game → Asset Manager and add a rule:
| Field | Value |
|---|---|
| Primary Asset Type | EDItemDefinition |
| Asset Base Class | EDItemDefinition |
| Directories | wherever you keep item assets, e.g. /Game/Inventory/Items |
The plugin also exposes Project Settings → Plugins → EDInventory → Item Definition Scan Paths, which registers the same folders on startup. Either mechanism works; setting both is harmless.
Items are picked up and counted correctly, but every slot shows a blank icon and a name like
EDItemDefinition:DA_Apple. Nothing errors, because nothing is wrong at the container level — the
definition simply cannot be resolved.
4. Declare your gameplay tags
The plugin ships only the roots: Inventory.Container, Inventory.Slot, Inventory.Category,
Inventory.Rarity, Inventory.State. The concrete tags are your game's vocabulary, so you declare
them.
Either add them under Project Settings → Gameplay Tags, or declare them natively in C++:
// YourGameTags.h
namespace YourGameTags
{
YOURGAME_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Inventory_Container_Main);
YOURGAME_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Inventory_Slot_Head);
}
// YourGameTags.cpp
namespace YourGameTags
{
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Inventory_Container_Main, "Inventory.Container.Main", "The main carried grid.");
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Inventory_Slot_Head, "Inventory.Slot.Head", "Head/helmet slot.");
}
Natives buy you compile-time-safe references. Pick one mechanism per tag and stay with it — a tag declared in both places works, but the comment you see in the editor comes from whichever the engine loaded first, which makes documentation drift silently.
Confirm it works
Drop a UEDContainerComponent on any actor, give it a Container Tag, press Play, and open the
gameplay debugger with the apostrophe key. The EDInventory category lists every container on the
actor under the cursor and what is inside it.
If the category is missing, the plugin is not loaded. If the category is there and shows no
containers, the actor has none yet — containers are built in BeginPlay on the authority.