CoderM
2020-12-10 bd0ba263761a866ca0d698169d2d83b6a11c35e7
Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
@@ -1,11 +1,10 @@
using System.Collections.Generic;
using ActionGameFramework.Health;
using Core.Health;
using KTGMGemClient;
using TowerDefense.Affectors;
using TowerDefense.Towers.Data;
using TowerDefense.UI.HUD;
using UnityEngine;
using TMPro;
namespace TowerDefense.Towers
{
@@ -21,39 +20,19 @@
        public TowerPlacementGhost towerGhostPrefab;
        /// <summary>
        /// Build effect gameObject to instantiate on start
        /// </summary>
        //public GameObject buildEffectPrefab;
        /// <summary>
        /// 升级特效
        /// </summary>
        public GameObject UpgradeEffectPrefab;
        /// <summary>
        /// 当前的Level对应的DamagerData.
        /// </summary>
        public Damager levelDamager;
        /// <summary>
        /// Reference to scriptable object with level data on it
        /// </summary>
        public TowerLevelData levelData;
        /// <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 +45,11 @@
        public GameObject AttackBody;
        /// <summary>
        /// 可以放置的材质
        /// </summary>
        public MeshRenderer canPlaceMesh;
        /// <summary>
        /// 精灵塔动作状态
        /// </summary>
        public TowerActionState ActionState { get; protected set; }
@@ -76,6 +60,13 @@
        /// 动作动画器
        /// </summary>
        public Animator ActionAnimator;
        public TextMeshPro LevelText;
        /// <summary>
        /// 精灵初始配置数据
        /// </summary>
        public elf_info ElfInfo { get; protected set; }
        /// <summary>
        /// 发射子弹速率
@@ -91,6 +82,9 @@
        /// 多倍速攻击速度,基准速度的 N 倍速
        /// </summary>
        private float fireSpeed = 1f;
        [SerializeField]
        private SpriteRenderer levelBorder;
        /// <summary>
        /// 发射倍速,如果设置多倍速攻击,直接修改此属性,恢复之前的攻速直接设置为 1
@@ -136,55 +130,6 @@
        public LayerMask mask { get; protected set; }
        /// <summary>
        /// Gets the cost value
        /// </summary>
        public int cost
        {
            get { return levelData.cost; }
        }
        /// <summary>
        /// Gets the sell value
        /// </summary>
        public int sell
        {
            get { return levelData.sell; }
        }
        /// <summary>
        /// Gets the max health
        /// </summary>
        public int maxHealth
        {
            get { return levelData.maxHealth; }
        }
        /// <summary>
        /// Gets the starting health
        /// </summary>
        public int startingHealth
        {
            get { return levelData.startingHealth; }
        }
        /// <summary>
        /// Gets the tower description
        /// </summary>
        public string description
        {
            get { return levelData.description; }
        }
        /// <summary>
        /// Gets the tower description
        /// </summary>
        public string upgradeDescription
        {
            get { return levelData.upgradeDescription; }
        }
        /// <summary>
        /// Initialises the Effects attached to this object
        /// </summary>
        public virtual void Initialize(Tower tower, LayerMask enemyMask, IAlignmentProvider alignment)
@@ -196,29 +141,35 @@
                effect.Initialize(alignment, mask);
                effect.towerPtr = tower;
                AttackAffector attackAffector = effect.GetComponent<AttackAffector>();
                if (attackAffector.projectile != null)
                {
                    Damager damager = attackAffector.projectile.gameObject.GetComponent<Damager>();
                    damager.TowerAttributeId = tower.attributeId;
                }
            }
            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);
        }
        private Transform mat;
        private MeshRenderer myRender;
        /// <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 normalScale;
            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;
        }
        private void Awake()
        {
            mat = transform.Find("Cube");
            myRender = mat.GetComponent<MeshRenderer>();
            normalScale = new Vector3(1.5f, 1.5f, 1.5f);
            canPlaceMesh.enabled = false;
        }
        private void Start()
@@ -236,9 +187,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)
                {
@@ -249,6 +198,19 @@
            }
        }
        /// <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()
        {
            if (ActionAnimator == null || !ActionAnimator.isActiveAndEnabled) return;
@@ -257,6 +219,16 @@
            if (ActionState == TowerActionState.Attack && stateInfo.normalizedTime >= 1f)
                ChangeState(TowerActionState.Standing);
        }
        /// <summary>
        /// 设置可以放置
        /// </summary>
        /// <param name="isOn"></param>
        public void SetCanPlace(bool isOn)
        {
            if (canPlaceMesh.enabled != isOn)
                canPlaceMesh.enabled = isOn;
        }
        public void ChangeState(TowerActionState state)
