private static void ItemDestroyed(IItemBehaviour obj)
 {
     if (instance.itemInstances.Contains(obj.itemInstance))
     {
         obj.itemInstance.Cleanup();
         instance.itemInstances.Remove(obj.itemInstance);
     }
 }
        static IItemInstance ItemInstanceFactory(GameObject gameObject, IItemBehaviour it, Item data)
        {
            //ItemInstance<T> itemInstance = new ItemInstance<T>(controller, item.data, gameObject);
            Type itemInstanceType = it.GetType();
            Type classType        = typeof(ItemInstance <>);

            Type[]        typeParams      = new Type[] { itemInstanceType };
            Type          constructedType = classType.MakeGenericType(itemInstanceType);
            IItemInstance itemInstance    = Activator.CreateInstance(constructedType, it, data, gameObject) as IItemInstance;

            it.SetItemInstance(itemInstance);
            it.destroyed += ItemDestroyed;
            return(itemInstance);
        }
        private static IItemInstance InstantiateGameObjectForItemInstance(IItemBehaviour iitem, GameObject gameObjectInstance, Item item)
        {
            gameObjectInstance.transform.position = Vector3.zero;
            gameObjectInstance.SetActive(false);
            IItemInstance itemInstance = null;

            if (iitem != default)
            {
                itemInstance = ItemInstanceFactory(gameObjectInstance, iitem, item);
            }
            else
            {
                DefaultItemInstanceBehaviour behaviour = gameObjectInstance.AddComponent <DefaultItemInstanceBehaviour>();
                ItemInstance <DefaultItemInstanceBehaviour> component = new ItemInstance <DefaultItemInstanceBehaviour>(behaviour, item, gameObjectInstance);
                itemInstance = component;
                behaviour.SetItemInstance(itemInstance);
                behaviour.destroyed += ItemDestroyed;
            }
            instance.itemInstances.Add(itemInstance);
            return(itemInstance);
        }