diff options
Diffstat (limited to 'Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs')
-rw-r--r-- | Assets/Scripts/AbilitySystem/Abilities/JumpAbility.cs | 184 |
1 files changed, 99 insertions, 85 deletions
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<Trigger> m_Triggers = new List<Trigger>();
@@ -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 }
/// <summary>
- /// 着地
+ /// 结束
/// </summary>
/// <returns></returns>
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;
}
+ /// <summary>
+ /// 着地
+ /// </summary>
+ /// <returns></returns>
+ public bool IsJumpGround()
+ {
+ return m_CurState == State.End && m_Collider.IsOnGround;
+ }
+
public void AddTrigger(Trigger trigger)
{
if (trigger == null || m_Triggers.Contains(trigger))
|