public void BuildMenu(Transform transform, MazeGenerationSettings existingSettings, Action <MazeGenerationSettings> settingsChanged)
        {
            _growingTreeSettings            = existingSettings as GrowingTreeSettings ?? new GrowingTreeSettings();
            _growingTreeSettings.Strategies = _growingTreeSettings.Strategies ?? new List <GrowingTreeStrategy>();
            _algorithmSettingsInitialiser.InitialiseOver(_growingTreeSettings, existingSettings);
            _growingTreeStrategyStorage.LoadStrategies(_growingTreeSettings.Strategies);

            _resourceLoader.InstantiateControl <TextControl>(transform).Initialize("Growing Tree Algorithm Settings");

            _resourceLoader.InstantiateControl <TextControl>(transform).Initialize("Cell selection weighting: the action will be randomly chosen ");

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Oldest", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Oldest),
                        i => StrategyChanged(GrowingTreeStrategy.Oldest, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Newest", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Newest),
                        i => StrategyChanged(GrowingTreeStrategy.Newest, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Middle", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Middle),
                        i => StrategyChanged(GrowingTreeStrategy.Middle, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Randomness", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Random),
                        i => StrategyChanged(GrowingTreeStrategy.Random, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Random Oldest Half", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.RandomOldest),
                        i => StrategyChanged(GrowingTreeStrategy.RandomOldest, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Random Newest Half", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.RandomNewest),
                        i => StrategyChanged(GrowingTreeStrategy.RandomNewest, i, settingsChanged));

            settingsChanged(GetSettings());
        }
Ejemplo n.º 2
0
        void Awake()
        {
            _currentSettingsHolder.Settings = _currentSettingsHolder.Settings ?? new MazeGenerationSettings
            {
                Size = new MazeSize
                {
                    X = 1,
                    Y = 1,
                    Z = 1
                },
                Option    = MazeType.None,
                Algorithm = Algorithm.None
            };

            _resourceLoader.InstantiateControl <DropdownControl>(leftPanel).Initialise("Algorithms", _algorithmsProvider.DropdownOptions,
                                                                                       _algorithmsProvider.DropdownOptions.FindIndex(x => x.Value == _currentSettingsHolder.Settings.Algorithm), true, InitialiseRightPanel);

            _resourceLoader.InstantiateControl <SliderControl>(leftPanel).Initialize("X", 1, 75, _currentSettingsHolder.Settings.Size.X, i =>
            {
                _currentSettingsHolder.Settings.Size.X = i;
                Validate();
            });

            _resourceLoader.InstantiateControl <SliderControl>(leftPanel).Initialize("Y", 1, 75, _currentSettingsHolder.Settings.Size.Y, i =>
            {
                _currentSettingsHolder.Settings.Size.Y = i;
                Validate();
            });

            _resourceLoader.InstantiateControl <SliderControl>(leftPanel).Initialize("Z", 1, 75, _currentSettingsHolder.Settings.Size.Z, i =>
            {
                _currentSettingsHolder.Settings.Size.Z = i;
                Validate();
            });

            _resourceLoader.InstantiateControl <DropdownControl>(leftPanel)
            .Initialise("Model option", _modelOptionsProvider.DropdownOptions,
                        _modelOptionsProvider.DropdownOptions.FindIndex(x => x.Value == _currentSettingsHolder.Settings.Option), true,
                        option => {
                _currentSettingsHolder.Settings.Option = option;
                Validate();
            });

            _resourceLoader.InstantiateControl <DropdownControl>(leftPanel)
            .Initialise("Carve extra walls", _wallCarverOptionsProvider.DropdownOptions,
                        _wallCarverOptionsProvider.DropdownOptions.FindIndex(x => x.Value == _currentSettingsHolder.Settings.ExtraWalls), true,
                        option =>
            {
                _currentSettingsHolder.Settings.ExtraWalls =
                    _wallCarverOptionsProvider.DropdownOptions.Single(x => x.Key == option).Value;
                Validate();
            });

            _resourceLoader.InstantiateControl <DropdownControl>(leftPanel)
            .Initialise("Force doors at edge of maze", _yesNoOptionsProvider.DropdownOptions,
                        _yesNoOptionsProvider.DropdownOptions.FindIndex(x => x.Value == _currentSettingsHolder.Settings.DoorsAtEdge), true,
                        option =>
            {
                _currentSettingsHolder.Settings.DoorsAtEdge =
                    _yesNoOptionsProvider.DropdownOptions.Single(x => x.Key == option).Value;
                Validate();
            });

            _resourceLoader.InstantiateControl <DropdownControl>(leftPanel)
            .Initialise("Agent to run", _agentOptionsProvider.DropdownOptions,
                        _agentOptionsProvider.DropdownOptions.FindIndex(x => x.Value == _currentSettingsHolder.Settings.AgentType), true, option =>
            {
                _currentSettingsHolder.Settings.AgentType =
                    _agentOptionsProvider.DropdownOptions.Single(x => x.Key == option).Value;
                Validate();
            });

            button.enabled = false;
            button.onClick.AddListener(OnClick);
        }
        private void ReloadUiAndRegenerateMaze()
        {
            startButton.enabled      = false;
            restartButton.enabled    = false;
            regenerateButton.enabled = false;

            if (_mazeNeedsGenerating.Generate)
            {
                _results = _generationFactory.GenerateMaze(_currentSettingsHolder.Settings);
                _currentMazeHolder.Results = _results;
                //var validation = _validator.EveryPointHasDirection(_currentMazeHolder.MazeJumper);
                _mazeNeedsGenerating.Generate = false;
            }
            else
            {
                _results = _currentMazeHolder.Results;
            }

            leftPanel.Clear();
            rightPanel.Clear();
            var controlStrings = new List <string>()
            {
                "Controls",
                "WASD: Move the camera",
                "Z: Zoom in",
                "X: Zoom out",
                "C: Remove dead ends",
                "ESC: Return to menu",
                "V: Return to menu and regenerate maze",
                "F: Toggle UI mode between shortest path, paths without dead ends, Agent pfath"
            };

            foreach (var controlString in controlStrings)
            {
                _resourceLoader.InstantiateControl <TextControl>(rightPanel).Initialize(controlString);
            }

            var heuristicsStrings = new List <string>()
            {
                "Heuristics",
                string.Format("Total cells: {0}", _results.HeuristicsResults.TotalCells),
                string.Format("Cells down dead end: {0}", _results.DeadEndFillerResults.TotalCellsFilledIn),
                string.Format("Shortest path: {0}", _results.HeuristicsResults.ShortestPathResult.ShortestPath),
                "Directions Carved"
            };

            var directionStats =
                _results.HeuristicsResults.Stats.DirectionsUsed.Select(x => string.Format("{0} - {1}", x.Key, x.Value));

            var heuristicsStrings2 = new List <string>()
            {
                string.Format("Model Generation Time: {0}", _timeRecorder.GetStringFromTime(_results.ModelTime)),
                string.Format("Maze Generation Time: {0}", _timeRecorder.GetStringFromTime(_results.GenerationTime)),
                string.Format("Dead End Filling Time: {0}", _timeRecorder.GetStringFromTime(_results.DeadEndFillerTime)),
                string.Format("Agent Run Time: {0}", _timeRecorder.GetStringFromTime(_results.AgentGenerationTime)),
                string.Format("Heauristics Time: {0}", _timeRecorder.GetStringFromTime(_results.HeuristicsTime)),
                string.Format("Total Time: {0}", _timeRecorder.GetStringFromTime(_results.TotalTime)),
            };

            foreach (var heuristicsString in heuristicsStrings.Concat(directionStats).Concat(heuristicsStrings2))
            {
                _resourceLoader.InstantiateControl <TextControl>(leftPanel).Initialize(heuristicsString);
            }

            startButton.enabled      = true;
            restartButton.enabled    = true;
            regenerateButton.enabled = true;
        }