summaryrefslogtreecommitdiff
path: root/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs')
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs163
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