From c83b9abffe8988f9322a027b7fefd68e7f3fa6ba Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 18 Oct 2020 00:48:13 +0800 Subject: =?UTF-8?q?+dash=20=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbilitySystem/Abilities/AttackAbility.cs | 3 +- .../Scripts/AbilitySystem/Abilities/IdleAbility.cs | 2 +- .../Scripts/AbilitySystem/Abilities/MoveAbility.cs | 2 +- Assets/Scripts/AbilitySystem/AbilitySystem.cs | 17 ++++++- .../AbilitySystem/Actions/ActionWipeCmdRecord.cs | 11 +++++ .../Actions/ActionWipeCmdRecord.cs.meta | 11 +++++ .../Conditions/ConditionCommandSeq.cs | 40 +++++++++++++++-- Assets/Scripts/ApplicationMain.cs | 3 +- Assets/Scripts/GUI.meta | 8 ++++ Assets/Scripts/Input/InputManager.cs | 7 +++ Assets/Scripts/Test/SaionjiScript.cs | 4 +- Assets/Scripts/Test/SaionjiScript_Ability.cs | 52 +++++++++++++++++++--- Assets/Scripts/Test/SaionjiScript_Anim.cs | 6 ++- 13 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs create mode 100644 Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs.meta create mode 100644 Assets/Scripts/GUI.meta (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/AbilitySystem/Abilities/AttackAbility.cs b/Assets/Scripts/AbilitySystem/Abilities/AttackAbility.cs index a3cda9c9..85a5a0a6 100644 --- a/Assets/Scripts/AbilitySystem/Abilities/AttackAbility.cs +++ b/Assets/Scripts/AbilitySystem/Abilities/AttackAbility.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using UnityEngine; +// 单独的一个招式 public class AttackAbility : AbilityBase { Animator m_Animator; @@ -43,7 +44,7 @@ public class AttackAbility : AbilityBase public override void OnEnter() { m_TimeCount = 0; - m_Animator.CrossFade(m_AnimHash, 0f); + m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.25f); } public override void OnExit() diff --git a/Assets/Scripts/AbilitySystem/Abilities/IdleAbility.cs b/Assets/Scripts/AbilitySystem/Abilities/IdleAbility.cs index dfd9478d..0a59419f 100644 --- a/Assets/Scripts/AbilitySystem/Abilities/IdleAbility.cs +++ b/Assets/Scripts/AbilitySystem/Abilities/IdleAbility.cs @@ -23,7 +23,7 @@ public class IdleAbility : AbilityBase public override void OnEnter() { - m_Animator.CrossFade(m_AnimHash, 0.3f); + m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.25f); } public override void OnInit() diff --git a/Assets/Scripts/AbilitySystem/Abilities/MoveAbility.cs b/Assets/Scripts/AbilitySystem/Abilities/MoveAbility.cs index eadee433..139325b6 100644 --- a/Assets/Scripts/AbilitySystem/Abilities/MoveAbility.cs +++ b/Assets/Scripts/AbilitySystem/Abilities/MoveAbility.cs @@ -30,7 +30,7 @@ public class MoveAbility : AbilityBase public override void OnEnter() { - m_Animator.CrossFade(m_AnimHash, 0); + m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.1f); } public override void OnExit() diff --git a/Assets/Scripts/AbilitySystem/AbilitySystem.cs b/Assets/Scripts/AbilitySystem/AbilitySystem.cs index b9b2b9ee..0441e813 100644 --- a/Assets/Scripts/AbilitySystem/AbilitySystem.cs +++ b/Assets/Scripts/AbilitySystem/AbilitySystem.cs @@ -7,10 +7,12 @@ using UnityEngine; /// public class AbilitySystem { + private static List AbilitySystems = new List(); + /// /// 当前执行的ability /// - private AbilityBase m_Currrent; + private AbilityBase m_Currrent; public AbilityBase Current { @@ -22,6 +24,19 @@ public class AbilitySystem private List m_Abilities = new List(); + public AbilitySystem() + { + AbilitySystems.Add(this); + } + + public static void Update() + { + foreach(var systems in AbilitySystems) + { + systems.OnUpdate(); + } + } + public void ForceStart(AbilityBase ability) { if (ability == null) diff --git a/Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs b/Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs new file mode 100644 index 00000000..b3bdd3fa --- /dev/null +++ b/Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ActionWipeCmdRecord : ActionBase +{ + public override void Execute() + { + InputManager.Instance.CommandRecord.Clear(); + } +} \ No newline at end of file diff --git a/Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs.meta b/Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs.meta new file mode 100644 index 00000000..86c5ec59 --- /dev/null +++ b/Assets/Scripts/AbilitySystem/Actions/ActionWipeCmdRecord.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6124291d136fa604bafde35cb10af76b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs b/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs index 8c955400..71a7dbf3 100644 --- a/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs +++ b/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs @@ -7,14 +7,48 @@ using UnityEngine; /// public class ConditionCommandSeq : ConditionBase { + List m_CommandSeq = new List(); + float m_DeltaTime = 0; + List m_LastCmdID = new List(); - public ConditionCommandSeq(List commandSeq, float maxDeltaTime) - { + List id = new List(); + public ConditionCommandSeq(List commandSeq, float maxDeltaTime) + { + m_CommandSeq.AddRange(commandSeq); + m_DeltaTime = maxDeltaTime; } public override bool Evaluate() { - throw new System.NotImplementedException(); + List commandRecord = InputManager.Instance.CommandRecord; + if (commandRecord == null || commandRecord.Count < m_CommandSeq.Count) + return false; + id.Clear(); + for (int i = 1; i < m_CommandSeq.Count; ++i) + { + GamepadButton button = m_CommandSeq[i]; + GamepadButton preButton = m_CommandSeq[i-1]; + int j = commandRecord.Count - m_CommandSeq.Count + i; + Command cmd = commandRecord[j]; + Command preCmd = commandRecord[j-1]; + if (preCmd.code != preButton || cmd.code != button) + return false; + if (cmd.time - preCmd.time > m_DeltaTime) + return false; + id.Add(preCmd.id); + if (j == commandRecord.Count - 1) + id.Add(cmd.id); + } + + //for (int i = 0; i < id.Count; ++i) + //{ + // if (m_LastCmdID.Contains(id[i])) + // return false; + //} + //m_LastCmdID.Clear(); + //m_LastCmdID.AddRange(id); + + return true; } } diff --git a/Assets/Scripts/ApplicationMain.cs b/Assets/Scripts/ApplicationMain.cs index 04648edf..7bee23a5 100644 --- a/Assets/Scripts/ApplicationMain.cs +++ b/Assets/Scripts/ApplicationMain.cs @@ -14,7 +14,8 @@ public class ApplicationMain : MonoBehaviour // Update is called once per frame void Update() { - InputManager.Instance.Update(); + InputManager.Instance.Update(); + AbilitySystem.Update(); } private void LateUpdate() diff --git a/Assets/Scripts/GUI.meta b/Assets/Scripts/GUI.meta new file mode 100644 index 00000000..649b12c1 --- /dev/null +++ b/Assets/Scripts/GUI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 452d3a87e77cbe642b89b8cdd976ddaf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Input/InputManager.cs b/Assets/Scripts/Input/InputManager.cs index 771032a8..f24a3efa 100644 --- a/Assets/Scripts/Input/InputManager.cs +++ b/Assets/Scripts/Input/InputManager.cs @@ -5,6 +5,13 @@ using UnityEngine; public class InputManager : Singleton { private List m_CommandRecord; + public List CommandRecord + { + get + { + return m_CommandRecord; + } + } private readonly int kCommandRecords = 10; // 本帧内的指令,会在下一帧被清空 diff --git a/Assets/Scripts/Test/SaionjiScript.cs b/Assets/Scripts/Test/SaionjiScript.cs index 0ea5f003..6b3f983e 100644 --- a/Assets/Scripts/Test/SaionjiScript.cs +++ b/Assets/Scripts/Test/SaionjiScript.cs @@ -35,8 +35,8 @@ public partial class SaionjiScript : MonoBehaviour private void Update() { - if (EnableAbilitySystem) - m_AbilitySystem.OnUpdate(); + //if (EnableAbilitySystem) + // m_AbilitySystem.OnUpdate(); } // 更新顺序: diff --git a/Assets/Scripts/Test/SaionjiScript_Ability.cs b/Assets/Scripts/Test/SaionjiScript_Ability.cs index 375dc631..bd62c138 100644 --- a/Assets/Scripts/Test/SaionjiScript_Ability.cs +++ b/Assets/Scripts/Test/SaionjiScript_Ability.cs @@ -29,17 +29,22 @@ public partial class SaionjiScript : MonoBehaviour /// void SetupAbilities() { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // abilities + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IdleAbility idle = new IdleAbility(animator, Anim_Idle); MoveAbility move = new MoveAbility(animator, Anim_Run); - MoveAbility dash = new MoveAbility(animator, Anim_Run); + MoveAbility dash = new MoveAbility(animator, Anim_DashWithSword); AttackAbility attk1 = new AttackAbility(animator, Anim_LightAttack1); AttackAbility attk2 = new AttackAbility(animator, Anim_LightAttack2); AttackAbility attk3 = new AttackAbility(animator, Anim_LightAttack3); AttackAbility attk4 = new AttackAbility(animator, Anim_LightAttack4); AttackAbility attk5 = new AttackAbility(animator, Anim_LightAttack5); + AttackAbility sideKick = new AttackAbility(animator, Anim_SideKick); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // actions + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ActionTurn180 turn180 = new ActionTurn180(this.transform); ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform); ActionTowardRight towardRight = new ActionTowardRight(this.transform); @@ -51,44 +56,75 @@ public partial class SaionjiScript : MonoBehaviour ActionSwitchAbility switchToAttk3 = new ActionSwitchAbility(m_AbilitySystem, attk3); ActionSwitchAbility switchToAttk4 = new ActionSwitchAbility(m_AbilitySystem, attk4); ActionSwitchAbility switchToAttk5 = new ActionSwitchAbility(m_AbilitySystem, attk5); + ActionSwitchAbility switchToSideKick = new ActionSwitchAbility(m_AbilitySystem, sideKick); + ActionSwitchAbility switchToDash = new ActionSwitchAbility(m_AbilitySystem, dash); + ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord(); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // conditions + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ConditionCommand condLeftCmd = new ConditionCommand(GamepadButton.Left); ConditionCommand condRightCmd = new ConditionCommand(GamepadButton.Right); ConditionNoMoveButtonHold condNoMoveButtonHold = new ConditionNoMoveButtonHold(); ConditionButtonHold condRightButtonHold = new ConditionButtonHold(GamepadButton.Right); ConditionButtonHold condLeftButtonHold = new ConditionButtonHold(GamepadButton.Left); ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle); + ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross); ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform); ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform); + ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List{GamepadButton.Right, GamepadButton.Right }, 1f); + ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List{GamepadButton.Left, GamepadButton.Left }, 1f); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // common triggers - Trigger triggerTurnRight = new Trigger(condRightCmd, towardRight); - Trigger triggerTurnLeft = new Trigger(condLeftCmd, towardLeft); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Trigger triggerTurnRight = new Trigger(And(condRightButtonHold, Not(condTowardRight)), towardRight); + Trigger triggerTurnLeft = new Trigger(And(condLeftButtonHold, Not(condTowardLeft)), towardLeft); Trigger trigger = null; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // ability setup + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // idle ability - trigger = new Trigger(condRightCmd, new List { switchToMove, towardRight}); + trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord , switchToDash }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord , switchToDash }); idle.AddTrigger(trigger); - trigger = new Trigger(condLeftCmd, new List { switchToMove, towardLeft}); + trigger = new Trigger(And(condRightButtonHold, Not(condRight2Cmd)), new List { switchToMove, towardRight }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, Not(condLeft2Cmd)), new List { switchToMove, towardLeft }); idle.AddTrigger(trigger); trigger = new Trigger(condCircleCmd, switchToAttk1); idle.AddTrigger(trigger); + trigger = new Trigger(condCrossCmd, switchToSideKick); + idle.AddTrigger(trigger); trigger = new Trigger(condLeftCmd, turn180); idle.AddTrigger(trigger); // move ability + trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord, switchToDash, }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord, switchToDash }); + move.AddTrigger(trigger); trigger = new Trigger(And(condTowardRight, Not(condRightButtonHold)), switchToIdle); move.AddTrigger(trigger); trigger = new Trigger(And(condTowardLeft, Not(condLeftButtonHold)), switchToIdle); move.AddTrigger(trigger); trigger = new Trigger(condCircleCmd, switchToAttk1); move.AddTrigger(trigger); + trigger = new Trigger(condCrossCmd, switchToSideKick); + move.AddTrigger(trigger); + + // dash ability + trigger = new Trigger(new ConditionAnimAtEnd(animator, Anim_DashWithSword), switchToIdle); + dash.AddTrigger(trigger); // attack abilities float expireTime = 0.3f; - + ConditionAnimAtEnd condAttk1AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack1); trigger = new Trigger(And(condAttk1AtEnd, condCircleCmd), switchToAttk2); attk1.AddTrigger(trigger); @@ -134,6 +170,10 @@ public partial class SaionjiScript : MonoBehaviour attk5.AddTrigger(triggerTurnRight); attk5.AddTrigger(triggerTurnLeft); + ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime); + trigger = new Trigger(condSideKickExpireTime, switchToIdle); + sideKick.AddTrigger(trigger); + m_AbilitySystem.ForceStart(idle); } diff --git a/Assets/Scripts/Test/SaionjiScript_Anim.cs b/Assets/Scripts/Test/SaionjiScript_Anim.cs index c0ebb95f..03d1671a 100644 --- a/Assets/Scripts/Test/SaionjiScript_Anim.cs +++ b/Assets/Scripts/Test/SaionjiScript_Anim.cs @@ -11,7 +11,9 @@ public partial class SaionjiScript : MonoBehaviour int Anim_LightAttack2; int Anim_LightAttack3; int Anim_LightAttack4; - int Anim_LightAttack5; + int Anim_LightAttack5; + int Anim_SideKick; + int Anim_DashWithSword; void GetAnimHash() { @@ -23,6 +25,8 @@ public partial class SaionjiScript : MonoBehaviour Anim_LightAttack3 = Animator.StringToHash("Light_Attk_3"); Anim_LightAttack4 = Animator.StringToHash("Light_Attk_4"); Anim_LightAttack5 = Animator.StringToHash("Light_Attk_5"); + Anim_SideKick = Animator.StringToHash("SideKick"); + Anim_DashWithSword = Animator.StringToHash("Dash_With_Sword"); } } -- cgit v1.1-26-g67d0