From 8834c57999ce2e9d88262d5e7d2f31b65eaf3477 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 27 Oct 2020 09:08:54 +0800 Subject: =?UTF-8?q?*=E8=B7=B3=E8=B7=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/AbilitySystem/Abilities/JumpAbility.cs | 184 +++++++++++---------- 1 file changed, 99 insertions(+), 85 deletions(-) (limited to 'Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs') diff --git a/Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs b/Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs index b6615516..e0f73efa 100644 --- a/Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs +++ b/Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs @@ -62,6 +62,9 @@ public class JumpAbility : AbilityBase int m_CurAnim; State m_CurState; + int m_CurUpMotion; + int m_CurDownMotion; + Vector3 m_CurInitVelocity; private List m_Triggers = new List(); @@ -87,93 +90,99 @@ public class JumpAbility : AbilityBase { m_Dir = dir; } - + public override void OnEnter() { base.OnEnter(); m_CurAnim = 0; - OnUpdate(); - } + + switch(m_Dir) + { + case Direction.Neutral: + m_CurUpMotion = m_AnimJumpNeutralUpwards; + m_CurDownMotion = m_AnimJumpNeutralDownwards; + m_CurInitVelocity = new Vector3(0, m_NeutralJumpSpeedY, 0); + break; + case Direction.Forward: + m_CurUpMotion = m_AnimJumpFwdUpwards; + m_CurDownMotion = m_AnimJumpFwdDownwards; + m_CurInitVelocity = new Vector3(m_FowardJumpSpeedX, m_NeutralJumpSpeedY, 0); + break; + case Direction.Backward: + m_CurUpMotion = m_AnimJumpBackUpwards; + m_CurDownMotion = m_AnimJumpBackDownwards; + m_CurInitVelocity = new Vector3(m_BackwardJumpSpeedX, m_NeutralJumpSpeedY, 0); + break; + } + + bool isOnGround = m_Collider.IsOnGround; + bool isUp = m_Body.Velocity.y > 0; + bool isDown = m_Body.Velocity.y < 0; + bool isFreeFall = Mathf.Approximately(m_Body.Velocity.y, 0); + + if (isOnGround) + m_CurState = State.Ready; + else if (isUp) + m_CurState = State.Up; + else if (isDown || isFreeFall) + m_CurState = State.Down; + } public override void OnUpdate() { - - AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0); - - bool onGround = m_Collider.IsOnGround; - - float fadeDuration = 0.2f; - - if (onGround && m_CurAnim == m_AnimJumpNeutralDownwards && m_CurAnim != m_AnimJumpEnd) - { - m_Animator.CrossFade(m_AnimJumpEnd, 0); - m_CurAnim = m_AnimJumpEnd; - } - - foreach (var abilityTrigger in m_Triggers) - { - if (abilityTrigger.Update() && abilityTrigger.Swallow) - return ; - } - - if(onGround && m_CurAnim != m_AnimJumpStart && m_CurAnim != m_AnimJumpEnd) - { - m_Animator.CrossFade(m_AnimJumpStart, 0.1f); - m_CurAnim = m_AnimJumpStart; - return; - } - - if(onGround && m_CurAnim == m_AnimJumpStart && state.normalizedTime >= 1f) - { - if (m_Dir == Direction.Neutral) - m_Body.LocalVelocity = new Vector3(0, m_NeutralJumpSpeedY,0); - else if(m_Dir == Direction.Forward) - m_Body.LocalVelocity = new Vector3(m_FowardJumpSpeedX, m_NeutralJumpSpeedY, 0); - else if(m_Dir == Direction.Backward) - m_Body.LocalVelocity = new Vector3(m_BackwardJumpSpeedX, m_NeutralJumpSpeedY, 0); - } - - bool neutral = Mathf.Approximately(m_Body.LocalVelocity.x, 0); - //bool forward = m_Body.LocalVelocity.x > 0; - //bool backward = m_Body.LocalVelocity.x < 0; - bool forward = m_Dir == Direction.Forward; - bool backward = m_Dir == Direction.Backward; - - bool upward = m_Body.LocalVelocity.y > 0; - bool downward = m_Body.LocalVelocity.y < 0; - - if (neutral && upward && m_CurAnim != m_AnimJumpNeutralUpwards) - { - m_Animator.CrossFade(m_AnimJumpNeutralUpwards, fadeDuration); - m_CurAnim = m_AnimJumpNeutralUpwards; - } - else if (forward && upward && m_CurAnim != m_AnimJumpFwdUpwards) - { - m_Animator.CrossFade(m_AnimJumpFwdUpwards, fadeDuration); - m_CurAnim = m_AnimJumpFwdUpwards; - } - else if (backward && upward && m_CurAnim != m_AnimJumpBackUpwards) - { - m_Animator.CrossFade(m_AnimJumpBackUpwards, fadeDuration); - m_CurAnim = m_AnimJumpBackUpwards; - } - else if (neutral && downward && m_CurAnim != m_AnimJumpNeutralDownwards) - { - m_Animator.CrossFade(m_AnimJumpNeutralDownwards, fadeDuration); - m_CurAnim = m_AnimJumpNeutralDownwards; - } - else if (forward && downward && m_CurAnim != m_AnimJumpFwdDownwards) - { - m_Animator.CrossFade(m_AnimJumpFwdDownwards, fadeDuration); - m_CurAnim = m_AnimJumpFwdDownwards; - } - else if (backward && downward && m_CurAnim != m_AnimJumpBackDownwards) - { - m_Animator.CrossFade(m_AnimJumpBackDownwards, fadeDuration); - m_CurAnim = m_AnimJumpBackDownwards; - } - + foreach (var abilityTrigger in m_Triggers) + { + if (abilityTrigger.Update() && abilityTrigger.Swallow) + return; + } + + AnimatorStateInfo motionInfo = m_Animator.GetCurrentAnimatorStateInfo(0); + + switch (m_CurState) + { + case State.Ready: + if(m_CurAnim != m_AnimJumpStart) + { + m_Animator.CrossFade(m_AnimJumpStart, 0.2f); + m_CurAnim = m_AnimJumpStart; + } + if(motionInfo.shortNameHash == m_AnimJumpStart && motionInfo.normalizedTime >= 1f) + { + m_Body.LocalVelocity = m_CurInitVelocity; + m_CurState = State.Up; + } + break; + case State.Up: + if(m_CurAnim != m_CurUpMotion) + { + m_Animator.CrossFade(m_CurUpMotion, 0.2f); + m_CurAnim = m_CurUpMotion; + } + if(m_Body.Velocity.y <= 0) + { + m_CurState = State.Down; + } + break; + case State.Down: + if(m_CurAnim != m_CurDownMotion) + { + m_Animator.CrossFade(m_CurDownMotion, 0.2f); + m_CurAnim = m_CurDownMotion; + } + if(m_Collider.IsOnGround) + { + m_CurState = State.End; + } + break; + case State.End: + if(m_CurAnim != m_AnimJumpEnd) + { + m_Animator.CrossFade(m_AnimJumpEnd, 0.2f); + m_CurAnim = m_AnimJumpEnd; + } + break; + } } public override void OnLateUpdate() @@ -198,16 +207,12 @@ public class JumpAbility : AbilityBase } /// - /// 着地 + /// 结束 /// /// public bool IsJumpDone() { - bool onGround = m_Collider.IsOnGround; - if (!onGround) - return false; - - if (m_CurAnim == m_AnimJumpEnd) + if (m_CurState == State.End) { AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0); return state.shortNameHash == m_AnimJumpEnd && state.normalizedTime >= 1f; @@ -216,6 +221,15 @@ public class JumpAbility : AbilityBase return false; } + /// + /// 着地 + /// + /// + public bool IsJumpGround() + { + return m_CurState == State.End && m_Collider.IsOnGround; + } + public void AddTrigger(Trigger trigger) { if (trigger == null || m_Triggers.Contains(trigger)) -- cgit v1.1-26-g67d0