| | |
| | | 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 |
| | |
| | | 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> |
| | |
| | | } |
| | | |
| | | /// <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> |