From 4a083f2f3d8baf1c2630b3717d62904edcc8e24a Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Sat, 14 Nov 2020 10:32:27 +0800
Subject: [PATCH] 修改小怪,精灵塔改成2D Sprite

---
 Assets/Scripts/TowerDefense/Towers/TowerLevel.cs |  116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 113 insertions(+), 3 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Towers/TowerLevel.cs b/Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
index 55ac9ee..389b80e 100644
--- a/Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
+++ b/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>

--
Gitblit v1.9.1