예제 #1
0
    void Start()
    {
        planet      = GetComponent <Planet>();
        noiseScript = GetComponent <PBSNoiseScript>();
        if (!noiseScript)
        {
            return;
        }

        if (StaticSettings.useStaticSettings)
        {
            interval       = StaticSettings.planetIntervalBeforeNewGeneration;
            populationSize = StaticSettings.planetPopulationSize;
            selectedCount  = StaticSettings.planetSelectedCount;
            probaMutation  = StaticSettings.planetProbaMutation;
            NbSubdivision  = StaticSettings.planetIcosahedronSubDiv;
        }

        //Recupération de l'objet System.Type représentant le type sous-jacent de l'objet
        Type objectType = noiseScript.GetType();

        solutions = new List <List <GeneticValue> >();
        notes     = new List <float>();

        // Setup script lua
        script = null;
        if (File.Exists(StaticSettings.planetScript))
        {
            UserData.RegisterAssembly();
            UserData.RegisterType <Vector3>();
            UserData.RegisterType <Color>();

            script = new Script();
            script.Options.ScriptLoader = new MoonSharp.Interpreter.Loaders.FileSystemScriptLoader();
            ((MoonSharp.Interpreter.Loaders.ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { Application.dataPath + "/?",
                                                                                                                       Application.dataPath + "/?.lua",
                                                                                                                       Application.dataPath + "/lua/?",
                                                                                                                       Application.dataPath + "/lua/?.lua" };
            script.Options.DebugPrint = Debug.Log;

            script.Globals["noiseScript"] = planet.pbsNoiseScript;
            script.Globals["bestScore"]   = float.MinValue;

            script.Globals["getPoints"]  = (Func <Vector3[]>)GetScorerPoints;
            script.Globals["isNaN"]      = (Func <float, bool>)IsNaN;
            script.Globals["isInfinity"] = (Func <float, bool>)IsInfinity;

            script.DoFile(StaticSettings.planetScript);
            populationSize = (int)script.Globals.Get("populationSize").Number;
        }

        StartCoroutine(RunAlgoGenetic());
    }
예제 #2
0
    List <GeneticValue> Generate()
    {
        List <GeneticValue> solution = new List <GeneticValue>();

        foreach (FieldInfo fieldInfo in noiseScript.GetType().GetFields())
        {
            if (fieldInfo.FieldType == typeof(int))
            {
                foreach (Attribute attribute in fieldInfo.GetCustomAttributes())
                {
                    switch (attribute)
                    {
                    case RangeAttribute ra:
                        int min = Mathf.RoundToInt(ra.min);
                        int max = Mathf.RoundToInt(ra.max);
                        solution.Add(new IntGenetic(UnityEngine.Random.Range(min, max), min, max, fieldInfo.Name));
                        break;
                    }
                }
            }
            else if (fieldInfo.FieldType == typeof(float))
            {
                foreach (Attribute attribute in fieldInfo.GetCustomAttributes())
                {
                    switch (attribute)
                    {
                    case RangeAttribute ra:
                        float min = Mathf.RoundToInt(ra.min);
                        float max = Mathf.RoundToInt(ra.max);
                        solution.Add(new FloatGenetic(UnityEngine.Random.Range(min, max), min, max, fieldInfo.Name));
                        break;
                    }
                }
            }
            else if (fieldInfo.FieldType.IsEnum)
            {
                int min = 0;
                int max = fieldInfo.FieldType.GetEnumValues().Length - 1;
                foreach (Attribute attribute in fieldInfo.GetCustomAttributes())
                {
                    switch (attribute)
                    {
                    case MinAttribute mina:
                        min = (int)mina.min;
                        break;
                    }
                }
                solution.Add(new EnumGenetic(UnityEngine.Random.Range(0, max), min, max, fieldInfo.Name));
            }
        }
        return(solution);
    }
예제 #3
0
 public override void ApplyValue(PBSNoiseScript noiseScript)
 {
     noiseScript.GetType().GetField(name).SetValue(noiseScript, value);
 }