Ejemplo n.º 1
0
 private void Update()
 {
     if (Target != null)                                                                                                                                                                                                            //если у нас есть цель
     {
         mob.rotation  = Quaternion.Lerp(mob.rotation, Quaternion.LookRotation(new Vector3(Target.transform.position.x, 0.0f, Target.transform.position.z) - new Vector3(mob.position.x, 0.0f, mob.position.z)), mobRotationSpeed); //избушка-избушка, повернись к пушке передом!
         mob.position += mob.forward * MobCurrentSpeed * Time.deltaTime;                                                                                                                                                            //двигаем в сторону, куда смотрит моб
         float   squaredDistance = (Target.transform.position - mob.position).sqrMagnitude;                                                                                                                                         //меряем дистанцию до цели
         Vector3 structDirection = (Target.transform.position - mob.position).normalized;                                                                                                                                           //получаем вектор направления
         float   attackDirection = Vector3.Dot(structDirection, mob.forward);                                                                                                                                                       //получаем вектор атаки
         if (squaredDistance < attackDistance * attackDistance && attackDirection > 0)                                                                                                                                              //если мы на дистанции атаки и цель перед нами
         {
             if (attackTimer > 0)
             {
                 attackTimer -= Time.deltaTime;               //если таймер атаки больше 0 - отнимаем его
             }
             if (attackTimer <= 0)                            //если же он стал меньше нуля или равен ему
             {
                 BaseHP bhp = Target.GetComponent <BaseHP>(); //подключаемся к компоненту ХП цели
                 if (bhp != null)
                 {
                     bhp.ChangeHP(-damage);                  //если цель ещё живая, наносим урон (мы можем не одни бить по цели, потому проверка необходима)
                 }
                 attackTimer = coolDown;                     //возвращаем таймер в исходное положение
                 MobHP mhp = GetComponent <MobHP>();
                 mhp.curHP = 0;
             }
         }
     }
     else
     {
         GameObject baza = GameObject.FindGameObjectWithTag("Base");             //находим наш объект с базой, он всего один
         if (baza != null)
         {
             Target = baza;
         }
     }
 }
Ejemplo n.º 2
0
    //а этот метод вызывается каждый фрейм
    private void Update()
    {
        if (curTarget != null)                                                                                                                                                           //если переменная текущей цели не пустая
        {
            float squaredDistance = (turretHead.position - curTarget.transform.position).sqrMagnitude;                                                                                   //меряем дистанцию до нее
            if (Mathf.Pow(attackMinimumDistance, 2) < squaredDistance && squaredDistance < Mathf.Pow(attackMaximumDistance, 2))                                                          //если дистанция больше мертвой зоны и меньше дистанции поражения пушки
            {
                turretHead.rotation = Quaternion.Lerp(turretHead.rotation, Quaternion.LookRotation(curTarget.transform.position - turretHead.position), rotationSpeed * Time.deltaTime); //вращаем башню в сторону цели
                if (reloadTimer > 0)
                {
                    reloadTimer -= Time.deltaTime;                                  //если таймер перезарядки больше нуля - отнимаем его
                }
                if (reloadTimer <= 0)
                {
                    if (ammoAmount > 0)                     //пока есть порох в пороховницах
                    {
                        MobHP mhp = curTarget.GetComponent <MobHP>();
                        switch (FiringOrder)                         //смотрим, из какого ствола стрелять
                        {
                        case 1:
                            if (mhp != null)
                            {
                                mhp.ChangeHP(-attackDamage);                  //наносим урон цели
                            }
                            FiringOrder++;                                    //переключаем ствол
                            ammoAmount--;                                     //минус патрон
                            break;

                        case 2:
                            if (mhp != null)
                            {
                                mhp.ChangeHP(-attackDamage);
                            }
                            FiringOrder = 1;
                            ammoAmount--;
                            break;
                        }
                        reloadTimer = reloadCooldown;                         //возвращаем переменной таймера перезарядки её первоначальное значение из "константы"
                    }
                    else
                    {
                        if (ammoReloadTimer > 0)
                        {
                            ammoReloadTimer -= Time.deltaTime;
                        }
                        if (ammoReloadTimer <= 0)
                        {
                            ammoAmount      = ammoAmountConst;
                            ammoReloadTimer = ammoReloadConst;
                        }
                    }
                }
                if (squaredDistance < Mathf.Pow(attackMinimumDistance, 2))
                {
                    curTarget = null;                                                                       //сбрасываем с прицела текущую цель, если она вне радиуса атаки
                }
            }
        }
        else
        {
            curTarget = SortTargets();             //сортируем цели и получаем новую
        }
    }