chenxin
2020-11-14 62b2779db75575bebd80ffac74fc3f25b5b994fa
Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
@@ -56,6 +56,80 @@
        protected bool bScaleForCombat = false;
        /// <summary>
        /// 未上阵的形象
        /// </summary>
        public GameObject Body;
        /// <summary>
        /// 上阵形象
        /// </summary>
        public GameObject AttackBody;
        /// <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;
        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>
        protected Affector[] Affectors
@@ -149,6 +223,39 @@
            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()
        {
            if (ActionAnimator.isActiveAndEnabled)
            {
                AnimatorStateInfo stateInfo = ActionAnimator.GetCurrentAnimatorStateInfo(0);
                if (ActionState == TowerActionState.Attack && stateInfo.normalizedTime >= 1f)
                    ChangeState(TowerActionState.Standing);
            }
        }
        /// <summary>
@@ -346,11 +453,14 @@
        }
        /// <summary>
        /// Insntiate the build particle effect object
        /// 设置上阵和非上阵状态下,塔的自身形象
        /// </summary>
        void Start()
        /// <param name="isAttackMode"></param>
        public void SetAttackState(bool isAttackMode)
        {
            Body.SetActive(!isAttackMode);
            AttackBody.SetActive(isAttackMode);
            ActionAnimator.enabled = isAttackMode;
        }
        /// <summary>