chenxin
2020-11-19 998ebc0dc00c103b365e36797c1a1ac4a6a2afa5
Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
@@ -115,20 +115,6 @@
        /// </summary>
        protected float[] actionTimeArr;
        public void ChangeState(TowerActionState state)
        {
            if (state == ActionState) return;
            ActionState = state;
            if (state == TowerActionState.Attack)
                ActionAnimator.speed = attackSpeed * FireSpeed;
            else if (state == TowerActionState.Standing)
                ActionAnimator.speed = 1f;
            ActionAnimator.SetInteger(paramName, (int)state);
        }
        /// <summary>
        /// Gets the list of effects attached to the tower
        /// </summary>
@@ -209,8 +195,18 @@
            {
                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;
@@ -223,39 +219,63 @@
            mat = transform.Find("Cube");
            myRender = mat.GetComponent<MeshRenderer>();
            normalScale = new Vector3(1.5f, 1.5f, 1.5f);
            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);
        }
        private void LateUpdate()
        private void Start()
        {
            if (ActionAnimator.isActiveAndEnabled)
            if (ActionAnimator != null)
            {
                AnimatorStateInfo stateInfo = ActionAnimator.GetCurrentAnimatorStateInfo(0);
                AnimationClip[] clips = ActionAnimator.runtimeAnimatorController.animationClips;
                actionTimeArr = new float[clips.Length];
                if (ActionState == TowerActionState.Attack && stateInfo.normalizedTime >= 1f)
                    ChangeState(TowerActionState.Standing);
                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);
        }
        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>
@@ -424,7 +444,7 @@
                var attack = affector as AttackAffector;
                if (attack != null && attack.damagerProjectile != null)
                {
                    dps += attack.GetProjectileDamage() * attack.fireRate;
                    dps += attack.GetProjectileDamage() * attack.FireRate;
                }
            }
            return dps;
@@ -458,9 +478,16 @@
        /// <param name="isAttackMode"></param>
        public void SetAttackState(bool isAttackMode)
        {
            Body.SetActive(!isAttackMode);
            AttackBody.SetActive(isAttackMode);
            ActionAnimator.enabled = isAttackMode;
            if (isAttackMode)
            {
                AttackBody.SetActive(isAttackMode);
                Body.SetActive(!isAttackMode);
                ChangeState(TowerActionState.Attack);
            }
            else
            {
                ChangeState(TowerActionState.Standing);
            }
        }
        /// <summary>