예제 #1
0
    // Use this for initialization
    void Start()
    {
        CreatureSaver.SetupPlayerPrefs();

        // initialize arrays
        joints  = new List <Joint>();
        bones   = new List <Bone>();
        muscles = new List <Muscle>();

        // Joints are selected by default.
        selectedPart = BuildSelection.Joint;

        buttonManager.SetupDropDown();
        //creatureSaver =  new CreatureSaver();
        if (!firstTime)
        {
            CreatureSaver.LoadCurrentCreature(this);
            //print("Last creature name: " + lastCreatureName);
            buttonManager.SetDropDownToValue(lastCreatureName);
        }

        firstTime = false;


        //CreatureSaver.Test();
    }
예제 #2
0
    /// <summary>
    /// Loads the simulation from save file of format version 1.
    /// </summary>
    /// <param name="filename">The Filename has to end on .txt .</param>
    /// <param name="content">The Content of the save file.</param>
    private static void LoadSimulationFromSaveFileV1(string filename, string content, SplitOptions splitOptions, CreatureBuilder creatureBuilder, Evolution evolution)
    {
        var creatureName = filename.Split('-')[0].Replace(" ", "");

        var components = content.Split(splitOptions.SPLIT_ARRAY, System.StringSplitOptions.None);

        // extract the save data from the file contents.
        var taskType = EvolutionTaskUtil.TaskForNumber(int.Parse(components[0].Replace(Environment.NewLine, "")));

        var timePerGen = int.Parse(components[1].Replace(Environment.NewLine, ""));

        var creatureData = components[2];

        CreatureSaver.LoadCreatureFromContents(creatureData, creatureBuilder);

        var bestChromosomesData = new List <string>(components[3].Split(splitOptions.NEWLINE_SPLIT, StringSplitOptions.None));
        var bestChromosomes     = new List <ChromosomeStats>();

        foreach (var chromosomeData in bestChromosomesData)
        {
            if (chromosomeData != "")
            {
                var chromosomeInfo  = ChromosomeInfo.FromString(chromosomeData);
                var chromosomeStats = new ChromosomeStats(chromosomeInfo.chromosome, new CreatureStats());
                chromosomeStats.stats.fitness = chromosomeInfo.fitness;

                bestChromosomes.Add(chromosomeStats);
            }
        }

        var chromosomeComponents = components[4].Split(splitOptions.NEWLINE_SPLIT, StringSplitOptions.None);
        var currentChromosomes   = new List <string>();

        foreach (var chromosome in chromosomeComponents)
        {
            if (chromosome != "")
            {
                currentChromosomes.Add(chromosome);
            }
        }

        var currentGeneration = bestChromosomes.Count + 1;

        var settings = new EvolutionSettings();

        settings.task           = taskType;
        settings.simulationTime = timePerGen;
        settings.populationSize = currentChromosomes.Count;

        var networkSettings = new NeuralNetworkSettings();

        evolution.Settings = settings;

        creatureBuilder.ContinueEvolution(evolution, () => {
            CreatureSaver.SaveCurrentCreatureName(creatureName);
            evolution.ContinueEvolution(currentGeneration, settings, networkSettings, bestChromosomes, currentChromosomes);
        });
    }
예제 #3
0
    public static List <string> CreateDropDownOptions()
    {
        var options = new List <string>();

        options.Add("Creature");
        options.AddRange(CreatureSaver.GetCreatureNames());

        return(options);
    }
예제 #4
0
    /// <summary>
    /// Creates the creature and attached it to the evolution.
    /// </summary>
    public void AttachCreatureToEvolution(Evolution evolution)
    {
        ResetHoverableColliders();

        CreatureSaver.SaveCurrentCreature(lastCreatureName, joints, bones, muscles);

        Creature creature = BuildCreature();

        DontDestroyOnLoad(creature.gameObject);

        evolution.creature = creature;
    }
