River Jiang
2020-10-27 79e652bedf62f0842f59a2323f139f2e90efe819
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -8,6 +8,7 @@
using TowerDefense.Towers;
using TowerDefense.Towers.Projectiles;
using UnityEngine;
using KTGMGemClient;
namespace TowerDefense.Affectors
{
@@ -101,6 +102,17 @@
      /// </summary>
      protected Targetable m_TrackingEnemy;
      /// <summary>
      /// 处理装弹时间.
      /// </summary>
      protected float fillBulletTime = 0.0f;
        /// <summary>
        /// 充能时间
        /// </summary>
        protected float energyCalTime = 0;
      protected float fInEnergy = 0;
      protected float fBackupTimer = 0.0f;
      /// <summary>
      /// Gets the search rate from the targetter
      /// </summary>
@@ -218,11 +230,74 @@
         m_Launcher = GetComponent<ILauncher>();
      }
      protected void updateTowerSkillData()
        {
         //
         // 预留出来装填子弹的时间.
         if (fillBulletTime > 0)
         {
            fillBulletTime -= Time.deltaTime;
            if (fillBulletTime <= 0.3f)
            {
               if (towerPtr && towerPtr.bulletCtl)
                  towerPtr.bulletCtl.resetToMaxBullet();
            }
            if (fillBulletTime <= 0)
            {
               fillBulletTime = 0;
            }
         }
         //
         // 充能时间的处理
         if( towerPtr && towerPtr.energyCtl)
            {
            if( this.fInEnergy <= 0)
                {
               this.energyCalTime += Time.deltaTime;
               float process = energyCalTime % 11.0f;
               int proint = (int)Math.Floor(process);
               proint += towerPtr.uiProOffset;
               towerPtr.energyCtl.SetEnergyProgress(proint);
               if (proint == 10)
               {
                  fInEnergy = 5.0f;
                  // 设置多倍攻击速度
                  fBackupTimer = m_FireTimer;
                  m_FireTimer = m_FireTimer / 3.0f;
                  towerPtr.uiProOffset = 0;
               }
                }
                else
                {
               fInEnergy -= Time.deltaTime;
               if( fInEnergy <= 0)
                    {
                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                  fInEnergy = 0.0f;
                  this.energyCalTime = 0.0f;
                  towerPtr.energyCtl.SetEnergyProgress(0);
                  // 恢复正常攻击速度
                  m_FireTimer = fBackupTimer;
               }
            }
         }
      }
      /// <summary>
      /// Update the timers
      /// </summary>
      protected virtual void Update()
      {
         // 处理当前Affector所在Tower对应的技能
         updateTowerSkillData();
         m_FireTimer -= Time.deltaTime;
         if( trackingEnemy == null )
            m_TrackingEnemy = targetter.GetTarget(waveLineID, bWoodAffector);
@@ -230,6 +305,10 @@
         {
            OnFireTimer();
            m_FireTimer = 1 / fireRate;
            // 多倍攻速:
            if (fInEnergy > 0.0f)
               m_FireTimer = m_FireTimer / 3.0f;
         }
      }
@@ -254,14 +333,32 @@
      /// </summary>
      protected virtual void FireProjectile()
      {
         // WORK START: 确保获取
         // 不再处理多子弹攻击,确保只有一个弹道
         isMultiAttack = false; 
         m_TrackingEnemy = targetter.GetTarget( waveLineID, bWoodAffector );
         if (m_TrackingEnemy == null)
         if ( (m_TrackingEnemy == null) || (fillBulletTime>0) )
         {
            if (this.towerPtr)
               towerPtr.setTowerState(false);
            return;
         }
         }else
            {
            if (this.towerPtr)
               towerPtr.setTowerState(true);
            }
         //
         // 处理子弹充能相关的内容
         if( towerPtr && (towerPtr.bulletCtl != null))
            {
            int bnum = towerPtr.bulletCtl.decBullet();
            //
            if (bnum == 0)
            {
               damagerProjectile.damageMulti = 2.0f;
               fillBulletTime = 2.0f;
            }
            }
         if (isMultiAttack)
         {