Component _CreateTileGO(GameObject prefab, int x, int y, PositionCallback callback)
        {
            GameObject tile = Object.Instantiate(prefab);

            tile.transform.SetParent(container.transform);
            tile.transform.localPosition = new Vector2(x + 0.5f, y + 0.5f);

            TileBehaviour tileBehaviour = tile.GetComponent <TileBehaviour> ();

            if (tileBehaviour != null)
            {
                tileBehaviour._x = x;
                tileBehaviour._y = y;

                x += tileBehaviour.areaBottomLeftXOffset;
                y += tileBehaviour.areaBottomLeftYOffset;

                bool[,] area = tileBehaviour.area;

                for (int i = 0; i < area.GetLength(0); i++)
                {
                    for (int j = 0; j < area.GetLength(1); j++)
                    {
                        if (area [i, j])
                        {
                            componentGrid.Set(x + i, y + j, tileBehaviour);

                            callback(x + i, y + j);
                        }
                    }
                }

                componentGrid.Set(
                    tileBehaviour._x,
                    tileBehaviour._y,
                    tileBehaviour
                    );

                return(tileBehaviour);
            }
            else
            {
                componentGrid.Set(x, y, tile.transform);

                return(tile.transform);
            }
        }
        /// <summary>
        /// Checks if the specified TileBehaviour would overlap any other tileGO if placed at the specified location.
        /// </summary>
        /// <param name="x">The x tile coordinate.</param>
        /// <param name="y">The y tile coordinate.</param>
        public bool HasOverlap(int x, int y, TileBehaviour behaviour)
        {
            x += behaviour.areaBottomLeftXOffset;
            y += behaviour.areaBottomLeftYOffset;

            bool[,] area = behaviour.area;

            for (int i = 0; i < area.GetLength(0); i++)
            {
                for (int j = 0; j < area.GetLength(1); j++)
                {
                    if (area [i, j] && GetTileGO(x + i, y + j) != null)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }