From 841b66ef416a727a0c798ad2263b098247cb4aa7 Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Fri, 27 Nov 2020 12:00:16 +0800
Subject: [PATCH] buff预览暂停

---
 Assets/Scripts/TowerDefense/Towers/TowerLevel.cs |  211 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 188 insertions(+), 23 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Towers/TowerLevel.cs b/Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
index 6dbdd2b..35b5bcc 100644
--- a/Assets/Scripts/TowerDefense/Towers/TowerLevel.cs
+++ b/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>

--
Gitblit v1.9.1