void SlideTile(TileSlot movedTile, Direction direction)
        {
            if (!movedTile.neighbours.ContainsKey(direction))
            {
                return;
            }

            SlidingTile tileA = movedTile.tile;
            SlidingTile tileB = movedTile.neighbours[direction].tile;

            movedTile.tile = tileB;
            movedTile.neighbours[direction].tile = tileA;

            SetTileCoords(tileA, movedTile.neighbours[direction].position);
            SetTileCoords(tileB, movedTile.position);

            UpdateEmptySlot();
        }
        void GenerateTiles()
        {
            List <Sprite> tileImages = new List <Sprite>(Resources.LoadAll <Sprite>(puzzleImage.name));


            #region GenerateTiles
            for (int i = 0; i < 9; i += 1)
            {
                Position tilePos   = (Position)i + 1;
                Vector3  tileCoord = new Vector3(offset[tilePos].x * tileSize, 0, offset[tilePos].y * tileSize);

                SlidingTile newTile = Instantiate(tileObject, transform).GetComponent <SlidingTile>();
                newTile.SetImage(tileImages[i]);
                newTile.position = tilePos;
                newTile.transform.localPosition = tileCoord;

                tiles.Add(new TileSlot(newTile, tilePos));
            }
            #endregion GenerateTiles
            Debug.Log(tiles.Count);
            #region AssignNeighbours
            for (int i = 0; i < tiles.Count; i += 1)
            {
                switch (tiles[i].position)
                {
                case Position.TopLeft:
                    tiles[i].neighbours.Add(Direction.RIGHT, TileAtPos(Position.TopCenter));
                    tiles[i].neighbours.Add(Direction.DOWN, TileAtPos(Position.MidLeft));
                    break;

                case Position.TopCenter:
                    tiles[i].neighbours.Add(Direction.RIGHT, TileAtPos(Position.TopRight));
                    tiles[i].neighbours.Add(Direction.DOWN, TileAtPos(Position.MidCenter));
                    tiles[i].neighbours.Add(Direction.LEFT, TileAtPos(Position.TopLeft));
                    break;

                case Position.TopRight:
                    tiles[i].neighbours.Add(Direction.DOWN, TileAtPos(Position.MidRight));
                    tiles[i].neighbours.Add(Direction.LEFT, TileAtPos(Position.TopCenter));
                    break;

                case Position.MidLeft:
                    tiles[i].neighbours.Add(Direction.UP, TileAtPos(Position.TopLeft));
                    tiles[i].neighbours.Add(Direction.RIGHT, TileAtPos(Position.MidCenter));
                    tiles[i].neighbours.Add(Direction.DOWN, TileAtPos(Position.BotLeft));
                    break;

                case Position.MidCenter:
                    tiles[i].neighbours.Add(Direction.UP, TileAtPos(Position.TopCenter));
                    tiles[i].neighbours.Add(Direction.RIGHT, TileAtPos(Position.MidRight));
                    tiles[i].neighbours.Add(Direction.DOWN, TileAtPos(Position.BotCenter));
                    tiles[i].neighbours.Add(Direction.LEFT, TileAtPos(Position.MidLeft));
                    break;

                case Position.MidRight:
                    tiles[i].neighbours.Add(Direction.UP, TileAtPos(Position.TopRight));
                    tiles[i].neighbours.Add(Direction.DOWN, TileAtPos(Position.MidCenter));
                    tiles[i].neighbours.Add(Direction.LEFT, TileAtPos(Position.BotRight));
                    break;

                case Position.BotLeft:
                    tiles[i].neighbours.Add(Direction.UP, TileAtPos(Position.MidLeft));
                    tiles[i].neighbours.Add(Direction.RIGHT, TileAtPos(Position.BotCenter));
                    break;

                case Position.BotCenter:
                    tiles[i].neighbours.Add(Direction.UP, TileAtPos(Position.MidCenter));
                    tiles[i].neighbours.Add(Direction.RIGHT, TileAtPos(Position.BotLeft));
                    tiles[i].neighbours.Add(Direction.LEFT, TileAtPos(Position.BotRight));
                    break;

                case Position.BotRight:
                    tiles[i].neighbours.Add(Direction.UP, TileAtPos(Position.MidRight));
                    tiles[i].neighbours.Add(Direction.LEFT, TileAtPos(Position.BotCenter));
                    break;
                }
            }
            #endregion AssignNeighbours
        }
 public TileSlot(SlidingTile _tile, Position _pos)
 {
     tile     = _tile;
     position = _pos;
     Debug.Log(position.ToString());
 }
        void SetTileCoords(SlidingTile tile, Position pos)
        {
            Vector3 tileCoord = new Vector3(offset[pos].x * tileSize, 0, offset[pos].y * tileSize);

            tile.transform.localPosition = tileCoord;
        }