private static void Mutate(Mob mob, Torso[] torsos, List <Head> heads, List <Member> members) { var iMutation = Random.Range(0, 2 + mob.torso.nbMember); switch (iMutation) { case 0: // Torso var newTorso = Instantiate(torsos[Random.Range(0, torsos.Length)]); newTorso.head = mob.torso.head; if (newTorso.nbMember == mob.torso.nbMember) { newTorso.members = mob.torso.members; } else if (newTorso.nbMember > mob.torso.nbMember) { newTorso.members.AddRange(mob.torso.members); while (newTorso.members.Count < newTorso.nbMember) { newTorso.members.Add(Instantiate(mob.torso.members[Random.Range(0, mob.torso.nbMember)])); } } else { var indexes = new SortedSet <int>(); while (indexes.Count < newTorso.nbMember) { indexes.Add(Random.Range(0, mob.torso.nbMember)); } for (var i = 0; i < mob.torso.nbMember; ++i) { if (indexes.Contains(i)) { newTorso.members.Add(mob.torso.members[i]); } else { DestroyImmediate(mob.torso.members[i]); } } } DestroyImmediate(mob.torso); mob.torso = newTorso; break; case 1: // Head DestroyImmediate(mob.torso.head); mob.torso.head = Instantiate(heads[Random.Range(0, heads.Count)]); break; default: // Member iMutation -= 2; DestroyImmediate(mob.torso.members[iMutation]); mob.torso.members[iMutation] = Instantiate(members[Random.Range(0, members.Count)]); break; } mob.ComputeStats(); }