diff options
Diffstat (limited to 'Erika/Assets/Scripts/Unit/Components')
8 files changed, 281 insertions, 11 deletions
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs index 180f3914..be5abe3f 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs @@ -225,7 +225,7 @@ public class UnitMotion : UnitComponent #endregion - public override void OnUpdate() + public override void OnUpdate() { base.OnUpdate(); // 执行事件 @@ -317,12 +317,22 @@ public class UnitMotion : UnitComponent return m_MotionData.GetMotionDataByAnimationType(type); } - /// <summary> - /// 是否有某个类型的动作,用于gameplay逻辑 - /// </summary> - /// <param name="type"></param> - /// <returns></returns> - public bool HasAnimationType(EAnimationType type) + /// <summary> + /// 用逻辑类型拿motion数据,返回所有符合type的motion + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public List<MotionData> GetMotionDatasByAnimationType(EAnimationType type) + { + return m_MotionData.GetMotionDatasByAnimationType(type); + } + + /// <summary> + /// 是否有某个类型的动作,用于gameplay逻辑 + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public bool HasAnimationType(EAnimationType type) { return m_MotionData.HasMotionAnimationType(type); } @@ -469,6 +479,8 @@ public class UnitMotion : UnitComponent if (!overrideAnim) return; + ClearAllTriggers(); + if (transition != null) { if (transition.type == TransitionData.TransitionType.NormalizedTime) @@ -498,6 +510,7 @@ public class UnitMotion : UnitComponent { if (!m_MotionData.HasMotionAnimationType(animType)) return; + MotionData motion = m_MotionData.GetMotionDataByAnimationType(animType); PlayMotion(motion); } @@ -523,6 +536,8 @@ public class UnitMotion : UnitComponent if (!overrideAnim) return; + ClearAllTriggers(); + m_Animator.Play(stateName); currentMotionID = motion.uid; @@ -536,4 +551,16 @@ public class UnitMotion : UnitComponent #endregion + #region Animator + + public void ForceUpdateAnimator() + { + float speed = m_Animator.speed; + m_Animator.speed = 0; + m_Animator.Update(0); + m_Animator.speed = speed; + } + + #endregion + } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs index d988e35d..e7763708 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs @@ -20,7 +20,7 @@ namespace UnitStates.Common { if(m_Owner.isInAir) { - m_Owner.unitStatemachine.ChangeState(EUnitState.Landing); + //m_Owner.unitStatemachine.ChangeState(EUnitState.Landing); } else { 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 diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs.meta b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs.meta new file mode 100644 index 00000000..c497eadd --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15387bacd93d1e6488881a2cfd33dac9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs index 27a51f74..128010d7 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs @@ -12,17 +12,28 @@ namespace UnitStates.Common { } + public bool useCrossfade; + public override void ModifyNextState(EUnitState state, UnitStateBase nextState) { } public override void OnEnter(IStateParam param) { - m_Motion.Trigger(EAnimationType.Move); + if (useCrossfade) + { + MotionData motion = m_Motion.GetMotionDataByAnimationType(EAnimationType.Move); + m_Motion.CrossFade(motion.uid, motion.extraData.crossfadeNormalizedTransitionDuration, motion.extraData.crossfadeNormalizedTimeOffset); + } + else + { + m_Motion.Trigger(EAnimationType.Move); + } } public override void OnExit() { + useCrossfade = false; } public override void OnFixedUpdate() diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs new file mode 100644 index 00000000..8138ec04 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnitStates.Common +{ + + public class TurnState : UnitStateBase + { + public override void ModifyNextState(EUnitState state, UnitStateBase nextState) + { + } + + public override void OnEnter(IStateParam param) + { + } + + public override void OnExit() + { + } + + public override void OnFixedUpdate() + { + } + + public override void OnUpdate() + { + } + } + +}
\ No newline at end of file diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs.meta b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs.meta new file mode 100644 index 00000000..a02b0c15 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 02d65e2e75169e547bfbe77207dd3159 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs index c97d0390..09aa407f 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs @@ -41,7 +41,8 @@ public enum EUnitState // Unit State Preset HitAir2 = 1 << 25, Knockdown2 = 1 << 26, - Landing = 1 << 27, + Jump = 1 << 27, + Turn = 1 << 28, // 转身 _MAX_, } @@ -202,7 +203,12 @@ public sealed class UnitStatemachine : UnitComponent public bool IsMoveAble() { - if (IsInState(EUnitState.Skill)) + if (IsInState(EUnitState.Jump) && owner.isGrounding) + { + return owner.unitMotion.IsToggleOpen(EAnimationToogle.SkillLink); + } + + if (!IsInState(EUnitState.Idle)) return false; return true; @@ -237,6 +243,16 @@ public sealed class UnitStatemachine : UnitComponent ChangeState(EUnitState.Move); } + public void EnterJump() + { + if (IsInState(EUnitState.Jump) && !owner.isGrounding) + return; + + UnitStates.Common.JumpState.Param param = new UnitStates.Common.JumpState.Param(); + param.process = UnitStates.Common.JumpState.EProcess.Jump_Rising; + ChangeState(EUnitState.Jump, param, true); + } + #endregion } |