wangguan
2020-12-08 3d13f2e8a23602aedb8adf5d2d02e377a330a61b
Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
@@ -2,9 +2,9 @@
using Core.Health;
using KTGMGemClient;
using TowerDefense.Affectors;
using TowerDefense.Towers.Data;
using TowerDefense.UI.HUD;
using UnityEngine;
using TMPro;
namespace TowerDefense.Towers
{
@@ -27,17 +27,12 @@
        /// <summary>
        /// The parent tower controller of this tower
        /// </summary>
        protected Tower m_ParentTower;
        public Tower ParentTower { get; protected set; }
        /// <summary>
        /// The list of effects attached to the tower
        /// </summary>
        Affector[] m_Affectors;
        /// <summary>
        /// TEST CODE: 是否已经缩放.
        /// </summary>
        protected bool bScaleForCombat = false;
        /// <summary>
        /// 未上阵的形象
@@ -66,6 +61,13 @@
        /// </summary>
        public Animator ActionAnimator;
        public TextMeshPro LevelText;
        /// <summary>
        /// 精灵初始配置数据
        /// </summary>
        public elf_info ElfInfo { get; protected set; }
        /// <summary>
        /// 发射子弹速率
        /// </summary>
@@ -80,6 +82,9 @@
        /// 多倍速攻击速度,基准速度的 N 倍速
        /// </summary>
        private float fireSpeed = 1f;
        [SerializeField]
        private SpriteRenderer levelBorder;
        /// <summary>
        /// 发射倍速,如果设置多倍速攻击,直接修改此属性,恢复之前的攻速直接设置为 1
@@ -137,10 +142,40 @@
                effect.towerPtr = tower;
                AttackAffector attackAffector = effect.GetComponent<AttackAffector>();
            }
            m_ParentTower = tower;
            Transform starTs = transform.Find("Star");
            starTs.localPosition = new Vector3(0, 0.2f, 0.6f);
            starTs.localRotation = Quaternion.Euler(60, 180, 0);
            ParentTower = tower;
            ElfInfo = ElfInfoData.GetDataById(tower.ElfId);
        }
        /// <summary>
        /// 设置显示等级
        /// </summary>
        /// <param name="level">从1开始</param>
        public void SetShowLevel(int level)
        {
            elf_upgrade info = ElfUpgradeData.GetDataById(level);
            LevelText.text = $"{level}";
            levelBorder.sprite = Resources.Load<Sprite>($"UI/TowerLevel/{info.rank_img}");
            Vector3 pos = levelBorder.transform.localPosition;
            if (info.rank_img < 3)
                pos.z = ParentTower.ElfId == 201 ? 0.542f : 0.645f;
            else
                pos.z = ParentTower.ElfId == 201 ? 0.497f : 0.594f;
            levelBorder.transform.localPosition = pos;
        }
        /// <summary>
        /// 设置缩放
        /// </summary>
        /// <param name="level">从1开始</param>
        public void SetScale(int level)
        {
            elf_upgrade info = ElfUpgradeData.GetDataById(level);
            //Debug.Log($"level:{level}  设置了缩放:{info.zoom}");
            transform.localScale = Vector3.one * info.zoom;
        }
        private void Awake()
@@ -163,9 +198,7 @@
                        actionTimeArr[1] = clips[i].length;
                }
                GameObject affectorObj = transform.Find("Affector").gameObject;
                AttackAffector attackAffector = affectorObj.GetComponent<AttackAffector>();
                fireRate = attackAffector.FireRate;
                fireRate = GetFireRate();
                if (actionTimeArr[1] > 1 / fireRate)
                {
@@ -174,6 +207,19 @@
                }
                SetAttackState(false);
            }
        }
        /// <summary>
        /// 获取发射速率
        /// </summary>
        /// <returns></returns>
        public float GetFireRate()
        {
            DecreaseTowerAttackCD endlessBuff = (DecreaseTowerAttackCD)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseTowerAttackCD);
            float fireRate = endlessBuff != null ? endlessBuff.GetDecreaseCD(ParentTower.ElfId, 1 / ElfInfo.b_atkf) : 1 / ElfInfo.b_atkf;
            // 限制最大速度为 每0.1s发射一次
            return Mathf.Max(fireRate, 0.1f);
        }
        public void LateUpdate()
@@ -195,7 +241,7 @@
            if (canPlaceMesh.enabled != isOn)
                canPlaceMesh.enabled = isOn;
        }
        public void ChangeState(TowerActionState state)
        {
            if (ActionAnimator == null || !ActionAnimator.isActiveAndEnabled) return;
@@ -248,27 +294,9 @@
            return visualizers;
        }
        /// <summary>
        /// Returns the dps of the tower
        /// </summary>
        /// <returns>The dps of the tower</returns>
        public float GetTowerDps()
        {
            float dps = 0;
            foreach (Affector affector in Affectors)
            {
                var attack = affector as AttackAffector;
                if (attack != null && attack.damagerProjectile != null)
                {
                    dps += attack.GetProjectileDamage() * attack.FireRate;
                }
            }
            return dps;
        }
        public void Kill()
        {
            m_ParentTower.KillTower();
            ParentTower.KillTower();
        }
        public void OnBeforeSerialize()
@@ -278,7 +306,7 @@
        /// <summary>
        /// 获取当前TowerLevel对应的AttackRise.
        /// /// </summary>
        public float attackRise { get { return m_ParentTower.attackRise; } }
        public float attackRise { get { return ParentTower.attackRise; } }
        public void OnAfterDeserialize()
        {