summaryrefslogtreecommitdiff
path: root/Erika/Assets/Scripts/Unit/Components
diff options
context:
space:
mode:
Diffstat (limited to 'Erika/Assets/Scripts/Unit/Components')
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs41
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs2
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs163
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/JumpState.cs.meta11
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs13
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs31
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs.meta11
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs20
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
}