diff options
Diffstat (limited to 'Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs')
-rw-r--r-- | Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs new file mode 100644 index 00000000..a5f3bc36 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs @@ -0,0 +1,163 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnitStates.Common +{ + + public class JumpState : UnitStateBase + { + // 跳跃的子步骤 + // 4: Rising-> Loop-> Landing-> Ground + // 3: Rising-> Loop-> (Landing+Ground) + // 2: (Rising+Loop+Landing)-> Ground + // 2: (Rising+Loop)-> (Landing+Ground) + public enum EProcess + { + None = 0, + + Jump_Rising = 1, // 上升 + Jump_Loop = 2, // 滞空 + Jump_Landing = 3, // 下降 + Jump_Ground = 4, // 着陆 + } + + private EProcess m_Process; + private Coroutine m_coProcess; + + private float m_XSpeed; + + public struct Param : IStateParam + { + public EProcess process; // + public float height; // 跳跃高度 + public float inAirTime; // 滞空时间长度 + } + + public override void ModifyNextState(EUnitState state, UnitStateBase nextState) + { + if(state == EUnitState.Move) + { + (nextState as MoveState).useCrossfade = true; + } + } + + public override void OnEnter(IStateParam obj) + { + Param param = (Param)obj; + + m_Process = param.process; + + GoToProcess(m_Process); + + m_Owner.isGrounding = false; + } + + public override void OnExit() + { + if (m_coProcess != null) + { + fsm.StopCoroutine(m_coProcess); + } + m_Process = EProcess.None; + m_XSpeed = 0; + } + + public override void OnFixedUpdate() + { + } + + public override void OnUpdate() + { + if(m_Process != EProcess.Jump_Ground) + { + EUnitDirection unitDir = InputManager.Instance.inputDir; + if (unitDir != EUnitDirection.None) + { + m_XSpeed = unitDir == EUnitDirection.Right ? 10f : -10f; + } + m_Owner.unitCharacterController.Move(new Vector3(m_XSpeed,0,0) * Time.deltaTime); + if(m_XSpeed != 0) + { + m_XSpeed = Mathf.Lerp(m_XSpeed, 0, 0.005f); + } + } + } + + void GoToProcess(EProcess nextProcess) + { + if (m_coProcess != null) + { + fsm.StopCoroutine(m_coProcess); + } + m_Process = nextProcess; + IEnumerator coroutine = null; + switch (m_Process) + { + case EProcess.None: + break; + case EProcess.Jump_Rising: + coroutine = Jump_Rising(); + break; + case EProcess.Jump_Loop: + coroutine = Jump_Loop(); + break; + case EProcess.Jump_Landing: + coroutine = Jump_Landing(); + break; + case EProcess.Jump_Ground: + coroutine = Jump_Ground(); + break; + default: + break; + } + m_coProcess = fsm.StartCoroutine(coroutine); + } + + IEnumerator Jump_Rising() + { + MotionData motion = m_Owner.unitMotion.GetMotionDataByAnimationType(EAnimationType.Jump_Rising); + m_Owner.unitMotion.CrossFade(motion.uid, motion.extraData.crossfadeNormalizedTransitionDuration, motion.extraData.crossfadeNormalizedTimeOffset); + yield return null; // Animator.Update()一次 + //m_Owner.unitMotion.ForceUpdateAnimator(); + while (m_Owner.unitMotion.IsCurrent(motion.uid) && !m_Owner.unitMotion.IsReachEnd()) + { + yield return null; + } + Vector3 pos = m_Owner.transform.position; + m_Owner.unitCharacterController.Move(new Vector3(0, -pos.y, 0)); + GoToProcess(EProcess.Jump_Ground); + } + + IEnumerator Jump_Loop() + { + while (true) + { + yield return null; + } + } + + IEnumerator Jump_Landing() + { + while (true) + { + yield return null; + } + } + + IEnumerator Jump_Ground() + { + MotionData motion = m_Owner.unitMotion.GetMotionDataByAnimationType(EAnimationType.Jump_Ground); + m_Owner.unitMotion.CrossFade(motion.uid, motion.extraData.crossfadeNormalizedTransitionDuration, motion.extraData.crossfadeNormalizedTimeOffset); + yield return null;// Animator.Update()一次 + //m_Owner.unitMotion.ForceUpdateAnimator(); + m_Owner.isGrounding = true; + while (m_Owner.unitMotion.IsCurrent(motion.uid) && !m_Owner.unitMotion.IsReachEnd()) + { + yield return null; + } + ChangeState(EUnitState.Idle); + } + } + +}
\ No newline at end of file |