From e24e8b29b8f77a5a5507a429e5aad76aaa834be9 Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Tue, 15 Nov 2022 20:26:14 +0800 Subject: * animation --- .../Bundle/Scenes/Demo/AnimationEditScene.unity | 13 ++++ .../Erika_AnimatorController.controller | 2 +- Erika/Assets/Scripts/Input/InputKeyboardMouse.cs | 19 +++++ .../Scripts/Input/InputKeyboardMouse.cs.meta | 11 +++ Erika/Assets/Scripts/Input/InputManager.cs | 86 ++-------------------- Erika/Assets/Scripts/Managers/UnitManager.cs | 3 +- Erika/Assets/Scripts/Test2/TestInput.cs | 2 +- .../Unit/Components/UnitAnimation/UnitMotion.cs | 37 ++++++---- .../Unit/Components/UnitState/Erika/PCState.cs | 20 ++--- .../Components/UnitState/Erika/PCState_States.cs | 54 +++++++------- .../UnitStatemachine/Common/IdleState.cs | 2 +- .../UnitStatemachine/Common/MoveState.cs | 36 +++++++++ .../UnitStatemachine/Common/MoveState.cs.meta | 11 +++ .../Assets/Scripts/Unit/Controller/PCController.cs | 9 +-- .../Unit/Controller/PCController_Commands.cs | 6 ++ Erika/Assets/Scripts/Unit/UnitRootMotion.cs | 10 ++- 16 files changed, 180 insertions(+), 141 deletions(-) create mode 100644 Erika/Assets/Scripts/Input/InputKeyboardMouse.cs create mode 100644 Erika/Assets/Scripts/Input/InputKeyboardMouse.cs.meta create mode 100644 Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs create mode 100644 Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs.meta diff --git a/Erika/Assets/Bundle/Scenes/Demo/AnimationEditScene.unity b/Erika/Assets/Bundle/Scenes/Demo/AnimationEditScene.unity index 42c3083a..aa010edf 100644 --- a/Erika/Assets/Bundle/Scenes/Demo/AnimationEditScene.unity +++ b/Erika/Assets/Bundle/Scenes/Demo/AnimationEditScene.unity @@ -123,6 +123,7 @@ GameObject: - component: {fileID: 152403862} - component: {fileID: 152403861} - component: {fileID: 152403863} + - component: {fileID: 152403864} m_Layer: 0 m_Name: InputManager m_TagString: Untagged @@ -168,6 +169,18 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 78d3bc54e34721e468d0541fb5c0c839, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!114 &152403864 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 152403860} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0524ad309fb60ba4cae5f63a6f5c1bb3, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &203878585 GameObject: m_ObjectHideFlags: 0 diff --git a/Erika/Assets/Bundle/Unit/PC/Erika/AnimatorController/Erika_AnimatorController.controller b/Erika/Assets/Bundle/Unit/PC/Erika/AnimatorController/Erika_AnimatorController.controller index e25ffbd8..4b8fcdfb 100644 --- a/Erika/Assets/Bundle/Unit/PC/Erika/AnimatorController/Erika_AnimatorController.controller +++ b/Erika/Assets/Bundle/Unit/PC/Erika/AnimatorController/Erika_AnimatorController.controller @@ -856,7 +856,7 @@ AnimatorState: m_MirrorParameterActive: 0 m_CycleOffsetParameterActive: 0 m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: 599f2b26128dfd742b4aefbc285c4d3e, type: 2} + m_Motion: {fileID: 0} m_Tag: m_SpeedParameter: m_MirrorParameter: diff --git a/Erika/Assets/Scripts/Input/InputKeyboardMouse.cs b/Erika/Assets/Scripts/Input/InputKeyboardMouse.cs new file mode 100644 index 00000000..ebcb457e --- /dev/null +++ b/Erika/Assets/Scripts/Input/InputKeyboardMouse.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class InputKeyboardMouse : MonoBehaviour +{ + void Update() + { + if (Input.GetButtonDown("Fire1")) + { + PCController.instance.CommandMove(); + } + if (Input.GetButtonDown("Fire2")) + { + PCController.instance.CommandIdle(); + } + + } +} diff --git a/Erika/Assets/Scripts/Input/InputKeyboardMouse.cs.meta b/Erika/Assets/Scripts/Input/InputKeyboardMouse.cs.meta new file mode 100644 index 00000000..3ccc10f4 --- /dev/null +++ b/Erika/Assets/Scripts/Input/InputKeyboardMouse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0524ad309fb60ba4cae5f63a6f5c1bb3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Input/InputManager.cs b/Erika/Assets/Scripts/Input/InputManager.cs index 57bc3399..5403d779 100644 --- a/Erika/Assets/Scripts/Input/InputManager.cs +++ b/Erika/Assets/Scripts/Input/InputManager.cs @@ -2,93 +2,23 @@ using System.Collections.Generic; using UnityEngine; -public struct InputCommand -{ - public KeyCode key; - public float time; -} - -// 处理输入逻辑,不涉及读取输入,只处理逻辑 +/// +/// 只处理逻辑,不涉及输入。逻辑和输入分离 +/// public class InputManager : SingletonMB { - PCController _pc; - - List m_CommandQueue = new List(); - - const float threshold = 3; - - PCController pc - { - get - { - if (_pc == null) - _pc = PCController.instance; - return _pc; - } - } - - public void OnUpdate() - { - foreach (KeyCode vKey in System.Enum.GetValues(typeof(KeyCode))) - { - if (Input.GetKeyDown(vKey)) - { - InputCommand cmd = new InputCommand(); - cmd.key = vKey; - cmd.time = Time.time; - m_CommandQueue.Add(cmd); - } - } - float curTime = Time.time; - int removeCount = 0; - for(int i = 0; i < m_CommandQueue.Count; ++i) - { - if(curTime - m_CommandQueue[i].time > threshold) - { - removeCount++; - } - } - m_CommandQueue.RemoveRange(0, removeCount); - } - - public bool TryCommand(float interval = 0.5f, params KeyCode[] keys) - { - return TryCommand(interval, true, keys); - + public void InputMove() + { } - public bool TryCommand(float interval = 0.5f, bool checkInput = false, params KeyCode[] keys) + public void InputSkill() { - if (keys.Length > m_CommandQueue.Count) - return false; - if (checkInput && !Input.GetKey(keys[keys.Length - 1])) - return false; - int count = m_CommandQueue.Count; - float preTime = m_CommandQueue[count - keys.Length].time; - for (int i = 0; i < keys.Length; ++i) - { - if (keys[i] == m_CommandQueue[i + count - keys.Length].key) - { - if (m_CommandQueue[i + count - keys.Length].time - preTime > interval) - { - return false; - } - preTime = m_CommandQueue[i + count - keys.Length].time; - } - else - { - return false; - } - } - //m_CommandQueue.RemoveRange(count - keys.Length, keys.Length); - m_CommandQueue.Clear(); // 清理 - return true; + } - public void ClearCommand() + public void InputDodge() { - m_CommandQueue.Clear(); } } diff --git a/Erika/Assets/Scripts/Managers/UnitManager.cs b/Erika/Assets/Scripts/Managers/UnitManager.cs index 043e377a..53d25762 100644 --- a/Erika/Assets/Scripts/Managers/UnitManager.cs +++ b/Erika/Assets/Scripts/Managers/UnitManager.cs @@ -73,7 +73,8 @@ public class UnitManager : Singleton // 模型unit model GameObject unitModel = GameObject.Instantiate(profile.unitPrefab); unitModel.transform.SetParent(unitCtrl.transform); - unitModel.transform.ResetTransformation(); + //unitModel.transform.ResetTransformation(); + unitModel.transform.localPosition = Vector3.zero; unitModel.transform.localRotation = Quaternion.Euler(0, 90, 0); // 装配初始化 diff --git a/Erika/Assets/Scripts/Test2/TestInput.cs b/Erika/Assets/Scripts/Test2/TestInput.cs index 1a43f108..5c46886b 100644 --- a/Erika/Assets/Scripts/Test2/TestInput.cs +++ b/Erika/Assets/Scripts/Test2/TestInput.cs @@ -7,7 +7,7 @@ public class TestInput : MonoBehaviour private void Update() { - InputManager.Instance.OnUpdate(); + //InputManager.Instance.OnUpdate(); } } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs index d94a3f44..5836abac 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs @@ -43,7 +43,9 @@ public class UnitMotion : UnitComponent set { m_currentMotionIDID = value; - m_Dirty = true; + + m_AnimationClip = null; + m_Dirty = true; } } @@ -73,16 +75,21 @@ public class UnitMotion : UnitComponent } // 当前动作的动画片段 - public AnimationClip animationClip + private AnimationClip m_AnimationClip; + public AnimationClip animationClip { get { - if(animationData != null) - { - AnimationClip clip = ResourceManager.Instance.LoadAsset(animationData.animationPath); - return clip; - } - return null; + if(m_AnimationClip == null) + { + if (animationData != null) + { + AnimationClip clip = ResourceManager.Instance.LoadAsset(animationData.animationPath); + m_AnimationClip = clip; + return clip; + } + } + return m_AnimationClip; } } @@ -91,9 +98,10 @@ public class UnitMotion : UnitComponent get { AnimatorStateInfo state = stateInfo; - if (!state.loop && state.normalizedTime > 1) - return 1; - return state.normalizedTime % 1f; + //if (!state.loop && state.normalizedTime > 1) // 不知道为啥state.loop不对,始终是false,改用animationClip.isLooping + if(!animationClip.isLooping && state.normalizedTime > 1) + return 1; + return state.normalizedTime % 1f; } } @@ -339,8 +347,11 @@ public class UnitMotion : UnitComponent { if(m_Animator != null) { - m_OverrideController[target] = clip != null ? clip : null; - return true; + if(m_OverrideController[target] != clip) + { + m_OverrideController[target] = clip != null ? clip : null; + } + return true; } return false; } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs index 4a7d489c..e44c7f85 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs @@ -110,16 +110,16 @@ public partial class PCState : UnitState void TryDash() { - if (InputManager.Instance.TryCommand(0.5f, KeyCode.A, KeyCode.A)) - { - TurnLeft(); - ChangeState(EUnitState.AirDash, new AirDashParam(), true); - } - if (InputManager.Instance.TryCommand(0.5f, KeyCode.D, KeyCode.D)) - { - TurnRight(); - ChangeState(EUnitState.AirDash, new AirDashParam(), true); - } + //if (InputManager.Instance.TryCommand(0.5f, KeyCode.A, KeyCode.A)) + //{ + // TurnLeft(); + // ChangeState(EUnitState.AirDash, new AirDashParam(), true); + //} + //if (InputManager.Instance.TryCommand(0.5f, KeyCode.D, KeyCode.D)) + //{ + // TurnRight(); + // ChangeState(EUnitState.AirDash, new AirDashParam(), true); + //} } void TryTurnAround() 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 16a099d7..951945e3 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState_States.cs @@ -176,7 +176,7 @@ public partial class PCState : UnitState { //m_Owner.pcAnimation.AnimAttackToAir(param.offset); yield return null; - InputManager.Instance.ClearCommand(); + //InputManager.Instance.ClearCommand(); while (true) { TryTianyin(); @@ -185,11 +185,11 @@ public partial class PCState : UnitState { TryDash(); - if (InputManager.Instance.TryCommand(0.5f, false, KeyCode.J)) - { - ChangeState(EUnitState.AirAttack, new SkillParam()); - yield break; - } + //if (InputManager.Instance.TryCommand(0.5f, false, KeyCode.J)) + //{ + // ChangeState(EUnitState.AirAttack, new SkillParam()); + // yield break; + //} } if (isAnimationReachEnd || isAnimationReachEndPoint) @@ -215,7 +215,7 @@ public partial class PCState : UnitState int id = 0; //m_Owner.pcAnimation.AnimAirAttack(id++); yield return null; - InputManager.Instance.ClearCommand(); + //InputManager.Instance.ClearCommand(); while (true) { if (TryTeleport()) @@ -228,15 +228,15 @@ public partial class PCState : UnitState { TryDash(); - if (InputManager.Instance.TryCommand(0.3f, false, KeyCode.J)) - { - TryTurnAround(); + //if (InputManager.Instance.TryCommand(0.3f, false, KeyCode.J)) + //{ + // TryTurnAround(); - //m_Owner.pcAnimation.AnimAirAttack(id++); - //id %= total; - ////yield return null; // 等待animator更新 - //yield return new WaitForTransitionDone(m_Owner.pcAnimation); - } + // //m_Owner.pcAnimation.AnimAirAttack(id++); + // //id %= total; + // ////yield return null; // 等待animator更新 + // //yield return new WaitForTransitionDone(m_Owner.pcAnimation); + //} } if (isAnimationReachEnd) @@ -303,18 +303,18 @@ public partial class PCState : UnitState //yield return new WaitForTransitionDone(pcAnimation); while (true) { - if (InputManager.Instance.TryCommand(0.5f, KeyCode.A, KeyCode.A)) - { - TurnLeft(); - ChangeState(EUnitState.AirDash, new AirDashParam()); - yield break; - } - if (InputManager.Instance.TryCommand(0.5f, KeyCode.D, KeyCode.D)) - { - TurnRight(); - ChangeState(EUnitState.AirDash, new AirDashParam()); - yield break; - } + //if (InputManager.Instance.TryCommand(0.5f, KeyCode.A, KeyCode.A)) + //{ + // TurnLeft(); + // ChangeState(EUnitState.AirDash, new AirDashParam()); + // yield break; + //} + //if (InputManager.Instance.TryCommand(0.5f, KeyCode.D, KeyCode.D)) + //{ + // TurnRight(); + // ChangeState(EUnitState.AirDash, new AirDashParam()); + // yield break; + //} if (isAnimationReachEnd) { ChangeState(EUnitState.Landing, new LandingParam()); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs index e477d671..0aab3c51 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs @@ -18,7 +18,7 @@ namespace UnitStates.Common public override void OnEnter(IStateParam param) { - m_Motion.CrossFade(EAnimationType.Idle, 0); + m_Motion.CrossFade(EAnimationType.Idle, 1f); } public override void OnExit() diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs new file mode 100644 index 00000000..6354af59 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +namespace UnitStates.Common +{ + + public class MoveState : UnitStateBase + { + public struct IdleParam : IStateParam + { + } + + public override void ModifyNextState(EUnitState state, UnitStateBase nextState) + { + } + + public override void OnEnter(IStateParam param) + { + m_Motion.CrossFade(EAnimationType.Move, 1f); + } + + public override void OnExit() + { + } + + public override void OnFixedUpdate() + { + } + + public override void OnUpdate() + { + } + } +} diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs.meta b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs.meta new file mode 100644 index 00000000..104d446c --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/MoveState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18b4515f03d0b0d40ba3851fce451a64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController.cs b/Erika/Assets/Scripts/Unit/Controller/PCController.cs index e7c20766..95320912 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController.cs @@ -38,18 +38,11 @@ public sealed partial class PCController : UnitController void InitStatemachine() { fsm.AddState(EUnitState.Idle, new UnitStates.Common.IdleState()); - fsm.AddState(EUnitState.Move, new UnitStates.Common.IdleState()); + fsm.AddState(EUnitState.Move, new UnitStates.Common.MoveState()); fsm.ChangeState(EUnitState.Idle, null); } - public override void Update() - { - base.Update(); - unitAfterImage.OnUpdate(); - unitImageEffect.OnUpdate(); - } - public override void OnGrab() { } diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs b/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs index cf6d31f7..7ec5d30d 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs @@ -7,6 +7,12 @@ public sealed partial class PCController : UnitController public void CommandMove() { + unitStatemachine.ChangeState(EUnitState.Move, null); + } + + public void CommandIdle() + { + unitStatemachine.ChangeState(EUnitState.Idle, null); } public void CommandDodge() diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs index c8df0729..661ecc5e 100644 --- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs @@ -74,9 +74,17 @@ public class UnitRootMotion : UnitComponent public override void OnUpdate() { base.OnUpdate(); + } - public void OnAnimationChange() + public void LateUpdate() + { + m_Owner.unitMotion.animator.transform.localPosition = Vector3.zero; + + //UpdateRootMotion(); + } + + public void OnAnimationChange() { m_PrevAnimationData = null; } -- cgit v1.1-26-g67d0