Я как раз сейчас делаю инвентарь на UObject,
https://youtu.be/14IzAlRDeZI - вот пример
Что могу сказать, самое главное что нужно знать что в анриле все указатели на объекты должны быть с макросом UPROPERTY()
иначе клинер их вычестит сразу после того как ты уничитожишь их actor, в анриле когда создаешь объект указываешь outer и как только этот outer уничтожается, все объекты для которых этот объект являлся outer, стираются тоже, за исключением тех на которые указывают указатели с макросом UPROPERTY(), я очень долго долбался потому что не знал такой маленькой тонкости.
По поводу того как спаунить ItemActorы
Код:
AItemActor* ItemActor = GetWorld()->SpawnActorDeferred<AItemActor>(AItemActor::StaticClass(), FTransform(FRotator(0.f, 0.f, 0.f), FVector(Hit.Location.X, Hit.Location.Y, Hit.Location.Z + 100.f)));
ItemActor->UpdateItemReference(DraggingItem);
ItemActor->FinishSpawning(FTransform(FRotator(0.f, 0.f, 0.f), FVector(Hit.Location.X, Hit.Location.Y, Hit.Location.Z + 100.f)));
так ты можешь задать параметры в экторе еще до конструкта.
по поводу самого инвентаря, по сути это эктор компонент с TArray<UItem*>, если у тебя пространство в инвентаре двухмерное, можешь использовать ассоциативный массив с координатами в виде ключа, TMap<FVector2D, UItem*> где nullptr это пустая ячейка и в TArray и в TMap достаточно обширный функционал которого с головой хватает для менеджмента инвентаря. Все остальное простая логика и математика за 5-тый класс.