chenxin
2020-12-01 e36f2a3ac098d6e89d3882f3354ec69c07e71e16
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -8,6 +8,8 @@
using TowerDefense.Towers.Projectiles;
using UnityEngine;
using KTGMGemClient;
using TowerDefense.Agents;
using TowerDefense.Level;
namespace TowerDefense.Affectors
{
@@ -57,7 +59,7 @@
        /// The fire rate in fires-per-second
        /// </summary>
        [SerializeField]
        private float projectileFireRate;
        private float projectileFireRate = 1;
        public float FireRate
        {
@@ -132,7 +134,7 @@
        /// </summary>
        protected float freezeBreathCallTime = 0;
        protected float inFreezeBreath = 0;
        protected float inFreezeBreath;
        protected float freezeBreathBackTimer = 0;
@@ -145,6 +147,30 @@
        protected float fireSpeed { get; set; } = 5f;
        /// <summary>
        /// 木属性精灵蓄力时间
        /// </summary>
        protected float woodChargeTime { get; set; } = 1.5f;
        protected float woodRemainChargeTime { get; set; }
        /// <summary>
        /// 蓄力特效时间
        /// </summary>
        protected float woodChargeEffectTime { get; set; }
        /// <summary>
        /// 木属性精灵蓄力特效
        /// </summary>
        public ParticleSystem WoodChargeEffect;
        public Transform WoodChargeTransform;
        /// <summary>
        /// 木属性正在瞄准的Agent
        /// </summary>
        protected Agent woodAimAgent;
        /// <summary>
        /// 火精灵攻击最终攻击倍速,里面计算了buff增加的倍速
        /// </summary>
        /// <value></value>
@@ -153,7 +179,11 @@
            get
            {
                FireRateAdd fireRateAdd = (FireRateAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FireRateAdd);
                return fireRateAdd.GetFireSpeedAdd(towerAttributeId);
                float rateAdd = 0;
                if (fireRateAdd != null)
                    rateAdd = fireRateAdd.GetFireSpeedAdd(towerPtr.attributeId);
                return rateAdd > 1 ? rateAdd : fireSpeed;
            }
        }
@@ -207,15 +237,6 @@
        public override TowerDefense.Targetting.Targetter GetTargetter()
        {
            return targetter;
        }
        private void Start()
        {
            if (projectile != null)
            {
                Damager damager = projectile.GetComponent<Damager>();
                towerAttributeId = damager.TowerAttributeId;
            }
        }
        /// <summary>
@@ -313,6 +334,22 @@
        // 处理木精灵装填子弹
        private void HandleBullet()
        {
            if (woodRemainChargeTime > 0f)
                woodRemainChargeTime -= Time.deltaTime;
            if (woodChargeEffectTime > 0f)
            {
                woodChargeEffectTime -= Time.deltaTime;
                UpdateWoodAim();
                if (woodChargeEffectTime <= 0)
                {
                    towerPtr.IsWoodCharge = false;
                    CancelWoodAim();
                    WoodChargeEffect.Stop();
                }
            }
            // 预留出来装填子弹的时间.
            if (fillBulletTime > 0)
            {
@@ -328,6 +365,68 @@
                    fillBulletTime = 0;
                }
            }
        }
        /// <summary>
        /// 更新木属性瞄准
        /// </summary>
        private void UpdateWoodAim()
        {
            // 离得最近的 Agent
            Agent agent = AgentInsManager.instance.GetMinDisAgent(waveLineID, false);
            if (agent != null)
            {
                // 还没有瞄准目标,直接分配
                if (woodAimAgent == null)
                {
                    woodAimAgent = agent;
                    towerPtr.WoodAimAgent = agent;
                    if (agent.WoodAimCount == 0)
                        agent.PlayWoodAimEffect();
                    ++agent.WoodAimCount;
                }
                // 有小怪走到之前瞄准目标的前面 或者 之前瞄准的目标死亡,切换瞄准目标
                else if (woodAimAgent.Id != agent.Id)
                {
                    if (woodAimAgent.WoodAimCount > 0)
                    {
                        --woodAimAgent.WoodAimCount;
                        if (woodAimAgent.WoodAimCount == 0)
                            woodAimAgent.StopWoodAimEffect();
                    }
                    woodAimAgent = agent;
                    towerPtr.WoodAimAgent = agent;
                    if (agent.WoodAimCount == 0)
                        agent.PlayWoodAimEffect();
                    ++agent.WoodAimCount;
                }
            }
        }
        /// <summary>
        /// 取消木属性瞄准
        /// </summary>
        private void CancelWoodAim()
        {
            if (woodAimAgent != null)
            {
                if (woodAimAgent.WoodAimCount > 0)
                {
                    --woodAimAgent.WoodAimCount;
                    if (woodAimAgent.WoodAimCount == 0)
                        woodAimAgent.StopWoodAimEffect();
                }
            }
            woodAimAgent = null;
        }
        // 处理火精灵充能
