//升级动画 IEnumerator PlayUpgradeAnim() { for (var i = 0; i < 10; i++) { //TimeScalse == 0 的时候,使用realtime来做协程 yield return(new WaitForSecondsRealtime(0.1f)); //使用调色板来做动画 GetComponent <SpriteRenderer>().material.SetInt("_CurrentPalette", i % 2 == 0 ? 1 : 5); } GetComponent <SpriteRenderer>().material.SetInt("_CurrentPalette", 1); Time.timeScale = 1; m_status = m_lastStatus; EnableInput(); }
//攻击动画不能只用关键帧来结束 ,因为可能在攻击动画未结束的时候切换状态,所以在攻击开始的时候,调用这个协程来关闭攻击动画 IEnumerator AttackOver(SimonStatus simonStatus) { string animName = "Idle"; switch (simonStatus) { case SimonStatus.MeleeAttack: animName = m_whip.m_animString; break; case SimonStatus.SquatMeleeAttack: animName = m_whip.m_animStringSquat; break; case SimonStatus.SubWeaponAttack: animName = "ShootSubWeapon"; break; } yield return(new WaitForEndOfFrame()); //获取动画长度 float time = m_anim.GetAnimationClip(animName).length; yield return(new WaitForSeconds(time)); if (!IsOnHit()) { switch (simonStatus) { case SimonStatus.MeleeAttack: ChangeState(SimonStatus.Idle); break; case SimonStatus.SquatMeleeAttack: ChangeState(SimonStatus.Squat); break; case SimonStatus.SubWeaponAttack: ChangeState(SimonStatus.Idle); break; } } }
//切换状态 void ChangeState(SimonStatus state) { if (m_status != state) { m_lastStatus = m_status; m_status = state; } else { return; } //Debug.Log("SwitchStatus:" + state); switch (state) { case SimonStatus.JumpUp0: m_anim.Play("Idle"); ActiveCollider(SimonColliderType.Default); break; case SimonStatus.JumpUp1: ActiveCollider(SimonColliderType.Squat); m_anim.Play("Squat"); break; case SimonStatus.Squat: ActiveCollider(SimonColliderType.Squat); m_anim.Play("Squat"); break; case SimonStatus.JumpFall0: ActiveCollider(SimonColliderType.Squat); break; case SimonStatus.JumpFall1: m_anim.Play("Idle"); ActiveCollider(SimonColliderType.Default); break; case SimonStatus.Walk: m_anim.Play("Walk"); ActiveCollider(SimonColliderType.Default); break; case SimonStatus.Idle: m_anim.Play("Idle"); if (CheckGrounded()) { StopX(); } ActiveCollider(SimonColliderType.Default); break; case SimonStatus.MeleeAttack: m_anim.Play(m_whip.m_animString); ActiveCollider(SimonColliderType.Default); StartCoroutine(AttackOver(state)); break; case SimonStatus.SquatMeleeAttack: m_anim.Play(m_whip.m_animStringSquat); ActiveCollider(SimonColliderType.Squat); StartCoroutine(AttackOver(state)); break; case SimonStatus.OnHit0: m_anim.Play("Onhit"); ActiveCollider(SimonColliderType.OnHit); m_whip.ActiveCollider(false); DisableInput(); //No Input After OnHit OnDmgAction(); new EnumTimer(() => { ChangeState(SimonStatus.OnHit1); }, 0.1f).StartTimeout(this); break; case SimonStatus.OnHit1: break; case SimonStatus.OnHit2: m_anim.Play("Squat"); ActiveCollider(SimonColliderType.Squat); StopX(); new EnumTimer(() => { if (m_isDead) { ChangeState(SimonStatus.Dead); } else { ChangeState(SimonStatus.Idle); EnableInput(); } }, m_onHit1Time).StartTimeout(this); break; case SimonStatus.Dead: m_anim.Play("Die"); transform.localPosition = new Vector3(transform.localPosition.x, transform.localPosition.y - 8); Destroy(m_rigidbody); new EnumTimer(() => { OnDied?.Invoke(m_diedDamage); }, 2f).StartTimeout(this); break; case SimonStatus.SubWeaponAttack: m_anim.Play("ShootSubWeapon"); ActiveCollider(SimonColliderType.Default); StartCoroutine(AttackOver(state)); break; case SimonStatus.Upgrade: UpgradeAnim(); break; } }