public void Reproduction(bool mutate = true) { List <DNA> reproducedDNAs = new List <DNA>(); if (DNAList.Count < 2 && DNAList.Count > 0) // if one is present, reproduce by itself and mutate { DNA reproducedDNA = new DNA(DNAList[0]); if (mutate && UnityEngine.Random.Range(0f, 1f) >= GeneticAlgorithm.instance.mutationRate) { reproducedDNA.Mutate(); } reproducedDNAs.Add(reproducedDNA); DNAList.AddRange(reproducedDNAs); Debug.Log(".Added " + reproducedDNAs.Count + " Offsprings. [" + DNAList.Count + "/" + CreatureSpawner.instance.creaturesCount + "]"); } else if (DNAList.Count >= 2) { for (int i = 0; i < DNAList.Count - 1; i++) { DNA parent1DNA = DNAList[i]; DNA parent2DNA = DNAList[i + 1]; List <DNA> crossedDNAs = parent1DNA.CrossoverBothWays(parent2DNA); foreach (DNA crossedDNA in crossedDNAs) { crossedDNA.Mutate(); } reproducedDNAs.AddRange(crossedDNAs); } DNAList.AddRange(reproducedDNAs); Debug.Log("Added " + reproducedDNAs.Count + " Offsprings. [" + DNAList.Count + "/" + CreatureSpawner.instance.creaturesCount + "]"); } }