public void Mate(AGene[] genesMale, AGene [] genesFemale) { genes = new AGene[number_of_behaviors]; if (genesMale == null || genesFemale == null) { for (int i = 0; i < genes.Length; ++i) { genes[i] = new AGene { oneHalf = (AnAllele)Random.Range(0, 6), otherHalf = (AnAllele)Random.Range(0, 6) }; } } else { for (int i = 0; i < genes.Length; ++i) { genes[i] = new AGene { oneHalf = Random.Range(0, 2) == 0 ? genesMale[i].oneHalf : genesMale[i].otherHalf, otherHalf = Random.Range(0, 2) == 0 ? genesFemale[i].oneHalf : genesFemale[i].otherHalf }; } } rend.material.color = UpdateColor(); }
private void Update() { Transform closest = GetClosest(encounters); if (closest == null) { return; } int behaviorGeneIndex = closest.tag == "Predator" ? 0 : closest.tag == "Food" ? 1 : 2; AGene gene = behaviorGenes.genes[behaviorGeneIndex]; bool atLeastOneDominant = false; if ((int)gene.oneHalf > 2) { atLeastOneDominant = true; ExecuteBehavior((int)gene.oneHalf % 3, closest); } if ((int)gene.otherHalf > 2 && ((int)gene.oneHalf % 3 != (int)gene.otherHalf % 3 || !atLeastOneDominant)) { atLeastOneDominant = true; ExecuteBehavior((int)gene.otherHalf % 3, closest); } else if (!atLeastOneDominant) { if ((int)gene.oneHalf % 3 != (int)gene.otherHalf % 3) { ExecuteBehavior((int)gene.oneHalf % 3, closest); ExecuteBehavior((int)gene.otherHalf % 3, closest); } else { ExecuteBehavior((int)gene.oneHalf % 3, closest); } } }