void most_similar_creature() { targetCrt = null; // reference to the script of the closest creature GameObject target = null; GameObject c = null; // current collider being looked at float similarity = Mathf.Infinity; float curr_similarity; cs = Physics.OverlapSphere(_t.position, (float)los); if (cs.Length == 0) { target = null; return; } foreach (Collider col in cs) { c = (GameObject)col.transform.gameObject; if (c && c.gameObject.name == "root" && c != crt.root.gameObject) { other_crt = c.transform.parent.GetComponent <Creature>(); curr_similarity = GeneticsUtils.similar_colour(crt.chromosome, other_crt.chromosome); if (curr_similarity < similarity) { target = c.transform.parent.gameObject; similarity = curr_similarity; } Vector3 diff = c.transform.position - _t.position; if (diff.magnitude < (float)crt_mate_range) { other_crt = c.transform.parent.GetComponent <Creature>(); Genitalia other_genital = other_crt.genital.GetComponent <Genitalia>(); if (crt.state == Creature.State.persuing_mate || other_crt.state == Creature.State.persuing_mate) { co.observe(crt.genital.gameObject, other_genital.gameObject); other_crt.state = Creature.State.mating; crt.state = Creature.State.mating; } similarity = curr_similarity; } } distance_to_goal = 0F; goal = null; if (target) { targetCrt = target.GetComponent <Creature>(); goal = targetCrt.root; distance_to_goal = distanceToGoal(); } } }
public void observe(GameObject a, GameObject b) { collision_events.Add(new CollEvent(a, b)); CollEvent dup = findMatch(a, b); // If a duplicate event has been found spawn a child if (null != dup) { collision_events.Clear(); Vector3 pos = (a.transform.position - b.transform.position) * 0.5F + b.transform.position; // Get references to the scripts of each creature Creature a_script = a.transform.parent.parent.GetComponent <Creature>(); Creature b_script = b.transform.parent.parent.GetComponent <Creature>(); double a_energy = a_script.getEnergy(); double b_energy = b_script.getEnergy(); Chromosome newChromosome; newChromosome = GeneticsUtils.crossover(a_script.chromosome, b_script.chromosome, crossover_rate); newChromosome = GeneticsUtils.mutate(newChromosome, mutation_rate, mutation_factor); spw.spawn(pos, Vector3.zero, a_energy * energy_scale + b_energy * energy_scale, newChromosome ); a_script.subtractEnergy(a_energy * energy_scale); b_script.subtractEnergy(b_energy * energy_scale); a_script.offspring++; b_script.offspring++; } else { collision_events.Add(new CollEvent(b, a)); } }