summaryrefslogtreecommitdiff
path: root/Assets/Scripts
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-10-17 10:12:31 +0800
committerchai <chaifix@163.com>2020-10-17 10:12:31 +0800
commitf99c4d56cf95c563e95d3965ffd6d8ba33b660ee (patch)
treecbec1f362d5eb0fd2ee67885cae17a527796f41c /Assets/Scripts
parentecb0cbe03d3eef32fdb7b43fa3c60f0f241b0129 (diff)
*ability system
Diffstat (limited to 'Assets/Scripts')
-rw-r--r--Assets/Scripts/AbilitySystem/Conditions/ConditionCommand.cs6
-rw-r--r--Assets/Scripts/AbilitySystem/Conditions/ConditionCommandSeq.cs5
-rw-r--r--Assets/Scripts/Input/Command.cs4
-rw-r--r--Assets/Scripts/Input/InputManager.cs15
-rw-r--r--Assets/Scripts/Physics/PhysicsWorld.cs46
-rw-r--r--Assets/Scripts/Test/SaionjiScript.cs48
-rw-r--r--Assets/Scripts/Test/SaionjiScript_Ability.cs1
7 files changed, 87 insertions, 38 deletions
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;
/// </summary>
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;
/// <summary>
-/// 一个command序列,一般用来触发连击
+/// 一个command序列,用来触发连击
/// </summary>
public class ConditionCommandSeq : ConditionBase
{
-
- public ConditionCommandSeq()
+ public ConditionCommandSeq(List<CommandCode> 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<InputManager>
{
private List<Command> 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<Command>();
@@ -48,6 +57,10 @@ public class InputManager : Singleton<InputManager>
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<PhysicsWorld>
// 重力加速度
private readonly Vector3 m_Gravity = new Vector3(0, -9.8f, 0);
// 当前管理的碰撞体
- private List<PhysicsPrimitive> m_Primitives;
+ private List<PhysicsPrimitive> m_Primitives = new List<PhysicsPrimitive>();
private float m_TimeCount;
private readonly int[] m_CollisionTable = {
@@ -41,9 +41,10 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
/*wall */ 0, 0, 0, 0,
};
+ private List<Animator> m_Animators = new List<Animator>();
+
public void Init()
{
- m_Primitives = new List<PhysicsPrimitive>();
m_TimeCount = Time.time;
}
@@ -66,6 +67,19 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
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);
+ }
+
/// <summary>
/// 物理系统已稳定的逻辑帧率执行
/// </summary>
@@ -82,14 +96,34 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
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<PhysicsWorld>
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<Animator>();
- // 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>();
-
- // 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);
}