wangguan
2020-12-08 3d13f2e8a23602aedb8adf5d2d02e377a330a61b
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -31,9 +31,6 @@
        /// 木塔最后一击是特殊攻击,需要替换projectile
        /// </summary>
        public GameObject woodProjectile_SP;
        //
        protected GameObject projectile1;
        protected GameObject projectile2;
        /// <summary>
        /// The list of points to launch the projectiles from
@@ -46,25 +43,9 @@
        public Transform epicenter;
        /// <summary>
        /// Configuration for when the tower does splash damage
        /// </summary>
        public bool isMultiAttack;
        /// <summary>
        /// 如果是多目标攻击,最多攻击目标
        /// </summary>
        public int maxAttackNum = 1;
        /// <summary>
        /// The fire rate in fires-per-second
        /// </summary>
        [SerializeField]
        private float projectileFireRate = 1;
        public float FireRate
        {
            get { return 1 / GetFireDuration(); }
        }
        /// <summary>
        /// 是否木属性数据
@@ -182,7 +163,7 @@
                float rateAdd = 0;
                if (fireRateAdd != null)
                    rateAdd = fireRateAdd.GetFireSpeedAdd(towerPtr.attributeId);
                    rateAdd = fireRateAdd.GetFireSpeedAdd(towerPtr.ElfId);
                return rateAdd > 1 ? rateAdd : fireSpeed;
            }
        }
@@ -251,30 +232,35 @@
            towerTargetter.alignment = affectorAlignment;
            towerTargetter.acquiredTarget += OnAcquiredTarget;
            // towerTargetter.lostTarget += OnLostTarget;
            GetAudioEnum();
            myTower = transform.parent.GetComponent<TowerLevel>();
            GetAudioEnum();
        }
        private AudioEnum audioEnum;//当前音乐的种类
        void GetAudioEnum()
        {
            if (transform.parent.name.StartsWith("GrowUpTower"))
            //小怪身上也有这个脚本,塔的名字做了更改,所以判断条件需要变成transform.parent.parent
            if (transform.parent.parent != null)
            {
                //火元素
                audioEnum = AudioEnum.FireTAttack;
                if (transform.parent.parent.name.StartsWith("GrowUpTower"))
                {
                    //火元素
                    audioEnum = AudioEnum.FireTAttack;
                }
                else if (transform.parent.parent.name.StartsWith("BlinkTower"))
                {
                    //木元素
                    audioEnum = AudioEnum.WoodTAttack;
                }
                else if (transform.parent.parent.name.StartsWith("CopyCatTower"))
                {
                    //水元素
                    audioEnum = AudioEnum.WaterTAttack;
                }
            }
            else if (transform.parent.name.StartsWith("BlinkTower"))
            {
                //木元素
                audioEnum = AudioEnum.WoodTAttack;
            }
            else if (transform.parent.name.StartsWith("CopyCatTower"))
            {
                //水元素
                audioEnum = AudioEnum.WaterTAttack;
            }
        }
        void OnDestroy()
@@ -301,17 +287,6 @@
        public Damager damagerProjectile2
        {
            get { return projectile == null ? null : projectile.GetComponent<Damager>(); }
        }
        /// <summary>
        /// Returns the total projectile damage
        /// </summary>
        public float GetProjectileDamage()
        {
            var splash = projectile.GetComponent<SplashDamager>();
            float splashDamage = splash != null ? splash.damage : 0;
            return damagerProjectile.finalDamage + splashDamage;
        }
        /// <summary>
@@ -373,7 +348,7 @@
        private void UpdateWoodAim()
        {
            // 离得最近的 Agent
            Agent agent = GetMinDistanceAgent();
            Agent agent = AgentInsManager.instance.GetMinDisAgent(waveLineID, false);
            if (agent != null)
            {
@@ -408,34 +383,6 @@
                    ++agent.WoodAimCount;
                }
            }
        }
        /// <summary>
        /// 获取距离终点最近的Agent
        /// </summary>
        /// <returns></returns>
        private Agent GetMinDistanceAgent()
        {
            Agent ret = null;
            float minDistance = -1f;
            WaveLineAgentInsMgr[] waveLineAgentIns = AgentInsManager.instance.GetWaveLineList();
            WaveLineAgentInsMgr waveLineAgentInsMgr = waveLineAgentIns[waveLineID];
            List<Agent> agents = waveLineAgentInsMgr.listAgent;
            Vector3 endPos = EndlessLevelManager.instance.GetHomeBasePosition(waveLineID + 1);
            for (int i = 0; i < agents.Count; ++i)
            {
                float distance = Mathf.Abs(agents[i].transform.position.z - endPos.z);
                if (minDistance < 0 || distance < minDistance)
                {
                    minDistance = distance;
                    ret = agents[i];
                }
            }
            return ret;
        }
        /// <summary>