예제 #5
0
    /// <summary>
    /// Saves the simulation.
    /// </summary>
    /// <returns>The filename of the savefile.</returns>
    public string SaveSimulation()
    {
        if (currentGenerationNumber == 1)
        {
            return(null);
        }

        var creatureName       = CreatureSaver.GetCurrentCreatureName();
        var creatureSaveData   = CreatureSaver.GetCurrentCreatureData();
        var bestChromosomes    = BCController.GetBestChromosomes();
        var currentChromosomes = new List <string>(this.currentChromosomes);

        return(EvolutionSaver.WriteSaveFile(creatureName, settings, brainSettings, currentGenerationNumber, creatureSaveData, bestChromosomes, currentChromosomes));
    }
예제 #6
0
    public void LoadCreature(Dropdown dropDown)
    {
        DeleteCreature();

        //var name = CreatureSaver.GetCreatureNames()[dropDown.value];
        var name = ButtonManager.CreateDropDownOptions()[dropDown.value];

        lastCreatureName = name;

        // The first option in the Dropdown list is going to be an empty creature
        if (dropDown.value == 0)
        {
            return;
        }

        CreatureSaver.LoadCreature(name, this);
    }
예제 #7
0
    /** Generates a creature and starts the evolution simulation. */
    public void Evolve()
    {
        // don't attempt evolution if there is no creature
        if (joints.Count == 0)
        {
            return;
        }

        ResetHoverableColliders();

        CreatureSaver.SaveCurrentCreature(lastCreatureName, joints, bones, muscles);

        Creature creature = BuildCreature();

        DontDestroyOnLoad(creature.gameObject);

        //SceneManager.LoadScene("EvolutionScene");
        AsyncOperation sceneLoading = SceneManager.LoadSceneAsync("EvolutionScene");

        //AsyncOperation sceneLoading = SceneManager.LoadSceneAsync("TestEvolutionScene");
        sceneLoading.allowSceneActivation = true;
        DontDestroyOnLoad(evolution.gameObject);
        evolution.creature = creature;

        //evolution.PopulationSize = buttonManager.GetPopulationInput();
        //evolution.SimulationTime = buttonManager.GetSimulationTime();

        var settings = settingsMenu.GetEvolutionSettings();

        //evolution.PopulationSize = settings.populationSize;
        //evolution.SimulationTime = settings.simulationTime;

        //Evolution.task = buttonManager.GetTask();
        //Evolution.task = settings.task;

        evolution.Settings      = settings;
        evolution.BrainSettings = settingsMenu.GetNeuralNetworkSettings();

        SetMobileNoSleep();

        StartCoroutine(WaitForEvolutionSceneToLoad(sceneLoading));
        DontDestroyOnLoad(this);
        //evolution.StartEvolution();
        //Time.timeScale = 5.0f;
    }
예제 #8
0
    public void DeleteCurrentCreatureSave()
    {
        var selectedCreatureIndex = dropDown.value;
        var options = CreateDropDownOptions();

        var currentCreatureName = options[selectedCreatureIndex];

        if (currentCreatureName.ToUpper() != "CREATURE")
        {
            deleteConfirmation.ConfirmDeletionFor(currentCreatureName, delegate(string name) {
                CreatureSaver.DeleteCreatureSave(currentCreatureName);

                creatureBuilder.DeleteCreature();
                SetupDropDown();
                dropDown.value = 0;
            });
        }
    }