@@ -347,7 +446,6 @@
                    {
                        fireState = true;
                        fInEnergy = finalFireSpeed;
                        myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
                        // 设置多倍攻击速度
                        fBackupTimer = m_FireTimer;
                        m_FireTimer = m_FireTimer / finalFireSpeed;
@@ -361,8 +459,6 @@
                    fInEnergy -= Time.deltaTime;
                    if (fInEnergy <= 0)
                    {
                        myTower.SetFireMatSpeed(false);//恢复了火宝石攻击速度
                        fireState = false;
                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                        fInEnergy = 0.0f;
@@ -412,22 +508,25 @@
                    if (processInt == (int)Mathf.Floor(FreezeBreath.ChargeTime))
                    {
                        inFreezeBreath = FreezeBreath.EffectTime;
                        inFreezeBreath = towerPtr.FreezeBreathCtrl.SkillTime;
                        towerPtr.FreezeBreathProgressOffset = 0;
                        towerPtr.PlayFreezeBreathEffect(true);
                        towerPtr.FreezeBreathCtrl.ReleaseCount = 1;
                        towerPtr.FreezeBreathCtrl.PlayFreezeEffect(waveLineID);
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
                    }
                }
                else
                {
                    inFreezeBreath -= Time.deltaTime;
                    int time = Mathf.FloorToInt(towerPtr.FreezeBreathCtrl.EffectTime / (towerPtr.FreezeBreathCtrl.DamageCount - 1) * 10);
                    int interval = Mathf.FloorToInt(inFreezeBreath * 10);
                    int offset = Mathf.FloorToInt(towerPtr.FreezeBreathCtrl.SkillTime * 10) - Mathf.FloorToInt(towerPtr.FreezeBreathCtrl.EffectTime * 10);
                    if (inFreezeBreath <= FreezeBreath.EffectTime / 2 && towerPtr.FreezeBreathCtrl.ReleaseCount != 2)
                    if (interval == time * (towerPtr.FreezeBreathCtrl.DamageCount - towerPtr.FreezeBreathCtrl.ReleaseCount - 1) + offset && towerPtr.FreezeBreathCtrl.ReleaseCount < towerPtr.FreezeBreathCtrl.DamageCount)
                    {
                        towerPtr.FreezeBreathCtrl.ReleaseCount = 2;
                        ++towerPtr.FreezeBreathCtrl.ReleaseCount;
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
                        return;
                    }
                    if (inFreezeBreath <= 0)
@@ -436,8 +535,6 @@
                        freezeBreathCallTime = 0;
                        towerPtr.FreezeBreathCtrl.SetProgress(0);
                        towerPtr.PlayFreezeBreathEffect(false);
                        towerPtr.FreezeBreathCtrl.ReleaseCount = 3;
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
                    }
                }
            }
