private void CalculateFitnessFromCheckpoint(FitnessCheckpoint fitnessCheckpoint) { int checkpointIndex = fitnessCheckpoint.CheckpointIndex; int lastCheckpointIndex = FitnessCheckpoint.LastCheckpointIndex; if (lastPassedCheckpointIndex == checkpointIndex) { return; } else if (lastPassedCheckpointIndex == checkpointIndex - 1 || // Moving forward to higher indexed checkpoint. lastPassedCheckpointIndex == lastCheckpointIndex && checkpointIndex == 0) // Moving forward from last to first checkpoint. { fitness += 500; passedNewCheckpoint = true; if (fitnessAnimator.gameObject.activeInHierarchy) { fitnessAnimator.Play("FitnessUpdate", 0, 0); } fitnessCheckpoint.ReactToTouchedCar(crashedCarMaterial.GetColor("_BaseColor")); } else if (lastPassedCheckpointIndex == checkpointIndex + 1 || // Moving back to lower indexed checkpoint. checkpointIndex == lastCheckpointIndex && lastPassedCheckpointIndex <= 0) // Moving back from first (or finish line) to last checkpoint. { fitness -= 500; passedNewCheckpoint = false; if (fitnessAnimator.gameObject.activeInHierarchy) { fitnessAnimator.Play("FitnessUpdate", 0, 0); } fitnessCheckpoint.PlayTriggerAnimation(); } lastPassedCheckpointIndex = checkpointIndex; }
private IEnumerator StartEvolution() { // UI & visual effects: CarsSelector carsSelector = CarsSelector.Instance; carsSelector.SelectionIsAvailable = false; carsSelector.ResetSelection(); GenomeUI.Instance.DrawingGenomeIsAvailable = false; MenuController.Instance.ShowEvolutionInfo(true); FitnessCheckpoint.ResetColors(); startDissolveEffectCoroutine = StartCoroutine(StartDissolveEffect()); yield return(new WaitForSeconds(1)); // Create new generation: carBrainEvolution.StartEvolution(population); startEvolutionCoroutine = null; }