From 3ff709247a18476b484a5a0446ee47f1b68de05c Mon Sep 17 00:00:00 2001 From: chenxin <chenxin6991@163.com> Date: Tue, 24 Nov 2020 18:08:10 +0800 Subject: [PATCH] 新增buff 玉米精灵蓄力时间减少 玉米精灵强化子弹蓄力,瞄准 修复了购买按钮文字显示出错问题 --- Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 158 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs index efd9efd..8794fc0 100644 --- a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs +++ b/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 { @@ -143,6 +145,32 @@ /// </summary> /// <value></value> 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 GameObject WoodChargeEffect; + + private GameObject woodChargeEffect; + + public Transform WoodChargeTransform; + + /// <summary> + /// 木属性正在瞄准的Agent + /// </summary> + protected Agent woodAimAgent; /// <summary> /// 火精灵攻击最终攻击倍速,里面计算了buff增加的倍速 @@ -308,6 +336,22 @@ // 处理木精灵装填子弹 private void HandleBullet() { + if (woodRemainChargeTime > 0f) + woodRemainChargeTime -= Time.deltaTime; + + if (woodChargeEffectTime > 0f) + { + woodChargeEffectTime -= Time.deltaTime; + UpdateWoodAim(); + + if (woodChargeEffectTime <= 0 && woodChargeEffect != null) + { + CancelWoodAim(); + Destroy(woodChargeEffect); + woodChargeEffect = null; + } + } + // 预留出来装填子弹的时间. if (fillBulletTime > 0) { @@ -323,6 +367,95 @@ fillBulletTime = 0; } } + } + + /// <summary> + /// 更新木属性瞄准 + /// </summary> + private void UpdateWoodAim() + { + // 离得最近的 Agent + Agent agent = GetMinDistanceAgent(); + + if (agent != null) + { + // 还没有瞄准目标,直接分配 + if (woodAimAgent == null) + { + woodAimAgent = agent; + + if (agent.WoodAimCount == 0) + agent.WoodAimEffect.Play(); + + ++agent.WoodAimCount; + } + // 有小怪走到之前瞄准目标的前面 或者 之前瞄准的目标死亡,切换瞄准目标 + else if (woodAimAgent.Id != agent.Id) + { + if (woodAimAgent.WoodAimCount > 0) + { + --woodAimAgent.WoodAimCount; + + if (woodAimAgent.WoodAimCount == 0) + { + woodAimAgent.WoodAimEffect.Stop(); + woodAimAgent.WoodAimEffect.Clear(); + } + } + + if (agent.WoodAimCount == 0) + agent.WoodAimEffect.Play(); + + ++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> + /// 取消木属性瞄准 + /// </summary> + private void CancelWoodAim() + { + if (woodAimAgent != null && woodAimAgent.WoodAimCount > 0) + { + --woodAimAgent.WoodAimCount; + + if (woodAimAgent.WoodAimCount == 0) + { + woodAimAgent.WoodAimEffect.Stop(); + woodAimAgent.WoodAimEffect.Clear(); + } + } + + woodAimAgent = null; } // 处理火精灵充能 @@ -504,7 +637,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) @@ -531,8 +666,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可能会修改暴击子弹数量 @@ -541,7 +678,8 @@ if (bnum < critBulletNum) { if (bnum == 0) - fillBulletTime = 2.0f; + // 不需要装填时间 + fillBulletTime = 0.1f; //这里需要替换特效 var poolable = Core.Utilities.Poolable.TryGetPoolable<Core.Utilities.Poolable>(woodProjectile_SP); @@ -549,6 +687,23 @@ Damager tmpDamager = go.GetComponent<Damager>(); tmpDamager.damageMulti = 10.0f; tmpDamager.damage = damagerProjectile.damage; + tmpDamager.IsEnhancedBullet = true; + } + + // 下一颗子弹是强化子弹,然后直接蓄力 + if (bnum - 1 >= 0 && bnum - 1 < critBulletNum) + { + woodRemainChargeTime = woodChargeTime; + DecreaseWoodChargeTime decreaseWoodChargeTime = (DecreaseWoodChargeTime)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseWoodChargeTime); + + if (decreaseWoodChargeTime != null) + woodRemainChargeTime = decreaseWoodChargeTime.GetWoodChargeTime(woodChargeTime); + + woodChargeEffectTime = woodRemainChargeTime + 0.5f / towerLevel.ActionAnimator.speed; + woodChargeEffect = Instantiate(WoodChargeEffect); + woodChargeEffect.transform.SetPositionAndRotation(WoodChargeTransform.position, WoodChargeTransform.rotation); + ParticleSystem ps = woodChargeEffect.transform.GetChild(0).GetComponent<ParticleSystem>(); + ps.Play(); } } else -- Gitblit v1.9.1