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