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; } } }
//а этот метод вызывается каждый фрейм 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(); //сортируем цели и получаем новую } }