@@ -452,11 +549,13 @@
            {
                if (fireState)
                {
                    myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
                    towerPtr.PlayEnergyEffect(true);
                }
            }
            // 如果在木属性蓄力期间,让瞄准动画播放
            if (towerPtr && towerPtr.IsWoodCharge && woodAimAgent != null)
                woodAimAgent.PlayWoodAimEffect();
        }
        /// <summary>
@@ -479,7 +578,8 @@
        public float GetFireDuration()
        {
            DecreaseTowerAttackCD endlessBuff = (DecreaseTowerAttackCD)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseTowerAttackCD);
            return endlessBuff.GetDecreaseCD(towerPtr.attributeId, 1 / projectileFireRate);
            return endlessBuff != null ? endlessBuff.GetDecreaseCD(towerPtr.attributeId, 1 / projectileFireRate) : 1 / projectileFireRate;
        }
        /// <summary>
@@ -487,7 +587,7 @@
        /// </summary>
        protected virtual void Update()
        {
            if (m_Launcher == null) return;
            if (m_Launcher == null || towerPtr != null && !towerPtr.CanAttack) return;
            // 处理当前Affector所在Tower对应的技能
            updateTowerSkillData();
@@ -507,7 +607,9 @@
                if (towerPtr && towerPtr.bulletCtl != null)
                {
                    int bnum = towerPtr.bulletCtl.GetCtlProgress();
                    if (bnum == 0) return;
                    // 蓄力时间内不攻击
                    if (bnum == 0 || woodRemainChargeTime > 0f) return;
                }
                if (towerPtr && towerPtr.FreezeBreathCtrl != null)
@@ -534,8 +636,10 @@
            if (m_TrackingEnemy == null || fillBulletTime > 0) return;
            go.GetComponent<Damager>().IsEnhancedBullet = false;
            // 处理子弹充能相关的内容
            if (towerPtr && (towerPtr.bulletCtl != null))
            if (towerPtr && towerPtr.bulletCtl != null)
            {
                int bnum = towerPtr.bulletCtl.decBullet();
                // 暴击子弹的数量,如果获得相应buff可能会修改暴击子弹数量
@@ -544,7 +648,8 @@
                if (bnum < critBulletNum)
                {
                    if (bnum == 0)
                        fillBulletTime = 2.0f;
                        // 不需要装填时间
                        fillBulletTime = 0.1f;
                    //这里需要替换特效
                    var poolable = Core.Utilities.Poolable.TryGetPoolable<Core.Utilities.Poolable>(woodProjectile_SP);
@@ -552,12 +657,22 @@
                    Damager tmpDamager = go.GetComponent<Damager>();
                    tmpDamager.damageMulti = 10.0f;
                    tmpDamager.damage = damagerProjectile.damage;
                    tmpDamager.IsEnhancedBullet = true;
                }
            }
            else
            {
                if (towerPtr)
                    towerPtr.setTowerState(true);
                // 下一颗子弹是强化子弹,然后直接蓄力
                if (bnum - 1 >= 0 && bnum - 1 < critBulletNum)
                {
                    woodRemainChargeTime = woodChargeTime;
                    towerPtr.IsWoodCharge = true;
                    DecreaseWoodChargeTime decreaseWoodChargeTime = (DecreaseWoodChargeTime)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseWoodChargeTime);
                    if (decreaseWoodChargeTime != null)
                        woodRemainChargeTime = decreaseWoodChargeTime.GetWoodChargeTime(woodChargeTime);
                    woodChargeEffectTime = woodRemainChargeTime + 0.5f / towerLevel.ActionAnimator.speed;
                    WoodChargeEffect.Play();
                }
            }
            if (isMultiAttack)
@@ -575,11 +690,11 @@
                        AudioSourceManager.Ins.Play(audioEnum);
                }
            }
            if (randomAudioSource != null)
            {
                if (Targetter.bSearchTarget)
                    randomAudioSource.PlayRandomClip();
            }
            // if (randomAudioSource != null)
            // {
            //     if (Targetter.bSearchTarget)
            //         randomAudioSource.PlayRandomClip();
            // }
        }
        /// <summary>