[Inject]
		private readonly IItemCatalogService itemCatalogService;
		
		private static readonly ILog Logger = LogManager.GetLogger(typeof(InventoryGridService));
		
		public bool HasFreeSpace(GameEntity inventoryItemEntity, GameEntity addedItemEntity)
		{
			if (!addedItemEntity.hasItem)
			{
				Logger.Info("Entity id: " + addedItemEntity.id.Value + " has not ItemComponent");
				return false;
			}
			
			if (!inventoryItemEntity.hasInventoryGrid)
			{
				Logger.Info("Entity id: " + inventoryItemEntity.id.Value + " has not InventoryGridComponent");
				return false;
			}

			itemCatalogService.TryGetItemConfig(addedItemEntity.item.UID, out IInventoryItemConfig inventoryItemConfig);

			bool r = false;
			
			foreach (int[,] grid in inventoryItemEntity.inventoryGrid.Value)
			{
				Debug.Log("inventoryItemConfig.InventorySize: " + inventoryItemConfig.InventorySize);
				
				var posOnGrid = FindSpaceForObjectAnyDirection(grid, inventoryItemConfig.InventorySize, addedItemEntity.isInventoryRotated);

				Debug.Log("1 posOnGrid: " + posOnGrid);
				
				if (posOnGrid == null)
				{
					r = false;
				}

				if (posOnGrid != null)
				{
					return true;
				}
			}
			
			return r;
		}
		
		private static Vector2Int RotateItem(Vector2Int itemSize) {
			(itemSize.x, itemSize.y) = (itemSize.y, itemSize.x);
			return itemSize;
		}

		private Vector2Int? FindSpaceForObjectAnyDirection(int[,] simpleGrid, Vector2Int inventoryItemToInsert, bool isRotated)
		{
			var posOnGrid = FindSpaceForObject(simpleGrid, inventoryItemToInsert);

			Debug.Log("2 posOnGrid: " + posOnGrid);
			
			if (posOnGrid != null) return posOnGrid;

			var lastRotateState = isRotated;

			inventoryItemToInsert = RotateItem(inventoryItemToInsert);
			
			Debug.Log("was rotate");
			
			posOnGrid = FindSpaceForObject(simpleGrid, inventoryItemToInsert);

			if (posOnGrid == null && lastRotateState != isRotated)
			{
				inventoryItemToInsert = RotateItem(inventoryItemToInsert);
			}

			return posOnGrid;
		}
		
		private Vector2Int? FindSpaceForObject(int[,] simpleGrid, Vector2Int itemToInsert)
		{
			int width = simpleGrid.GetLength(0);
			int height = simpleGrid.GetLength(1);
			
			Debug.Log("height: " + height);
			Debug.Log("width: "  + width);
			
			var normalizedHeight = height - itemToInsert.y + 1;
			var normalizedWidth = width - itemToInsert.x + 1;

			for (var y = 0; y < normalizedHeight; y++)
			{
				for (var x = 0; x < normalizedWidth; x++)
				{
					if (OverlapCheck(simpleGrid, x, y, itemToInsert.x, itemToInsert.y))
					{
						return new Vector2Int(x, y);
					}
				}
			}

			return null;
		}
		
		private bool OverlapCheck(int[,] simpleGrid, int posX, int posY, int itemWidth, int itemHeight)
		{
			for (var x = 0; x < itemWidth; x++)
			{
				for (var y = 0; y < itemHeight; y++)
				{
					var inventoryItem = GetItem(simpleGrid, posX + x, posY + y);

					if (inventoryItem == null) continue;

					return false;
				}
			}

			return true;
		}
		
		private static int? GetItem(int[,] simpleGrid, int x, int y)
		{
			try
			{
				return simpleGrid[x, y];
			}
			catch (IndexOutOfRangeException)
			{
				return null;
			}
			catch (NullReferenceException)
			{
				Logger.Error("InventoryItemsSlot not initialized, maybe you change something in the Editor and the reference turns null.");
				return null;
			}
		}
Среди этих методов я вызываю только метод HasFreeSpace. Смысл этого кода такой, что я просто ищу есть ли свободное место в инвентаре. В инвентаре может быть несколько сеток(grids). Но у меня не всё работает корректно. Посмотри, может быть где-то здесь есть логическая ошибка.