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