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();
            }
        }
    }
Ejemplo n.º 2
0
    /// <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);
    }
Ejemplo n.º 3
0
    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));
    }