// Start is called before the first frame update void Start() { if (mother == null || father == null) { genome = new EnemyGenome(); } else { genome = new EnemyGenome(father, mother); } pfc = GameObject.FindWithTag("GameController").GetComponent <PlayfieldController>(); nav = GetComponent <UnityEngine.AI.NavMeshAgent>(); nav.speed = genome.speed; StartCoroutine("makeUpMind"); }
public EnemyGenome(EnemyGenome father, EnemyGenome mother) { health = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.health : mother.health; speed = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.speed : mother.speed; hunger = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.hunger : mother.hunger; hungerIncreaseOverTime = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.hungerIncreaseOverTime : mother.hungerIncreaseOverTime; damageWhenHungry = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.damageWhenHungry : mother.damageWhenHungry; reactionTime = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.reactionTime : mother.reactionTime; fear = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.fear : mother.fear; braveness = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.braveness : mother.braveness; damage = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.damage : mother.damage; attackDamage = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.attackDamage : mother.attackDamage; perception = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.perception : mother.perception; lifeExpectancy = (Random.Range(0f, 1f) <= SimulationParameters.FATHER_GENE_PROBABILITY) ? father.lifeExpectancy : mother.lifeExpectancy; #region Random Mutation of a random genome if (Random.Range(0f, 1f) <= SimulationParameters.MUTATION_PROBABILITY) { int i = Random.Range(0, 12); switch (i) { case 0: health = SimulationParameters.random(SimulationParameters.MIN_HEALTH, SimulationParameters.MAX_HEALTH, 1f); break; case 1: speed = SimulationParameters.random(SimulationParameters.MIN_SPEED, SimulationParameters.MAX_SPEED, 3.0f); break; case 2: hunger = SimulationParameters.random(SimulationParameters.MIN_HUNGER, SimulationParameters.MAX_HUNGER, 0.5f); break; case 3: hungerIncreaseOverTime = SimulationParameters.random(SimulationParameters.MIN_HUNGER_INCREASE_OVER_TIME, SimulationParameters.MAX_HUNGER_INCREASE_OVER_TIME, 1f); break; case 4: damageWhenHungry = SimulationParameters.random(SimulationParameters.MIN_DAMAGE_WHEN_HUNGRY, SimulationParameters.MAX_DAMAGE_WHEN_HUNGRY, 1f); break; case 5: reactionTime = SimulationParameters.random(SimulationParameters.MIN_REACTION_TIME, SimulationParameters.MAX_REACTION_TIME, 1f); break; case 6: fear = SimulationParameters.random(SimulationParameters.MIN_FEAR, SimulationParameters.MAX_FEAR, 2.0f); break; case 7: braveness = SimulationParameters.random(SimulationParameters.MIN_BRAVENESS, SimulationParameters.MAX_BRAVENESS, 2.0f); break; case 8: damage = SimulationParameters.random(SimulationParameters.MIN_DAMAGE, SimulationParameters.MAX_DAMAGE, 0.5f); break; case 9: attackDamage = SimulationParameters.random(SimulationParameters.MIN_ATTACK_DAMAGE, SimulationParameters.MAX_ATTACK_DAMAGE, 3.0f); break; case 10: perception = SimulationParameters.random(SimulationParameters.MIN_PERCEPTION, SimulationParameters.MAX_PERCEPTION, 1f); break; case 11: lifeExpectancy = Random.Range(SimulationParameters.MIN_LIFE_EXPECTANCY, SimulationParameters.MAX_LIFE_EXPECTANCY); break; case 12: speed *= 2; perception *= 10; break; default: break; } } #endregion }