summaryrefslogtreecommitdiff
path: root/Erika/Assets/Scripts/Unit
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2022-11-19 20:58:42 +0800
committerchai <215380520@qq.com>2022-11-19 20:58:42 +0800
commit245c7bbdb2ec568e9afddccf8c410d6b48d1719c (patch)
tree19a6b23ed42eca7f5f43ed4796377a8c68368ada /Erika/Assets/Scripts/Unit
parentab8d63b62466e29d7d2ab0e73c1d3c528c739f03 (diff)
* misc
Diffstat (limited to 'Erika/Assets/Scripts/Unit')
-rw-r--r--Erika/Assets/Scripts/Unit/AnimationType.cs2
-rw-r--r--Erika/Assets/Scripts/Unit/AnimatorState.cs30
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs20
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs3
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/TurnState.cs25
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs8
-rw-r--r--Erika/Assets/Scripts/Unit/Controller/PCController.cs1
-rw-r--r--Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs22
-rw-r--r--Erika/Assets/Scripts/Unit/Controller/UnitController.cs22
-rw-r--r--Erika/Assets/Scripts/Unit/UnitMotionData.cs1
-rw-r--r--Erika/Assets/Scripts/Unit/UnitRootMotion.cs10
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;
+ }
}
}