예제 #9
0
    /// <summary>
    /// Loads the simulation from save file with the format version 2
    /// </summary>
    /// <param name="filename">The Filename has to end on .txt .</param>
    /// <param name="content">The Content of the save file.</param>
    private static void LoadSimulationFromSaveFileV2(string filename, string content, SplitOptions splitOptions, CreatureBuilder creatureBuilder, Evolution evolution)
    {
        var creatureName = filename.Split('-')[0].Replace(" ", "");

        var components = content.Split(splitOptions.SPLIT_ARRAY, System.StringSplitOptions.None);

        var evolutionSettings = EvolutionSettings.Decode(components[1]);
        var networkSettings   = NeuralNetworkSettings.Decode(components[2]);

        var creatureData = components[3];

        CreatureSaver.LoadCreatureFromContents(creatureData, creatureBuilder);

        var bestChromosomesData = new List <string>(components[4].Split(splitOptions.NEWLINE_SPLIT, StringSplitOptions.None));
        var bestChromosomes     = new List <ChromosomeStats>();

        foreach (var chromosomeData in bestChromosomesData)
        {
            if (chromosomeData != "")
            {
                bestChromosomes.Add(ChromosomeStats.FromString(chromosomeData));
            }
        }

        var chromosomeComponents = components[5].Split(splitOptions.NEWLINE_SPLIT, StringSplitOptions.None);
        var currentChromosomes   = new List <string>();

        foreach (var chromosome in chromosomeComponents)
        {
            if (chromosome != "")
            {
                currentChromosomes.Add(chromosome);
            }
        }

        var currentGeneration = bestChromosomes.Count + 1;

        evolution.Settings = evolutionSettings;

        creatureBuilder.ContinueEvolution(evolution, () => {
            CreatureSaver.SaveCurrentCreatureName(creatureName);
            evolution.ContinueEvolution(currentGeneration, evolutionSettings, networkSettings, bestChromosomes, currentChromosomes);
        });
    }
예제 #10
0
    /// <summary>
    /// Attempts to save the current creature. Shows an error screen if something went wrong.
    /// </summary>
    /// <param name="name">Name.</param>
    public void SaveCreature(string name)
    {
        saveDialog.ResetErrors();

        if (name == "")
        {
            saveDialog.ShowErrorMessage("The Creature name is empty.");
            return;
        }

        try {
            CreatureSaver.WriteSaveFile(name, joints, bones, muscles);
        } catch (IllegalFilenameException e) {
            saveDialog.ShowErrorMessage("The name can't contain . (dots) or _ (underscores).");
            print(e.Message);
            return;
        }

        // The save was successful
        saveDialog.gameObject.SetActive(false);

        buttonManager.Refresh();
    }
예제 #11
0
    /** Handles all possible keyboard controls / shortcuts. */
    private void HandleKeyboardInput()
    {
        if (saveDialog != null && saveDialog.gameObject.activeSelf)
        {
            return;
        }

        if (Input.anyKeyDown)
        {
            // J = place Joint
            if (Input.GetKeyDown(KeyCode.J))
            {
                SelectedPart = BuildSelection.Joint;
            }

            // B = place body connection
            else if (Input.GetKeyDown(KeyCode.B))
            {
                SelectedPart = BuildSelection.Bone;
            }

            // M = place muscle
            else if (Input.GetKeyDown(KeyCode.M))
            {
                SelectedPart = BuildSelection.Muscle;
            }

            // D = Delete component
            else if (Input.GetKeyDown(KeyCode.D))
            {
                SelectedPart = BuildSelection.Delete;
            }

            // S = Save Creature
            else if (Input.GetKeyDown(KeyCode.S) && Application.platform != RuntimePlatform.WebGLPlayer)
            {
                //SaveCreature();
                //PromptCreatureSave();
            }

            // L = Load Creature
            else if (Input.GetKeyDown(KeyCode.L))
            {
                //LoadCreature();
            }

            // E = Go to Evolution Scene
            else if (Input.GetKeyDown(KeyCode.E))
            {
                Evolve();
            }

            // P = Print the current creature's save string
            else if (Input.GetKeyDown(KeyCode.P))
            {
                print(CreatureSaver.CreateSaveInfoFromCreature(joints, bones, muscles));
            }


            buttonManager.selectButton(selectedPart);
        }
    }
예제 #12
0
 private void OnSave2Clicked(object sender, EventArgs e)
 {
     CreatureSaver.Save(_lastFittest2, "creature.dna");
 }