private void BulletFlowen(NPC npc, GunModel model, GameObject bullet) { Destroy(bullet); if (npc == null || !npcs.Contains(npc)) { return; } npc.model.HP -= model.Damage; if (npc.model.HP <= 0) { // дистанция var startPosition = Tower.Instance.bulletStartPlace.transform.position; var fullDistance = Vector3.Distance(Spawner.Instance.StartPoint.position, startPosition); var distance = Vector3.Distance(npc.transform.position, startPosition); var distancePassed = distance / fullDistance; var variationStat = new VariationStats(distancePassed, npc.DamageDealt); variationStats.Add(variationStat); npcs.RemoveAt(0); npc.Kill(); if (npcs.Count == 0) { GeneticsController.Instance.OnVariationDied(variationStats.ToArray()); StartWave(); } } }
/// <summary> /// Оценка эффективности по результатам применения вариации /// </summary> /// <param name="stats"></param> /// <returns>0 - все очень плохо (ничего не пройденно и не задамажено)</returns> private float CalcFitnessValue(VariationStats stats) { // пройденная дистанция и так в [0, 1] float distanceGrade = stats.distancePassed; // оценку дамага считаем как снятую часть жизней игрока float damageGrade = stats.damageDealt / Tower.Instance.playerBase.MaxHealth; return(0.2f * distanceGrade + 0.8f * damageGrade); }
private float CalcAvgFitnessValue(VariationStats[] variationStats) { // так как приходят статы по каждому отдельному мобу, считаем среднее VariationStats avg = new VariationStats(0.0f, 0.0f); for (int i = 0; i < variationStats.Length; i++) { avg.damageDealt += variationStats[i].damageDealt; avg.distancePassed += variationStats[i].distancePassed; } avg.damageDealt /= (float)variationStats.Length; return(CalcFitnessValue(avg)); }