chenxin
2020-11-27 841b66ef416a727a0c798ad2263b098247cb4aa7
Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using ActionGameFramework.Health;
using Core.Health;
using KTGMGemClient;
using TowerDefense.Affectors;
using TowerDefense.Towers.Data;
using TowerDefense.UI.HUD;
@@ -22,7 +23,7 @@
        /// <summary>
        /// Build effect gameObject to instantiate on start
        /// </summary>
        public GameObject buildEffectPrefab;
        //public GameObject buildEffectPrefab;
        /// <summary>
        /// 升级特效
@@ -53,6 +54,71 @@
        /// TEST CODE: 是否已经缩放.
        /// </summary>
        protected bool bScaleForCombat = false;
        /// <summary>
        /// 未上阵的形象
        /// </summary>
        public GameObject Body;
        /// <summary>
        /// 上阵形象
        /// </summary>
        public GameObject AttackBody;
        /// <summary>
        /// 可以放置的材质
        /// </summary>
        public MeshRenderer canPlaceMesh;
        /// <summary>
        /// 精灵塔动作状态
        /// </summary>
        public TowerActionState ActionState { get; protected set; }
        private string paramName = "ActionState";
        /// <summary>
        /// 动作动画器
        /// </summary>
        public Animator ActionAnimator;
        /// <summary>
        /// 发射子弹速率
        /// </summary>
        protected float fireRate;
        /// <summary>
        /// 初始攻击速率
        /// </summary>
        private float attackSpeed = 1f;
        /// <summary>
        /// 多倍速攻击速度,基准速度的 N 倍速
        /// </summary>
        private float fireSpeed = 1f;
        /// <summary>
        /// 发射倍速,如果设置多倍速攻击,直接修改此属性,恢复之前的攻速直接设置为 1
        /// </summary>
        /// <value></value>
        public float FireSpeed
        {
            get { return fireSpeed; }
            set
            {
                if (value < 0) value = 0;
                fireSpeed = value;
                if (ActionState == TowerActionState.Attack)
                    ActionAnimator.speed = attackSpeed * fireSpeed;
            }
        }
        /// <summary>
        /// 各个动作的基准播放时长(播放一遍用的时间)
        /// </summary>
        protected float[] actionTimeArr;
        /// <summary>
        /// Gets the list of effects attached to the tower
@@ -134,25 +200,98 @@
            {
                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);
        }
        private Transform mat;
        private MeshRenderer myRender;
        Vector3 normalScale;
        private Vector3 fireScale = new Vector3(1.92f, 1.92f, 2.208f);
        private Vector3 woodScale = new Vector3(1.5f, 1.5f, 2.82f);
        private Vector3 waterScale = new Vector3(1.0f, 1.0f, 1.88f);
        private Vector3 fireOffectp = new Vector3(0f, 0f, -0.15f);
        private Vector3 woodOffectp = new Vector3(0.08f, 0f, 0.2f);
        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()
        {
            if (ActionAnimator != null)
            {
                AnimationClip[] clips = ActionAnimator.runtimeAnimatorController.animationClips;
                actionTimeArr = new float[clips.Length];
                for (int i = 0; i < clips.Length; ++i)
                {
                    if (clips[i].name == "Standing")
                        actionTimeArr[0] = clips[i].length;
                    else if (clips[i].name == "Attack")
                        actionTimeArr[1] = clips[i].length;
                }
                GameObject affectorObj = transform.Find("Affector").gameObject;
                AttackAffector attackAffector = affectorObj.GetComponent<AttackAffector>();
                fireRate = attackAffector.FireRate;
                if (actionTimeArr[1] > 1 / fireRate)
                {
                    // 动画时间比攻击长
                    attackSpeed = actionTimeArr[1] * fireRate;
                }
                SetAttackState(false);
            }
        }
        public void LateUpdate()
        {
            if (ActionAnimator == null || !ActionAnimator.isActiveAndEnabled) return;
            AnimatorStateInfo stateInfo = ActionAnimator.GetCurrentAnimatorStateInfo(0);
            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)
        {
            if (ActionAnimator == null || !ActionAnimator.isActiveAndEnabled) return;
            ActionState = state;
            if (ActionState == TowerActionState.Attack && state == TowerActionState.Attack)
            {
                ActionAnimator.Update(0);
                ActionAnimator.Play("Attack", 0, 0);
            }
            ActionAnimator.SetInteger(paramName, (int)state);
            if (state == TowerActionState.Attack)
                ActionAnimator.speed = attackSpeed * FireSpeed;
            else if (state == TowerActionState.Standing)
                ActionAnimator.speed = 1f;
        }
        /// <summary>
@@ -164,21 +303,21 @@
            mat.localPosition = Vector3.zero;
        }
        private bool isAttack;
        /// <summary>
        /// 设置火宝石攻速
        /// </summary>
        /// <param name="isAttack"></param>
        public void SetFireMatSpeed(bool isFast)
        {
            if (isFast)
            if (isFast && isAttack)
            {
                mat.GetComponent<MeshRenderer>().material.SetFloat("_Speed", 40);
                myRender.material.SetFloat("_Speed", 40);
            }
            else
            {
                //还原10
                mat.GetComponent<MeshRenderer>().material.SetFloat("_Speed", 8);
                myRender.material.SetFloat("_Speed", 8);
            }
        }
        /// <summary>
@@ -189,14 +328,14 @@
            if (transform.name.StartsWith("GrowUpTower"))
            {
                //火元素
                mat.localScale = fireScale;
                mat.localPosition = fireOffectp;
                mat.localScale = GameConfig.fireScale;
                mat.localPosition = GameConfig.fireOffectp;
            }
            else if (transform.name.StartsWith("BlinkTower"))
            {
                //木元素
                mat.localScale = woodScale;
                mat.localPosition = woodOffectp;
                mat.localScale = GameConfig.woodScale;
                mat.localPosition = GameConfig.woodOffectp;
            }
            else if (transform.name.StartsWith("CopyCatTower"))
@@ -223,12 +362,28 @@
        /// 当前的TowerLevel设置为对应怪物的材质显示
        /// </summary>
        /// <param name="mat"></param>
        public void SetTowerMonsterMat(Material material)
        public void SetTowerMonsterMat(Material material, bool isAttack)
        {
            if (material == null) return;
            mat.GetComponent<MeshRenderer>().material = material;
            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;
@@ -305,7 +460,7 @@
                var attack = affector as AttackAffector;
                if (attack != null && attack.damagerProjectile != null)
                {
                    dps += attack.GetProjectileDamage() * attack.fireRate;
                    dps += attack.GetProjectileDamage() * attack.FireRate;
                }
            }
            return dps;
@@ -334,11 +489,21 @@
        }
        /// <summary>
        /// Insntiate the build particle effect object
        /// 设置上阵和非上阵状态下,塔的自身形象
        /// </summary>
        void Start()
        /// <param name="isAttackMode"></param>
        public void SetAttackState(bool isAttackMode)
        {
            if (isAttackMode)
            {
                AttackBody.SetActive(isAttackMode);
                Body.SetActive(!isAttackMode);
                ChangeState(TowerActionState.Attack);
            }
            else
            {
                ChangeState(TowerActionState.Standing);
            }
        }
        /// <summary>