diff options
author | chai <215380520@qq.com> | 2022-11-19 20:58:42 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2022-11-19 20:58:42 +0800 |
commit | 245c7bbdb2ec568e9afddccf8c410d6b48d1719c (patch) | |
tree | 19a6b23ed42eca7f5f43ed4796377a8c68368ada /Erika/Assets/Scripts/Unit | |
parent | ab8d63b62466e29d7d2ab0e73c1d3c528c739f03 (diff) |
* misc
Diffstat (limited to 'Erika/Assets/Scripts/Unit')
11 files changed, 109 insertions, 35 deletions
diff --git a/Erika/Assets/Scripts/Unit/AnimationType.cs b/Erika/Assets/Scripts/Unit/AnimationType.cs index b497fdbf..077231cf 100644 --- a/Erika/Assets/Scripts/Unit/AnimationType.cs +++ b/Erika/Assets/Scripts/Unit/AnimationType.cs @@ -23,6 +23,8 @@ public enum EAnimationType Jump_Landing = 7, // 下落 Jump_Ground = 8, // 着陆 + Turn = 10, + /// <summary> /// 受击 /// </summary> diff --git a/Erika/Assets/Scripts/Unit/AnimatorState.cs b/Erika/Assets/Scripts/Unit/AnimatorState.cs index 8bb8a002..d18c9129 100644 --- a/Erika/Assets/Scripts/Unit/AnimatorState.cs +++ b/Erika/Assets/Scripts/Unit/AnimatorState.cs @@ -8,26 +8,32 @@ using UnityEngine; /// </summary> public enum EAnimatorState { + //!不要修改顺序!!! + // locomotion __Localmotion = 1, - Idle, - Move, - Jump, - Landing, + Idle = 2, + Move = 3 , + Jump = 4, + Landing = 5, + Turn = 6, + Rising = 7, + Loop = 8, + Grounding = 9, // 技能 __Skill = 40, - Attack, - QTE, + Attack = 41, + QTE = 42, // 技能combo __Combo = 80, - Attack0, - Attack1, - Attack2, - Attack3, - Attack4, - Attack5, + Attack0 = 81, + Attack1 = 82, + Attack2 = 83, + Attack3 = 84, + Attack4 = 85, + Attack5 = 86, // 终结技分段 __Special = 120, diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs index be5abe3f..b211dc41 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs @@ -57,6 +57,16 @@ public class UnitMotion : UnitComponent } } + // 当前动作数据 + public MotionData currentMotionData + { + get + { + var motionData = m_MotionData.GetMotionDataById(currentMotionID); + return motionData; + } + } + private bool m_Dirty = true; /// <summary> @@ -104,6 +114,7 @@ public class UnitMotion : UnitComponent } } + // 播放时间,没有clamped public float playbackNormalizedTime { get @@ -213,13 +224,18 @@ public class UnitMotion : UnitComponent public bool IsReachEnd(bool bCheckLoop = false) { bool playbackEnd = playbackNormalizedTime >= 1f; + bool hasEndToggle = IsToggleOpen(EAnimationToogle.ReachEnd); + if(hasEndToggle) + { + Debug.Log(animationData.animationPath); + } if (isCurrentLooping) { - return playbackEnd && bCheckLoop; + return (hasEndToggle || playbackEnd) && bCheckLoop; } else { - return playbackEnd; + return playbackEnd || hasEndToggle; } } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs index 951945e3..efd21ed4 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs @@ -100,7 +100,8 @@ public partial class PCState : UnitState //else // m_Owner.transform.rotation = Quaternion.Euler(0, 180, 0); //m_Owner.transform.rotation = Quaternion.Euler(0, param.isRight ? 0 : 180, 0); - m_Owner.Turn(param.isRight); + EUnitDirection dir = param.isRight ? EUnitDirection.Right : EUnitDirection.Left;
+ m_Owner.DirectTurn(dir); } //if (Input.GetKey(param.key)) //m_Owner.pcAnimation.AnimMove(); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs index 8138ec04..769e8fda 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs @@ -7,12 +7,29 @@ namespace UnitStates.Common public class TurnState : UnitStateBase { + public struct Param : IStateParam + { + public EUnitDirection direction; + } + + private EUnitDirection dir; + private MotionData motion; + public override void ModifyNextState(EUnitState state, UnitStateBase nextState) { + if (state == EUnitState.Move) + { + (nextState as MoveState).useCrossfade = true; + } } public override void OnEnter(IStateParam param) { + Param p = (Param)param; + dir = p.direction; + + motion = unitMotion.GetMotionDataByAnimationType(EAnimationType.Turn); + unitMotion.Trigger(motion.uid); } public override void OnExit() @@ -25,6 +42,14 @@ namespace UnitStates.Common public override void OnUpdate() { + if(unitMotion.IsCurrent(motion.uid)) + { + if(unitMotion.IsReachEnd()) + { + m_Owner.DirectTurn(dir); + ChangeState(EUnitState.Idle); + } + } } } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs index 09aa407f..fdaf2979 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs @@ -201,6 +201,11 @@ public sealed class UnitStatemachine : UnitComponent return m_CurrentState == EUnitState.Move; } + public bool IsIdle() + { + return m_CurrentState == EUnitState.Idle; + } + public bool IsMoveAble() { if (IsInState(EUnitState.Jump) && owner.isGrounding) @@ -208,6 +213,9 @@ public sealed class UnitStatemachine : UnitComponent return owner.unitMotion.IsToggleOpen(EAnimationToogle.SkillLink); } + if (IsInState(EUnitState.Turn) && owner.unitMotion.IsReachEnd()) + return true; + if (!IsInState(EUnitState.Idle)) return false; diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController.cs b/Erika/Assets/Scripts/Unit/Controller/PCController.cs index 8f5e9153..cff0aa34 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController.cs @@ -40,6 +40,7 @@ public sealed partial class PCController : UnitController fsm.AddState(EUnitState.Move, new UnitStates.Common.MoveState());
fsm.AddState(EUnitState.Skill, new UnitStates.Common.SkillState());
fsm.AddState(EUnitState.Jump, new UnitStates.Common.JumpState());
+ fsm.AddState(EUnitState.Turn, new UnitStates.Common.TurnState());
fsm.ChangeState(EUnitState.Idle, null);
}
diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs b/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs index 85b9abe4..84eb6f10 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs @@ -6,17 +6,25 @@ using UnityEngine; // -> InputManager.InputXXX() // -> PCController.CommandXXX() +// 直接控制逻辑的脚本 public sealed partial class PCController : UnitController { - // 连击池 - private int m_CurrentCombo = 0; - private List<int> m_AttackPool = new List<int>(); - private int m_CurrentComboIndex = 0; - - public void CommandTurn (EUnitDirection dir) + public void CommandTurn(EUnitDirection dir) { - Turn(dir == EUnitDirection.Right); + if(unitStatemachine.IsIdle() && bodyDirection != dir) + { + UnitStates.Common.TurnState.Param turn = new UnitStates.Common.TurnState.Param(); + turn.direction = dir; + unitStatemachine.ChangeState(EUnitState.Turn, turn); + } + else if(unitStatemachine.IsInState(EUnitState.Turn)) + { + } + else if(!unitStatemachine.IsInState(EUnitState.Turn)) + { + DirectTurn(dir); + } } public void CommandMove(EUnitDirection dir) diff --git a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs index cec9dd41..3ea8bff8 100644 --- a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs @@ -66,22 +66,18 @@ public class UnitController : MonoBehaviour/*, Interactable*/ #endregion
#region 位置
- // 朝向
- public Quaternion faceRotation
- {
- get
- {
- return transform.rotation;
- }
- }
+
+ public EUnitDirection bodyDirection { get { return m_Direction; } }
+ private EUnitDirection m_Direction = EUnitDirection.Right; // 朝向
// 是否朝向右边
public bool isTowardRight
{
get
{
- return transform.rotation.eulerAngles.y == 0;
- }
+ return m_Direction == EUnitDirection.Right;
+ //return transform.rotation.eulerAngles.y == 0;
+ }
}
// 朝向因子,默认为右
@@ -334,11 +330,12 @@ public class UnitController : MonoBehaviour/*, Interactable*/ }
/// <summary>
- /// 设置朝向
+ /// 直接设置朝向
/// </summary>
/// <param name="faceRight">朝右</param>
- public void Turn(bool faceRight)
+ public void DirectTurn(EUnitDirection dir)
{
+ bool faceRight = dir == EUnitDirection.Right;
float eularY = base.transform.eulerAngles.y;
eularY = (faceRight ? 0f : 180f);
Vector3 newRot = new Vector3(base.transform.eulerAngles.x, eularY, base.transform.eulerAngles.z);
@@ -346,6 +343,7 @@ public class UnitController : MonoBehaviour/*, Interactable*/ {
base.transform.eulerAngles = newRot;
}
+ m_Direction = dir;
}
#endregion
diff --git a/Erika/Assets/Scripts/Unit/UnitMotionData.cs b/Erika/Assets/Scripts/Unit/UnitMotionData.cs index 2bcdf97d..52987550 100644 --- a/Erika/Assets/Scripts/Unit/UnitMotionData.cs +++ b/Erika/Assets/Scripts/Unit/UnitMotionData.cs @@ -9,6 +9,7 @@ public class MotionExtraData { [SerializeField] public float crossfadeNormalizedTransitionDuration; // crossfade时的过渡时间 [SerializeField] public float crossfadeNormalizedTimeOffset; // crossfade时的时间偏移(0-1)区间 + [SerializeField] public bool applyRootRotation; // 是否使用animator的deltaRotation,默认不使用 } /// <summary> diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs index 1888ae1a..3a590905 100644 --- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs @@ -131,7 +131,15 @@ public class UnitRootMotion : UnitComponent //if((m_Owner.position + dest).y > 0)
// {
m_Owner.unitCharacterController.Move(dest);
- //}
+ //}
+
+ if(m_Owner.unitMotion.currentMotionData.extraData.applyRootRotation)
+ {
+ Quaternion rot = m_Owner.unitMotion.animator.deltaRotation;
+ Quaternion rotation = m_Owner.transform.rotation;
+ rotation *= rot;
+ m_Owner.transform.rotation = rotation;
+ }
}
}
|