/// <summary>
        /// Initializes the Game with configured settings.
        /// </summary>
        private void Start()
        {
            tileFactory = TileFactory.instance;
            unitFactory = UnitFactory.instance;

            var selectedMap = SceneLoader.GetParam(SceneLoader.LOAD_MAP_PARAM);

            if (selectedMap != "")
            {
                mapData = MapLoader.instance.GetMapAsset(selectedMap);
            }
            else
            {
            }

            var gameTypeString = SceneLoader.GetParam(SceneLoader.GAME_TYPE_PARAM);

            if (gameTypeString == GameManager.SINGLEPLAYER_GAME_TYPE)
            {
                gameType = GameType.Singleplayer;
            }
            else if (gameTypeString == GameManager.MULTIPLAYER_GAME_TYPE)
            {
                gameType = GameType.Multiplayer;
            }
            else
            {
            }

            if (gameType == GameType.Singleplayer)
            {
                var singleGameTypeString = SceneLoader.GetParam(SceneLoader.SINGLEPLAYER_GAME_TYPE_PARAM);

                if (singleGameTypeString == GameManager.CAMPAIGN_GAME_TYPE)
                {
                    singleplayerGameType = SingleplayerGameType.Campaign;
                }
                else if (singleGameTypeString == GameManager.PRACTICE_GAME_TYPE)
                {
                    singleplayerGameType = SingleplayerGameType.Practice;
                }
                else
                {
                    throw new Exception("Singleplayer Game Type not set!");
                }
            }
            else if (gameType == GameType.Multiplayer)
            {
            }

            // Read map data from text file to get columns and rows
            var tileData = JsonUtility.FromJson <TileDataWrapper>(mapData.text);
            int cols     = tileData.Columns;
            int rows     = tileData.Rows;

            // Set up Players
            var players = new List <Player>();

            for (int playerNum = 1; playerNum <= numberOfPlayers; playerNum++)
            {
                Player newPlayer = null;

                if (gameType == GameType.Singleplayer)
                {
                    if (singleplayerGameType == SingleplayerGameType.Practice)
                    {
                        newPlayer = new Player($"Player {playerNum}", playerNum);
                    }
                    else if (singleplayerGameType == SingleplayerGameType.Campaign)
                    {
                        if (playerNum == 1)
                        {
                            newPlayer = CampaignManager.instance.CampaignPlayerData;
                            newPlayer.Units.Clear();
                        }
                        else
                        {
                            newPlayer = new Player($"Enemy Faction", playerNum);
                        }
                    }
                    else
                    {
                        throw new Exception($"Error setting up Player {playerNum}");
                    }
                }

                if (gameType == GameType.Multiplayer)
                {
                    // TODO: Get logic to set up Players with unique names from server?
                }

                players.Add(newPlayer);
            }

            // If playing a Singleplayer game, the user always controls the first Player (Player 1)
            if (gameType == GameType.Singleplayer)
            {
                ControllingPlayer = players.First();
            }

            // If playing a Multiplayer game, the server decides which player the user controls
            if (gameType == GameType.Multiplayer)
            {
                // TODO: Set up logic to find out which player the human in controlling
            }

            model.ConstructModel(cols, rows, players);

            var newObjectViews = new Dictionary <Vector2Int, ObjectView>();

            Tuple <Unit, GameObject> newUnitTuple = null;

            var boardTileData = tileData.tileData;
            var boardUnitData = boardTileData.Where(data => data.Player != 0).Select(data =>
                                                                                     new {
                Player       = data.Player,
                UnitPosition = new Vector3(data.Column, data.Row, 0f),
                UnitData     = data.UnitData
            }
                                                                                     );

            foreach (var boardTile in boardTileData)
            {
                // Initialize Tile Model/View
                var newTile = tileFactory.CreateTile(boardTile, view.tiles.transform);
                model.AddTile(newTile);
            }

            foreach (var boardUnit in boardUnitData)
            {
                var unitData     = boardUnit.UnitData;
                var unitPosition = boardUnit.UnitPosition;
                var unitPlayer   = boardUnit.Player;

                if (gameType == GameType.Singleplayer)
                {
                    if (singleplayerGameType == SingleplayerGameType.Campaign)
                    {
                        if (unitPlayer == 1)
                        {
                            const char DELIMITER       = '_';
                            const int  UNIT_NAME_INDEX = 3;

                            if (unitData == "FREE_ALLY_SQUARE")
                            {
                                // TODO: Make Free allies
                            }
                            else
                            {
                                var split_string = unitData.Split(DELIMITER);

                                if (split_string.Length == 4)
                                {
                                    // Named Unit
                                    var unitName     = split_string[UNIT_NAME_INDEX];
                                    var existingUnit =
                                        CampaignManager.instance.CampaignPlayerData.CampaignUnits.SingleOrDefault(
                                            campaignUnit => campaignUnit.Name == unitName);

                                    if (existingUnit != null)
                                    {
                                        var cloneUnit = existingUnit.Clone();
                                        newUnitTuple = unitFactory.ImportUnitForBoard(unitPosition, view.units.transform, cloneUnit, unitData);
                                    }
                                    else
                                    {
                                        newUnitTuple = unitFactory.CreateUnitForBoard(unitPosition, view.units.transform, unitData);
                                    }
                                }
                                else
                                {
                                    throw new NotImplementedException();
                                }
                            }
                        }
                        else
                        {
                            newUnitTuple = unitFactory.CreateUnitForBoard(boardUnit.UnitPosition, view.units.transform, unitData);
                            CampaignManager.instance.ModifyUnitStats(newUnitTuple.Item1);
                        }
                    }
                    else if (singleplayerGameType == SingleplayerGameType.Practice)
                    {
                        newUnitTuple = unitFactory.CreateUnitForBoard(boardUnit.UnitPosition, view.units.transform, unitData);
                    }
                    else
                    {
                        throw new Exception("Singleplayer Game Type not set");
                    }
                }
                else if (gameType == GameType.Multiplayer)
                {
                }
                else
                {
                    throw new Exception("Game Type not set");
                }

                var newUnitModel  = newUnitTuple.Item1;
                var newUnitObject = newUnitTuple.Item2;

                var newUnitView = new UnitView(newUnitObject);
                var unitPos     = unitPosition.ToVector2Int();
                newObjectViews.Add(unitPos, newUnitView);
                model.AddUnit(newUnitModel, unitPlayer, unitPos.x, unitPos.y);
            }

            // Invoke model to set up tile neighbors
            model.AddNeighbors();

            viewModel.ConstructViewModel();

            view.ConstructView(cols, rows, newObjectViews);

            view.mCamera.MoveToPosition(model.GridForUnit(ControllingPlayer.Units[0]).ToVector3());

            var text = SceneLoader.GetParam(SceneLoader.LOAD_OPENING_DIALOGUE_PARAM);

            StartGame();
            if (text != "")
            {
                dialogueManager.LoadDialogue(text);
            }
        }