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()); }
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); }
public override void ApplyValue(PBSNoiseScript noiseScript) { noiseScript.GetType().GetField(name).SetValue(noiseScript, value); }