From f99c4d56cf95c563e95d3965ffd6d8ba33b660ee Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 17 Oct 2020 10:12:31 +0800 Subject: *ability system --- .../AbilitySystem/Conditions/ConditionCommand.cs | 6 +-- .../Conditions/ConditionCommandSeq.cs | 5 +-- Assets/Scripts/Input/Command.cs | 4 +- Assets/Scripts/Input/InputManager.cs | 15 ++++++- Assets/Scripts/Physics/PhysicsWorld.cs | 46 ++++++++++++++++++--- Assets/Scripts/Test/SaionjiScript.cs | 48 +++++++++++----------- Assets/Scripts/Test/SaionjiScript_Ability.cs | 1 + 7 files changed, 87 insertions(+), 38 deletions(-) (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/AbilitySystem/Conditions/ConditionCommand.cs b/Assets/Scripts/AbilitySystem/Conditions/ConditionCommand.cs index 420fecc5..a7487d33 100644 --- a/Assets/Scripts/AbilitySystem/Conditions/ConditionCommand.cs +++ b/Assets/Scripts/AbilitySystem/Conditions/ConditionCommand.cs @@ -7,16 +7,16 @@ using UnityEngine; /// public class ConditionCommand : ConditionBase { - Command m_TargetCommand; + CommandCode m_TargetCommand; - public ConditionCommand(Command command) + public ConditionCommand(CommandCode command) { m_TargetCommand = command; } public override bool Evaluate() { - return false; + return InputManager.Instance.CurrentCommand.code == m_TargetCommand; } } diff --git a/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs b/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs index 69570487..745d2aa8 100644 --- a/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs +++ b/Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs @@ -3,13 +3,12 @@ using System.Collections.Generic; using UnityEngine; /// -/// 一个command序列,一般用来触发连击 +/// 一个command序列,用来触发连击 /// public class ConditionCommandSeq : ConditionBase { - - public ConditionCommandSeq() + public ConditionCommandSeq(List commandSeq, float maxDeltaTime) { } diff --git a/Assets/Scripts/Input/Command.cs b/Assets/Scripts/Input/Command.cs index 7649af58..fae88684 100644 --- a/Assets/Scripts/Input/Command.cs +++ b/Assets/Scripts/Input/Command.cs @@ -24,7 +24,9 @@ public struct Command { public CommandCode code; // 指令码 public float time; // 触发时间 - public int id; + public int id; + + public static Command Blank = new Command(CommandCode.Blank, 0); public Command(CommandCode code, float time) { diff --git a/Assets/Scripts/Input/InputManager.cs b/Assets/Scripts/Input/InputManager.cs index 95f63ad7..25daf848 100644 --- a/Assets/Scripts/Input/InputManager.cs +++ b/Assets/Scripts/Input/InputManager.cs @@ -5,9 +5,18 @@ using UnityEngine; public class InputManager : Singleton { private List m_CommandRecord; - private Command m_CurrentCommand; private readonly int kCommandRecords = 10; + // 本帧内的指令,会在下一帧被清空 + private Command m_CurrentCommand; + public Command CurrentCommand + { + get + { + return m_CurrentCommand; + } + } + public void Init() { m_CommandRecord = new List(); @@ -48,6 +57,10 @@ public class InputManager : Singleton if(m_CommandRecord.Count > 10) m_CommandRecord.RemoveRange(0, m_CommandRecord.Count - 10); } + else if(m_CurrentCommand.code != CommandCode.Blank) + { + m_CurrentCommand = Command.Blank; + } } string CommandCodeToString(CommandCode cmd) diff --git a/Assets/Scripts/Physics/PhysicsWorld.cs b/Assets/Scripts/Physics/PhysicsWorld.cs index 3514934c..444fe392 100644 --- a/Assets/Scripts/Physics/PhysicsWorld.cs +++ b/Assets/Scripts/Physics/PhysicsWorld.cs @@ -30,7 +30,7 @@ public class PhysicsWorld : Singleton // 重力加速度 private readonly Vector3 m_Gravity = new Vector3(0, -9.8f, 0); // 当前管理的碰撞体 - private List m_Primitives; + private List m_Primitives = new List(); private float m_TimeCount; private readonly int[] m_CollisionTable = { @@ -41,9 +41,10 @@ public class PhysicsWorld : Singleton /*wall */ 0, 0, 0, 0, }; + private List m_Animators = new List(); + public void Init() { - m_Primitives = new List(); m_TimeCount = Time.time; } @@ -66,6 +67,19 @@ public class PhysicsWorld : Singleton m_Primitives.Remove(prim); } + public void AddAnimator(Animator animator) + { + if (m_Animators.Contains(animator)) + return; + m_Animators.Add(animator); + } + + public void RemoveAnimator(Animator animator) + { + if (m_Animators.Contains(animator)) + m_Animators.Remove(animator); + } + /// /// 物理系统已稳定的逻辑帧率执行 /// @@ -82,14 +96,34 @@ public class PhysicsWorld : Singleton m_TimeCount -= dt; } - private void Tick() + void Tick() { float deltaTime = 1f / m_UpdateRate; + // animator -> OnAnimatorMove() -> physics + UpdateAnimator(deltaTime); + UpdatePrimitives(deltaTime); + } + + // 更新动画,并处理OnAnimatorMove() + void UpdateAnimator(float deltaTime) + { + for (int i = 0; i < m_Animators.Count; ++i) + { + Animator animator = m_Animators[i]; + animator.speed = 1; + animator.Update(deltaTime); + animator.speed = 0; + } + } + + // 更新物理系统 + void UpdatePrimitives(float deltaTime) + { int groupCount = (int)PhysicsGroup.GroupCount; for (int i = 0; i < m_Primitives.Count; ++i) { PhysicsPrimitive prim1 = m_Primitives[i]; - for(int j = i + 1; j < m_Primitives.Count; ++j) + for (int j = i + 1; j < m_Primitives.Count; ++j) { PhysicsPrimitive prim2 = m_Primitives[j]; @@ -104,13 +138,13 @@ public class PhysicsWorld : Singleton continue; PhysicsCollisionInfo info; - if(PhysicsHelper.PrimvsPrim(prim1, prim2, out info)) + if (PhysicsHelper.PrimvsPrim(prim1, prim2, out info)) { //没有physics body的primitive将不会被移动,只有那些绑定了physics body的会被施加物理效果,比如角色身体、物品 } } } - } + } } \ No newline at end of file diff --git a/Assets/Scripts/Test/SaionjiScript.cs b/Assets/Scripts/Test/SaionjiScript.cs index f10c9b1d..a7ba6091 100644 --- a/Assets/Scripts/Test/SaionjiScript.cs +++ b/Assets/Scripts/Test/SaionjiScript.cs @@ -7,38 +7,38 @@ public partial class SaionjiScript : MonoBehaviour HitBoxTest hitbox; Animator animator; - int IdleHash; + public GameObject Go_PistolL; + public GameObject Go_PistolR; + public GameObject Go_Blade; - // Start is called before the first frame update - void Start() + public bool UsePistol; + public bool UseBlade; + + // Start is called before the first frame update + void Start() { animator = GetComponent(); - // SetupAbilities(); - IdleHash = Animator.StringToHash("Idle Fight 0"); - } + animator.speed = 0; + PhysicsWorld.Instance.AddAnimator(animator); - private void Update() - { + Go_PistolL.SetActive(UsePistol); + Go_PistolR.SetActive(UsePistol); + Go_Blade.SetActive(UseBlade); - //AnimatorStateInfo info = animator.GetCurrentAnimatorStateInfo(0); - //if(info.normalizedTime > 0.8) - //{ - // animator.CrossFade(IdleHash, 0.11f); - //} - } + } - // 更新顺序: - // internal animator update -> OnAnimatorMove() -> physics - // 角色最后的位置以物理系统为准(如果加入物理系统的话) - // 如果后续有物理处理,会重写transform - // 对于后续不受物理管理的动作,不需要修改transform - void OnAnimatorMove() + // 更新顺序: + // internal animator update -> OnAnimatorMove() -> physics + // 角色最后的位置以物理系统为准(如果加入物理系统的话) + // 如果后续有物理处理,会重写transform + // 对于后续不受物理管理的动作,不需要修改transform + void OnAnimatorMove() { Animator animator = GetComponent(); - - // animator.deltaPosition和animator.deltaRotation是animator做的root motion后的结果 - // 在后面做一个硬性约束z=0,将角色限制在z=0平面上 - if (animator) + + // animator.deltaPosition和animator.deltaRotation是animator做的root motion后的结果 + // 在后面做一个硬性约束z=0,将角色限制在z=0平面上 + if (animator) { Vector3 position = transform.position; position.x += animator.deltaPosition.x; diff --git a/Assets/Scripts/Test/SaionjiScript_Ability.cs b/Assets/Scripts/Test/SaionjiScript_Ability.cs index 59d55630..4b8f4693 100644 --- a/Assets/Scripts/Test/SaionjiScript_Ability.cs +++ b/Assets/Scripts/Test/SaionjiScript_Ability.cs @@ -26,6 +26,7 @@ public partial class SaionjiScript : MonoBehaviour { IdleAbility idleAbility = new IdleAbility(Anim_Idle); + m_AbilitySystem.AddAbility(idleAbility); } -- cgit v1.1-26-g67d0