void SetMovingBuildingToGridPosition()
    {
        // Calculate actual Position on Grid
        BaseMapClass gridLayout = MapManager.GetInstance().GetCurrentMap();
        // Follow Camera Position
        Vector3Int gridPos = gridLayout.GetTileMapCom().WorldToCell(Camera.main.transform.position + (Vector3)m_MovingPlacedBuildingOffset);
        Vector3    newPos  = gridLayout.GetTileMapCom().CellToWorld(gridPos);

        newPos += gridLayout.GetTileMapCom().cellSize * 0.5f;
        MapManager.GetInstance().GetBuildingToMove().transform.position = newPos;
    }
    /// <summary>
    /// Creates a new TileMap
    /// </summary>
    /// <param name="mapType"></param>
    /// <returns></returns>
    public bool CreateNewMap(MapDataBase.MAPS mapType)
    {
        // Create new Tilemap, parented under and positioned at m_GridGO
        GameObject mapObject = MapDataBase.GetInstance().GetMapGO(mapType);

        mapObject    = Instantiate(mapObject, m_GridGO.transform.position, Quaternion.identity, m_GridGO.transform);
        m_currentMap = mapObject.GetComponent <BaseMapClass>();
        // Resize the layout Array
        int totalSize = m_currentMap.GetTileMapSize().x *m_currentMap.GetTileMapSize().y;

        m_GridTakenArray.Clear();
        m_GridTakenArray.Capacity = totalSize;     // Set the capactiy to prevent calling Array.Resize() multiple times
        for (int i = 0; i < totalSize; ++i)
        {
            m_GridTakenArray.Add(false);
        }
        // Center the Camera to the map
        Vector3 centerMapWorldPos = m_GridGO.CellToWorld((Vector3Int)m_currentMap.GetTileMapSize() / 2);

        centerMapWorldPos             += m_GridGO.cellSize * 0.5f;
        centerMapWorldPos.z            = -10.0f;
        Camera.main.transform.position = centerMapWorldPos;

        // Fire the Map Generated Event
        OnMapGenerated();

        //Get starting route from one of the routes build at spawn

        List <MapStartingBuildings> startingBuildingsList = m_currentMap.GetStartingBuildings();
        Vector2Int mainRoadPos = Vector2Int.zero;

        foreach (MapStartingBuildings startingbuild in startingBuildingsList)
        {
            if (startingbuild.buildingID == BuildingDataBase.BUILDINGS.B_ROAD)
            {
                mainRoadPos = startingbuild.spawnGridPositions[0];
                break;
            }
        }
        m_RoadManager.Init(m_currentMap.GetTileMapSize(), mainRoadPos);

        return(true);
    }
    /// <summary>
    /// Attempts to place a new Building of type buildingID into the map
    /// WITHOUT checking and deducting if have resources needed
    /// </summary>
    /// <param name="spawnWorldPosition">World position of the Building</param>
    /// <param name="buildingID">What type of building to place</param>
    /// <returns></returns>
    public BaseBuildingsClass PlaceNewBuildingIntoMap_WithoutResources(Vector2 spawnWorldPosition, BuildingDataBase.BUILDINGS buildingID)
    {
        // Convert World to Grid Coordinates
        BaseMapClass gridLayout = GetCurrentMap();
        Vector3Int   gridPos    = gridLayout.GetTileMapCom().WorldToCell(spawnWorldPosition);

        spawnWorldPosition  = gridLayout.GetTileMapCom().CellToWorld(gridPos);
        spawnWorldPosition += (Vector2)gridLayout.GetTileMapCom().cellSize * 0.5f;
        // Check if we can place building Down
        Vector3    buildingBottomLeft = spawnWorldPosition + BuildingDataBase.GetInstance().GetBuildingData(buildingID).GetBottomLeftCorner_PositionOffset();
        Vector2Int buildingSize       = BuildingDataBase.GetInstance().GetBuildingData(buildingID).GetBuildingSizeOnMap();

        if (!CanPlaceBuildingOnMap(buildingBottomLeft, buildingSize))
        {
            Debug.LogError("Unable to Place Building, Canceling...");
            return(null);
        }
        // Create the Building
        return(PlaceBuildingToGrid(spawnWorldPosition, buildingID));
    }
    public void Init()
    {
        //set the building grid background accordingly
        BaseMapClass map = MapManager.GetInstance().GetCurrentMap();

        if (map != null)
        {
            Vector2Int size = map.GetTileMapSize();

            if (m_Grid != null)
            {
                m_Grid.transform.localScale = new Vector3(size.x, size.y, 1.0f);
            }

            if (m_GridMaterial != null)
            {
                m_GridMaterial.SetVector("_Tiling", new Vector4(size.x, size.y, 1.0f, 1.0f));
            }
        }

        m_Grid.SetActive(false);
    }