@@ -279,126 +251,6 @@
        }
        /// <summary>
        /// 未上阵塔缩放,固定缩放
        /// </summary>
        public void NormalScale()
        {
            mat.localScale = normalScale;
            mat.localPosition = Vector3.zero;
        }
        private bool isAttack;
        /// <summary>
        /// 设置火宝石攻速
        /// </summary>
        /// <param name="isAttack"></param>
        public void SetFireMatSpeed(bool isFast)
        {
            if (isFast && isAttack)
            {
                myRender.material.SetFloat("_Speed", 40);
            }
            else
            {
                //还原10
                myRender.material.SetFloat("_Speed", 8);
            }
        }
        /// <summary>
        /// 上阵塔缩放
        /// </summary>
        public void ResetScale()
        {
            if (transform.name.StartsWith("GrowUpTower"))
            {
                //火元素
                mat.localScale = GameConfig.fireScale;
                mat.localPosition = GameConfig.fireOffectp;
            }
            else if (transform.name.StartsWith("BlinkTower"))
            {
                //木元素
                mat.localScale = GameConfig.woodScale;
                mat.localPosition = GameConfig.woodOffectp;
            }
            else if (transform.name.StartsWith("CopyCatTower"))
            {
                //水元素
                //mat.localScale = woodScale;
                Vector3 scale = mat.localScale;
                if (!this.bScaleForCombat)
                {
                    scale.z *= 1.267f;
                    mat.localScale = scale;
                    Vector3 pos = mat.localPosition;
                    pos.z -= 0.2f;
                    mat.localPosition = pos;
                    bScaleForCombat = true;
                }
            }
        }
        /// <summary>
        /// 当前的TowerLevel设置为对应怪物的材质显示
        /// </summary>
        /// <param name="mat"></param>
        public void SetTowerMonsterMat(Material material, bool isAttack)
        {
            if (material == null) return;
            this.isAttack = isAttack;
            myRender.material = material;
            if (isAttack)
            {
                if (transform.name.StartsWith("GrowUpTower") || transform.name.StartsWith("BlinkTower"))
                {
                    float t = Mathf.Floor(Time.time);
                    float offect = t % 8;
                    myRender.material.SetFloat("_ChangeTime", Mathf.Floor(Time.time - offect));
                }
            }
            else
            {
                myRender.material.SetFloat("_ChangeTime", Mathf.Floor(Time.time));
            }
            //Debug.Log("当前时间Time.time:"+Time.time);
            // if (transform.name.StartsWith("GrowUpTower") && mat.localPosition != fireOffectp)
            // {
            //     mat.localPosition = fireOffectp;
            // }
            // else if (transform.name.StartsWith("BlinkTower") && mat.localPosition != woodOffectp)
            // {
            //     //木元素
            //     mat.localPosition = woodOffectp;
            // }
            // // 查找子结点:
            // foreach (Transform t in transform.GetComponentsInChildren<Transform>())
            // {
            //     if (t.name == "Cube")
            //     {
            //         t.GetComponent<MeshRenderer>().material = mat;
            //         //Vector3 scale = t.localScale;
            //         // if (!this.bScaleForCombat)
            //         // {
            //         //     scale.z *= 1.267f;
            //         //     t.localScale = scale;
            //         //     Vector3 pos = t.localPosition;
            //         //     pos.z -= 0.2f;
            //         //     t.localPosition = pos;
            //         //     bScaleForCombat = true;
            //         // }
            //     }
            // }
        }
        /// <summary>
        /// A method for activating or deactivating the attached <see cref="Affectors"/>
        /// </summary>
        public void SetAffectorState(bool state, int waveline)
@@ -412,7 +264,6 @@
                }
            }
        }
        /// <summary>
        /// Returns a list of affectors that implement ITowerRadiusVisualizer
@@ -432,38 +283,19 @@
            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()
        {
        }
        /// <summary>
        /// 获取当前TowerLevel对应的AttackRise.
        /// </summary>
        public float attackRise { get { return m_ParentTower.attackRise; } }
        /// /// </summary>
        public float attackRise { get { return ParentTower.attackRise; } }
        public void OnAfterDeserialize()
        {