@@ -474,7 +421,6 @@
                    {
                        fireState = true;
                        fInEnergy = finalFireSpeed;
                        myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
                        // 设置多倍攻击速度
                        fBackupTimer = m_FireTimer;
                        m_FireTimer = m_FireTimer / finalFireSpeed;
@@ -488,10 +434,8 @@
                    fInEnergy -= Time.deltaTime;
                    if (fInEnergy <= 0)
                    {
                        myTower.SetFireMatSpeed(false);//恢复了火宝石攻击速度
                        fireState = false;
                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                        //EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                        fInEnergy = 0.0f;
                        energyCalTime = 0.0f;
                        towerPtr.energyCtl.SetEnergyProgress(0);
@@ -512,22 +456,6 @@
            if (towerPtr && towerPtr.FreezeBreathCtrl)
            {
                Damager damager = projectile.gameObject.GetComponent<Damager>();
                float finalDamage = damager.damage;
                List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, towerPtr.attributeId);
                float ratio = 0;
                float add = 0;
                if (list.Count > 0)
                {
                    for (int i = 0; i < list.Count; ++i)
                    {
                        ratio += list[i].Config.buff_effect[1];
                        add += list[i].Config.buff_effect[2];
                    }
                }
                finalDamage += (ratio / 100f) * finalDamage + add;
                if (inFreezeBreath <= 0)
                {
@@ -544,7 +472,7 @@
                        towerPtr.PlayFreezeBreathEffect(true);
                        towerPtr.FreezeBreathCtrl.ReleaseCount = 1;
                        towerPtr.FreezeBreathCtrl.PlayFreezeEffect(waveLineID);
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, towerPtr, damager.alignmentProvider);
                    }
                }
                else
@@ -557,7 +485,7 @@
                    if (interval == time * (towerPtr.FreezeBreathCtrl.DamageCount - towerPtr.FreezeBreathCtrl.ReleaseCount - 1) + offset && towerPtr.FreezeBreathCtrl.ReleaseCount < towerPtr.FreezeBreathCtrl.DamageCount)
                    {
                        ++towerPtr.FreezeBreathCtrl.ReleaseCount;
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, towerPtr, damager.alignmentProvider);
                    }
                    if (inFreezeBreath <= 0)
@@ -580,8 +508,6 @@
            {
                if (fireState)
                {
                    myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
                    towerPtr.PlayEnergyEffect(true);
                }
            }
@@ -606,16 +532,6 @@
        }
        /// <summary>
        /// 获取子弹发射时间间隔
        /// </summary>
        public float GetFireDuration()
        {
            DecreaseTowerAttackCD endlessBuff = (DecreaseTowerAttackCD)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseTowerAttackCD);
            return endlessBuff != null ? endlessBuff.GetDecreaseCD(towerPtr.attributeId, 1 / projectileFireRate) : 1 / projectileFireRate;
        }
        /// <summary>
        /// Update the timers
        /// </summary>
        protected virtual void Update()
@@ -630,7 +546,7 @@
            if (m_TrackingEnemy != null && m_FireTimer < 0)
            {
                m_FireTimer = GetFireDuration();
                m_FireTimer = towerLevel.GetFireRate();
                if (fInEnergy > 0)
                    m_FireTimer /= finalFireSpeed;
@@ -661,15 +577,14 @@
        /// </summary>
        public virtual void FireProjectile()
        {
            // 不再处理多子弹攻击,确保只有一个弹道
            isMultiAttack = false;
            m_TrackingEnemy = targetter.GetTarget(waveLineID, bWoodAffector);
            GameObject go = damagerProjectile.gameObject;
            if (m_TrackingEnemy == null || fillBulletTime > 0) return;
            go.GetComponent<Damager>().IsEnhancedBullet = false;
            Damager goDamager = go.GetComponent<Damager>();
            goDamager.IsEnhancedBullet = false;
            goDamager.TowerPtr = towerPtr;
            // 处理子弹充能相关的内容
            if (towerPtr && towerPtr.bulletCtl != null)
@@ -691,6 +606,7 @@
                    tmpDamager.damageMulti = 10.0f;
                    tmpDamager.damage = damagerProjectile.damage;
                    tmpDamager.IsEnhancedBullet = true;
                    tmpDamager.TowerPtr = towerPtr;
                }
                // 下一颗子弹是强化子弹,然后直接蓄力
@@ -707,31 +623,12 @@
                    WoodChargeEffect.Play();
                }
            }
            else
            {
                if (towerPtr)
                    towerPtr.setTowerState(true);
            }
            if (isMultiAttack)
            if (Targetter.bSearchTarget)
            {
                List<Targetable> enemies = towerTargetter.GetAllTargets();
                if ((enemies != null) && (Targetter.bSearchTarget))
                    m_Launcher.Launch(enemies, projectile, projectilePoints, maxAttackNum);
            }
            else
            {
                if (Targetter.bSearchTarget)
                {
                    m_Launcher.Launch(m_TrackingEnemy, go, projectilePoints);
                    if (AudioSourceManager.Ins)
                        AudioSourceManager.Ins.Play(audioEnum);
                }
            }
            if (randomAudioSource != null)
            {
                if (Targetter.bSearchTarget)
                    randomAudioSource.PlayRandomClip();
                m_Launcher.Launch(m_TrackingEnemy, go, projectilePoints);
                if (AudioSourceManager.Ins)
                    AudioSourceManager.Ins.Play(audioEnum);
            }
        }