diff options
Diffstat (limited to 'Assets/Scripts/Avatar')
37 files changed, 924 insertions, 838 deletions
diff --git a/Assets/Scripts/Avatar/Abilities/HurtAbility.cs b/Assets/Scripts/Avatar/Abilities/HurtAbility.cs deleted file mode 100644 index c12c89c6..00000000 --- a/Assets/Scripts/Avatar/Abilities/HurtAbility.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-/// <summary>
-/// 将伤害类型进行分类,决定不同的motion类型
-/// </summary>
-public enum HurtType
-{
- Light = 0, // 轻击
- Medium, // 中击
- Hard, // 重击
- Back,
- Up,
- Diagup
-}
-
-public class HurtAbility : AbilityBase
-{
-
-}
diff --git a/Assets/Scripts/Avatar/Abilities/HurtAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/HurtAbility.cs.meta deleted file mode 100644 index 0e70d0be..00000000 --- a/Assets/Scripts/Avatar/Abilities/HurtAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6984a899f4c7f574a8dbffe0372c6c2e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/IdleAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/IdleAbility.cs.meta deleted file mode 100644 index 07d0c292..00000000 --- a/Assets/Scripts/Avatar/Abilities/IdleAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 367ca0f7efe3fe14baf88eb3ce60a78b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/JumpAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/JumpAbility.cs.meta deleted file mode 100644 index 6c67c462..00000000 --- a/Assets/Scripts/Avatar/Abilities/JumpAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ed5b337c63528354f8b4f2ba0a59481d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/MoveAbility.cs.meta deleted file mode 100644 index 08b2954c..00000000 --- a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4581355020e27084f869d6001787e11e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/UberAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/UberAbility.cs.meta deleted file mode 100644 index 644a961f..00000000 --- a/Assets/Scripts/Avatar/Abilities/UberAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4e409e4f283e85841a62293fe96b1cce -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Actions/ActionJump.cs b/Assets/Scripts/Avatar/Actions/ActionJump.cs index c90e73f4..b281a7b3 100644 --- a/Assets/Scripts/Avatar/Actions/ActionJump.cs +++ b/Assets/Scripts/Avatar/Actions/ActionJump.cs @@ -2,20 +2,20 @@ using System.Collections.Generic;
using UnityEngine;
-// 垂直跳跃,切换到jump ability
-public class ActionJump : ActionSwitchAbility
+// 垂直跳跃,切换到jump state
+public class ActionJump : ActionSwitchState
{
- private JumpAbility m_JumpAbility;
+ private JumpState m_JumpState;
- public ActionJump(AbilitySystem system, JumpAbility jumpAbility)
- : base(system, jumpAbility)
+ public ActionJump(StateSystem system, JumpState jumpState)
+ : base(system, jumpState)
{
- m_JumpAbility = jumpAbility;
+ m_JumpState = jumpState;
}
public override void Execute()
{
- m_JumpAbility.SetDir(JumpAbility.Direction.Neutral);
+ m_JumpState.SetDir(JumpState.Direction.Neutral);
base.Execute();
}
}
diff --git a/Assets/Scripts/Avatar/Actions/ActionJumpForward.cs b/Assets/Scripts/Avatar/Actions/ActionJumpForward.cs index 4e71dcf6..d130411f 100644 --- a/Assets/Scripts/Avatar/Actions/ActionJumpForward.cs +++ b/Assets/Scripts/Avatar/Actions/ActionJumpForward.cs @@ -2,20 +2,20 @@ using System.Collections.Generic;
using UnityEngine;
-// 垂直跳跃,切换到jump ability
-public class ActionJumpForward : ActionSwitchAbility
+// 垂直跳跃,切换到jump state
+public class ActionJumpForward : ActionSwitchState
{
- private JumpAbility m_JumpAbility;
+ private JumpState m_JumpState;
- public ActionJumpForward(AbilitySystem system, JumpAbility jumpAbility)
- : base(system, jumpAbility)
+ public ActionJumpForward(StateSystem system, JumpState jumpState)
+ : base(system, jumpState)
{
- m_JumpAbility = jumpAbility;
+ m_JumpState = jumpState;
}
public override void Execute()
{
- m_JumpAbility.SetDir(JumpAbility.Direction.Forward);
- base.Execute(); // switch to jump ability
+ m_JumpState.SetDir(JumpState.Direction.Forward);
+ base.Execute(); // switch to jump state
}
}
diff --git a/Assets/Scripts/Avatar/Actions/ActionSwitchAbility.cs b/Assets/Scripts/Avatar/Actions/ActionSwitchAbility.cs index 1e214d72..89327951 100644 --- a/Assets/Scripts/Avatar/Actions/ActionSwitchAbility.cs +++ b/Assets/Scripts/Avatar/Actions/ActionSwitchAbility.cs @@ -2,20 +2,20 @@ using System.Collections.Generic; using UnityEngine; -// 基础的切换 ability -public class ActionSwitchAbility : ActionBase +// 基础的切换 state +public class ActionSwitchState : ActionBase { - AbilitySystem m_AbilitySystem; - AbilityBase m_TargetAbility; + StateSystem m_StateSystem; + StateBase m_TargetState; - public ActionSwitchAbility(AbilitySystem abilitySystem, AbilityBase targetAbility) + public ActionSwitchState(StateSystem stateSystem, StateBase targetState) { - m_AbilitySystem = abilitySystem; - m_TargetAbility = targetAbility; + m_StateSystem = stateSystem; + m_TargetState = targetState; } public override void Execute() { - m_AbilitySystem.SwitchToAbility(m_TargetAbility); + m_StateSystem.SwitchToState(m_TargetState); } } diff --git a/Assets/Scripts/Avatar/Avatar.cs b/Assets/Scripts/Avatar/Avatar.cs index 1f3990a9..601fafab 100644 --- a/Assets/Scripts/Avatar/Avatar.cs +++ b/Assets/Scripts/Avatar/Avatar.cs @@ -16,14 +16,14 @@ public partial class Avatar : MonoBehaviour, IInteractable public Hitbox[] m_Hitbox;
public Hurtbox[] m_Hurtbox;
- protected AbilitySystem m_AbilitySystem = new AbilitySystem();
+ protected StateSystem m_StateSystem = new StateSystem();
- // 预定义的ability,角色必须定义的
- protected AbilityBase m_AbilityLightHurt;
- protected AbilityBase m_AbilityMidiumHurt;
- protected AbilityBase m_AbilityHeavyHurt;
- protected AbilityBase m_AbilityGroundHurt;
- protected AbilityBase m_AbilityAirHurt;
+ // 预定义的state,角色必须定义的
+ protected StateBase m_StateLightHurt;
+ protected StateBase m_StateMidiumHurt;
+ protected StateBase m_StateHeavyHurt;
+ protected StateBase m_StateGroundHurt;
+ protected StateBase m_StateAirHurt;
public PhysicsBody Body
{
@@ -84,13 +84,13 @@ public partial class Avatar : MonoBehaviour, IInteractable public void OnUpdate()
{
- m_AbilitySystem.OnUpdate();
+ m_StateSystem.OnUpdate();
}
// 在物理模拟之后调用
public void OnPhysicsUpdate()
{
- m_AbilitySystem.OnPhysicsUpdate();
+ m_StateSystem.OnPhysicsUpdate();
}
public virtual Vector3 GetEffectPosition()
@@ -101,13 +101,13 @@ public partial class Avatar : MonoBehaviour, IInteractable // 获得当前击打如果有的话
public Hit GetHit()
{
- return m_AbilitySystem.GetHit();
+ return m_StateSystem.GetHit();
}
public virtual void OnHit(HitInfo hitInfo)
{
//Debug.Log("Hit");
- m_AbilitySystem.OnHit(hitInfo);
+ m_StateSystem.OnHit(hitInfo);
}
public virtual void OnHurt(HurtInfo hurtInfo)
@@ -116,7 +116,34 @@ public partial class Avatar : MonoBehaviour, IInteractable HitDefination hitDef = hurtInfo.hitDef;
if (hitDef != null)
ApplyHit(hitDef);
- m_AbilitySystem.OnHurt(hurtInfo);
+ m_StateSystem.OnHurt(hurtInfo);
}
+
+ protected ConditionBase Not(ConditionBase cond)
+ {
+ return new ConditionNot(cond);
+ }
+
+ protected ConditionBase And(ConditionBase c1, ConditionBase c2)
+ {
+ return new ConditionAnd(c1, c2);
+ }
+
+ protected ConditionBase Ands(params ConditionBase[] cond)
+ {
+ List<ConditionBase> conditions = new List<ConditionBase>();
+ for (int i = 0; i < cond.Length; ++i)
+ {
+ conditions.Add(cond[i]);
+ }
+ ConditionMultiAnd and = new ConditionMultiAnd(conditions);
+ return and;
+ }
+
+ protected ConditionBase Or(ConditionBase c1, ConditionBase c2)
+ {
+ return new ConditionOr(c1, c2);
+ }
+
}
diff --git a/Assets/Scripts/Avatar/Avatar_Hurt.cs b/Assets/Scripts/Avatar/Avatar_Hurt.cs index 3f26bcbe..f82ffbb6 100644 --- a/Assets/Scripts/Avatar/Avatar_Hurt.cs +++ b/Assets/Scripts/Avatar/Avatar_Hurt.cs @@ -11,9 +11,19 @@ public partial class Avatar : MonoBehaviour, IInteractable m_Body.AddForce(hit.hurtAddForce);
}
- // force switch to hurt ability
+ // 切换到受击状态
+ switch(hit.type)
+ {
+ case HitType.Light: m_StateSystem.SwitchToState(m_StateLightHurt); break;
+ case HitType.Midium: m_StateSystem.SwitchToState(m_StateMidiumHurt); break;
+ case HitType.Heavy: m_StateSystem.SwitchToState(m_StateHeavyHurt); break;
+ case HitType.Ground: m_StateSystem.SwitchToState(m_StateGroundHurt); break;
+ case HitType.Air: m_StateSystem.SwitchToState(m_StateAirHurt); break;
+ default:
+ m_StateSystem.SwitchToState(m_StateLightHurt);
+ break;
+ }
-
- }
+ }
}
diff --git a/Assets/Scripts/Avatar/Conditions/ConditionAbilitySeq.cs b/Assets/Scripts/Avatar/Conditions/ConditionAbilitySeq.cs index b55cacb8..4b71b837 100644 --- a/Assets/Scripts/Avatar/Conditions/ConditionAbilitySeq.cs +++ b/Assets/Scripts/Avatar/Conditions/ConditionAbilitySeq.cs @@ -3,22 +3,22 @@ using System.Collections.Generic; using UnityEngine;
/// <summary>
-/// 记录之前的ability序列满足某个序列
+/// 记录之前的state序列满足某个序列
/// combo的时候根据当前序列决定combo
/// </summary>
-public class ConditionAbilitySeq : ConditionBase
+public class ConditionStateSeq : ConditionBase
{
- List<int> m_TargetAbilitySeq = new List<int>();
+ List<int> m_TargetStateSeq = new List<int>();
- public ConditionAbilitySeq(List<int> commandSeq)
+ public ConditionStateSeq(List<int> commandSeq)
: base()
{
- m_TargetAbilitySeq = commandSeq;
+ m_TargetStateSeq = commandSeq;
}
public override bool Evaluate()
{
- // 验证记录的abilitySeq是否满足
+ // 验证记录的stateSeq是否满足
throw new System.NotImplementedException();
diff --git a/Assets/Scripts/Avatar/Conditions/ConditionAttkExpireTime.cs b/Assets/Scripts/Avatar/Conditions/ConditionAttkExpireTime.cs index a3944600..0f9b4529 100644 --- a/Assets/Scripts/Avatar/Conditions/ConditionAttkExpireTime.cs +++ b/Assets/Scripts/Avatar/Conditions/ConditionAttkExpireTime.cs @@ -4,18 +4,18 @@ using UnityEngine; public class ConditionAttkExpireTime : ConditionBase { - AttackAbility m_Ability; + AttackState m_State; float m_ExpireTime; - public ConditionAttkExpireTime(AttackAbility attack, float expireTime) + public ConditionAttkExpireTime(AttackState attack, float expireTime) { - m_Ability = attack; + m_State = attack; m_ExpireTime = expireTime; } public override bool Evaluate() { - return m_Ability.ExpireTime > m_ExpireTime; + return m_State.ExpireTime > m_ExpireTime; } } diff --git a/Assets/Scripts/Avatar/Conditions/ConditionCheckJumpState.cs b/Assets/Scripts/Avatar/Conditions/ConditionCheckJumpState.cs index 9afd68c4..98859483 100644 --- a/Assets/Scripts/Avatar/Conditions/ConditionCheckJumpState.cs +++ b/Assets/Scripts/Avatar/Conditions/ConditionCheckJumpState.cs @@ -4,33 +4,33 @@ using UnityEngine; public class ConditionCheckJumpState : ConditionBase { - JumpAbility m_Ability; - JumpAbility.State m_State; - JumpAbility.Direction m_Direction; + JumpState m_State; + JumpState.Stage m_Stage; + JumpState.Direction m_Direction; - public ConditionCheckJumpState(JumpAbility ability, JumpAbility.State state = JumpAbility.State.None, JumpAbility.Direction direction = JumpAbility.Direction.None) + public ConditionCheckJumpState(JumpState state, JumpState.Stage stage = JumpState.Stage.None, JumpState.Direction direction = JumpState.Direction.None) { - m_Ability = ability; + m_State = state; m_State = state; m_Direction = direction; } public override bool Evaluate() { - if (m_Ability == null) + if (m_State == null) return false; - if (m_State != JumpAbility.State.None && m_Direction != JumpAbility.Direction.None) + if (m_Stage != JumpState.Stage.None && m_Direction != JumpState.Direction.None) { - return m_Ability.CurState == m_State - && m_Ability.CurDirection == m_Direction; + return m_State.CurStage == m_Stage + && m_State.CurDirection == m_Direction; } - else if (m_State != JumpAbility.State.None && m_Direction == JumpAbility.Direction.None) + else if (m_Stage != JumpState.Stage.None && m_Direction == JumpState.Direction.None) { - return m_Ability.CurState == m_State; + return m_State.CurStage == m_Stage; } - else if (m_State == JumpAbility.State.None && m_Direction != JumpAbility.Direction.None) + else if (m_Stage == JumpState.Stage.None && m_Direction != JumpState.Direction.None) { - return m_Ability.CurDirection == m_Direction; + return m_State.CurDirection == m_Direction; } else return false; diff --git a/Assets/Scripts/Avatar/Conditions/ConditionJumpDone.cs b/Assets/Scripts/Avatar/Conditions/ConditionJumpDone.cs index 1f213a50..a6e57e37 100644 --- a/Assets/Scripts/Avatar/Conditions/ConditionJumpDone.cs +++ b/Assets/Scripts/Avatar/Conditions/ConditionJumpDone.cs @@ -4,10 +4,10 @@ using UnityEngine; public class ConditionJumpDone : ConditionBase
{
- JumpAbility m_Jump;
+ JumpState m_Jump;
float m_T;
- public ConditionJumpDone(JumpAbility jump, float t = 1f)
+ public ConditionJumpDone(JumpState jump, float t = 1f)
{
m_Jump = jump;
m_T = t;
diff --git a/Assets/Scripts/Avatar/Conditions/ConditionJumpOnGround.cs b/Assets/Scripts/Avatar/Conditions/ConditionJumpOnGround.cs index 47f74cab..e0f75a69 100644 --- a/Assets/Scripts/Avatar/Conditions/ConditionJumpOnGround.cs +++ b/Assets/Scripts/Avatar/Conditions/ConditionJumpOnGround.cs @@ -4,9 +4,9 @@ using UnityEngine; public class ConditionJumpOnGround : ConditionBase { - JumpAbility m_Jump; + JumpState m_Jump; - public ConditionJumpOnGround(JumpAbility jump) + public ConditionJumpOnGround(JumpState jump) { m_Jump = jump; } diff --git a/Assets/Scripts/Avatar/AbilitySystem.cs b/Assets/Scripts/Avatar/StateSystem.cs index 5f6e9364..42e35445 100644 --- a/Assets/Scripts/Avatar/AbilitySystem.cs +++ b/Assets/Scripts/Avatar/StateSystem.cs @@ -3,16 +3,16 @@ using System.Collections.Generic; using UnityEngine; /// <summary> -/// 每个角色拥有一个ablity system +/// 每个角色拥有一个state system /// </summary> -public class AbilitySystem +public class StateSystem { /// <summary> - /// 当前执行的ability + /// 当前执行的state /// </summary> - private AbilityBase m_Currrent; + private StateBase m_Currrent; - public AbilityBase Current + public StateBase Current { get { @@ -20,34 +20,34 @@ public class AbilitySystem } } - private List<AbilityBase> m_Abilities = new List<AbilityBase>(); + private List<StateBase> m_States = new List<StateBase>(); - private UberAbility m_UberAbility; + private UberState m_UberState; - public AbilitySystem() + public StateSystem() { } - public void ForceStart(AbilityBase ability) + public void ForceStart(StateBase state) { - if (ability == null) + if (state == null) return; if (m_Currrent != null) m_Currrent.OnExit(); - m_Currrent = ability; + m_Currrent = state; m_Currrent.OnEnter(); } - public void SetUberAbility(UberAbility ability)
- {
- m_UberAbility = ability;
+ public void SetUberState(UberState state) + { + m_UberState = state; } - public void AddAbility(AbilityBase ability) + public void AddState(StateBase state) { - m_Abilities.Add(ability); + m_States.Add(state); } public void OnUpdate() @@ -56,10 +56,10 @@ public class AbilitySystem { m_Currrent.OnUpdate(); } - if(m_UberAbility != null)
- {
- m_UberAbility.OnUpdate(); - }
+ if(m_UberState != null) + { + m_UberState.OnUpdate(); + } } public void OnPhysicsUpdate() @@ -68,39 +68,39 @@ public class AbilitySystem { m_Currrent.OnPhysicsUpdate(); } - if(m_UberAbility != null)
- {
- m_UberAbility.OnPhysicsUpdate(); - }
- }
-
- public void OnHit(HitInfo info)
- {
- if (m_Currrent != null)
- m_Currrent.OnHit(info);
+ if(m_UberState != null) + { + m_UberState.OnPhysicsUpdate(); + } } - public void OnHurt(HurtInfo info)
- {
- if (m_Currrent != null)
+ public void OnHit(HitInfo info) + { + if (m_Currrent != null) + m_Currrent.OnHit(info); + } + + public void OnHurt(HurtInfo info) + { + if (m_Currrent != null) m_Currrent.OnHurt(info); } -
- public void SwitchToAbility(AbilityBase targetAbility) + + public void SwitchToState(StateBase targetState) { if (m_Currrent != null) m_Currrent.OnExit(); - m_Currrent = targetAbility; + m_Currrent = targetState; m_Currrent.OnEnter(); } - // 获得当前击打如果有的话
- public Hit GetHit()
- {
- if (Current == null || !(Current is AttackAbility))
- return null;
- AttackAbility ability = Current as AttackAbility;
- return ability.GetHit();
+ // 获得当前击打如果有的话 + public Hit GetHit() + { + if (Current == null || !(Current is AttackState)) + return null; + AttackState state = Current as AttackState; + return state.GetHit(); } }
\ No newline at end of file diff --git a/Assets/Scripts/Avatar/AbilitySystem.cs.meta b/Assets/Scripts/Avatar/StateSystem.cs.meta index 52e8267c..52e8267c 100644 --- a/Assets/Scripts/Avatar/AbilitySystem.cs.meta +++ b/Assets/Scripts/Avatar/StateSystem.cs.meta diff --git a/Assets/Scripts/Avatar/Abilities.meta b/Assets/Scripts/Avatar/States.meta index 4b958769..4b958769 100644 --- a/Assets/Scripts/Avatar/Abilities.meta +++ b/Assets/Scripts/Avatar/States.meta diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs b/Assets/Scripts/Avatar/States/AbilityBase.cs index c8c09a6b..4932a3de 100644 --- a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs +++ b/Assets/Scripts/Avatar/States/AbilityBase.cs @@ -1,66 +1,66 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-/// <summary>
-/// 同一个角色同一个时间只能有一个ability
-/// </summary>
-public abstract class AbilityBase
-{
- protected int m_AbilityID;
- public int ID
- {
- get
- {
- return m_AbilityID;
- }
- }
-
- public AbilityBase()
- {
- m_AbilityID = UIDManager.Acquire();
- }
-
- public virtual void OnInit() { }
-
- /// <summary>
- /// 进入当前ability的回调
- /// </summary>
- public virtual void OnEnter() { }
-
- /// <summary>
- /// 退出当前ability的回调
- /// </summary>
- public virtual void OnExit() { }
-
- /// <summary>
- /// 当前ability的update函数
- /// </summary>
- public virtual void OnUpdate() { }
-
- /// <summary>
- /// 在物理模拟之后更新
- /// </summary>
- public virtual void OnPhysicsUpdate() { }
-
- /// <summary>
- /// 过渡到下一个ability的回调
- /// </summary>
- /// <param name="to"></param>
- public virtual void OnTranslate(AbilityBase to) { }
-
- /// <summary>
- /// 检测到hitbox碰撞时的回调
- /// </summary>
- public virtual void OnHit(HitInfo info) { }
-
- /// <summary>
- /// 检测到hurtbox碰撞时的回调
- /// </summary>
- public virtual void OnHurt(HurtInfo info) { }
-
- /// <summary>
- /// 检测到defendbox碰撞时的回调
- /// </summary>
- public virtual void OnDefend() { }
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// <summary> +/// 同一个角色同一个时间只能有一个state +/// </summary> +public abstract class StateBase +{ + protected int m_StateID; + public int ID + { + get + { + return m_StateID; + } + } + + public StateBase() + { + m_StateID = UIDManager.Acquire(); + } + + public virtual void OnInit() { } + + /// <summary> + /// 进入当前state的回调 + /// </summary> + public virtual void OnEnter() { } + + /// <summary> + /// 退出当前state的回调 + /// </summary> + public virtual void OnExit() { } + + /// <summary> + /// 当前state的update函数 + /// </summary> + public virtual void OnUpdate() { } + + /// <summary> + /// 在物理模拟之后更新 + /// </summary> + public virtual void OnPhysicsUpdate() { } + + /// <summary> + /// 过渡到下一个state的回调 + /// </summary> + /// <param name="to"></param> + public virtual void OnTranslate(StateBase to) { } + + /// <summary> + /// 检测到hitbox碰撞时的回调 + /// </summary> + public virtual void OnHit(HitInfo info) { } + + /// <summary> + /// 检测到hurtbox碰撞时的回调 + /// </summary> + public virtual void OnHurt(HurtInfo info) { } + + /// <summary> + /// 检测到defendbox碰撞时的回调 + /// </summary> + public virtual void OnDefend() { } +} diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta b/Assets/Scripts/Avatar/States/AbilityBase.cs.meta index 79a6b7eb..79a6b7eb 100644 --- a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta +++ b/Assets/Scripts/Avatar/States/AbilityBase.cs.meta diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs b/Assets/Scripts/Avatar/States/AttackState.cs index 6e7c503f..ae8f3b66 100644 --- a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs +++ b/Assets/Scripts/Avatar/States/AttackState.cs @@ -1,175 +1,175 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public struct AttackAbilityConfig
-{
- public Vector3 velocity; // velocity setup
- public int motion;
- public Animator animator;
- public PhysicsBody body;
-}
-
-// 单独的一个招式
-public class AttackAbility : AbilityBase
-{
- AttackAbilityConfig m_Config = new AttackAbilityConfig();
-
- private List<Trigger> m_Triggers = new List<Trigger>();
-
- private List<Trigger> m_PhysicsTriggers = new List<Trigger>();
-
- /// <summary>
- /// 这个招式配置的hit
- /// </summary>
- private List<Hit> m_Hits = new List<Hit>();
-
- /// <summary>
- /// 从动画结束开始计时
- /// </summary>
- float m_TimeCount;
- public float ExpireTime
- {
- get
- {
- return m_TimeCount;
- }
- }
-
- /// <summary>
- /// 这个招式的hit个数
- /// </summary>
- public int HitCount
- {
- get
- {
- return m_Hits != null ? m_Hits.Count : 0;
- }
- }
-
-
- public AttackAbility(Animator animator, int animation, PhysicsBody body = null)
- {
- m_Config.animator = animator;
- m_Config.motion = animation;
- m_Config.velocity = Vector3.zero;
- m_Config.body = body;
- }
-
- public AttackAbility(AttackAbilityConfig config)
- {
- m_Config = config;
- }
-
- public override void OnInit()
- {
- }
-
- public override void OnDefend()
- {
- throw new System.NotImplementedException();
- }
-
- public override void OnEnter()
- {
- m_TimeCount = 0;
-
- m_Config.animator.CrossFade(m_Config.motion, 0);
-
- if(m_Config.body != null)
- {
- m_Config.body.LocalVelocity = m_Config.velocity;
- }
-
- foreach(var hit in m_Hits)
- {
- hit.WipeRecords();
- }
-
- foreach(var trigger in m_Triggers)
- {
- trigger.Reset();
- }
- }
-
- public override void OnExit()
- {
- m_TimeCount = 0;
- }
-
- public override void OnHit(HitInfo info)
- {
- }
-
- public override void OnHurt(HurtInfo info)
- {
- }
-
- public override void OnTranslate(AbilityBase to)
- {
- }
-
- public override void OnUpdate()
- {
- AnimatorStateInfo info = m_Config.animator.GetCurrentAnimatorStateInfo(0);
- if(info.shortNameHash == m_Config.motion && info.normalizedTime >= 0.99f)
- {
- m_TimeCount += Time.deltaTime;
- }
- foreach (var abilityTrigger in m_Triggers)
- {
- if (abilityTrigger.Update() && abilityTrigger.Swallow)
- break;
- }
- }
-
- // 在物理模拟之后
- public override void OnPhysicsUpdate()
- {
- foreach (var trigger in m_PhysicsTriggers)
- {
- if (trigger.Update() && trigger.Swallow)
- break;
- }
- }
-
- public void AddTrigger(Trigger trigger)
- {
- if (trigger == null || m_Triggers.Contains(trigger))
- return;
- m_Triggers.Add(trigger);
- }
-
- public void AddPhysicsTrigger(Trigger trigger)
- {
- if (trigger == null || m_PhysicsTriggers.Contains(trigger))
- return;
- m_PhysicsTriggers.Add(trigger);
- }
-
- public void AddHitDefination(HitDefination defination)
- {
- Hit info = new Hit();
- info.defination = defination;
- m_Hits.Add(info);
- }
-
- // 获得当前时间点产生的hit
- public Hit GetHit()
- {
- AnimatorStateInfo info = m_Config.animator.GetCurrentAnimatorStateInfo(0);
- float normalizeTime = info.normalizedTime;
- for (int i = 0; i< m_Hits.Count; ++i)
- {
- Hit hit = m_Hits[i];
- float start = hit.defination.start;
- float end = hit.defination.end;
- if(normalizeTime >= start && normalizeTime <= end)
- {
- return hit;
- }
- }
- return null;
- }
-
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public struct AttackStateConfig +{ + public Vector3 velocity; // velocity setup + public int motion; + public Animator animator; + public PhysicsBody body; +} + +// 单独的一个招式 +public class AttackState : StateBase +{ + AttackStateConfig m_Config = new AttackStateConfig(); + + private List<Trigger> m_Triggers = new List<Trigger>(); + + private List<Trigger> m_PhysicsTriggers = new List<Trigger>(); + + /// <summary> + /// 这个招式配置的hit + /// </summary> + private List<Hit> m_Hits = new List<Hit>(); + + /// <summary> + /// 从动画结束开始计时 + /// </summary> + float m_TimeCount; + public float ExpireTime + { + get + { + return m_TimeCount; + } + } + + /// <summary> + /// 这个招式的hit个数 + /// </summary> + public int HitCount + { + get + { + return m_Hits != null ? m_Hits.Count : 0; + } + } + + + public AttackState(Animator animator, int animation, PhysicsBody body = null) + { + m_Config.animator = animator; + m_Config.motion = animation; + m_Config.velocity = Vector3.zero; + m_Config.body = body; + } + + public AttackState(AttackStateConfig config) + { + m_Config = config; + } + + public override void OnInit() + { + } + + public override void OnDefend() + { + throw new System.NotImplementedException(); + } + + public override void OnEnter() + { + m_TimeCount = 0; + + m_Config.animator.CrossFade(m_Config.motion, 0); + + if(m_Config.body != null) + { + m_Config.body.LocalVelocity = m_Config.velocity; + } + + foreach(var hit in m_Hits) + { + hit.WipeRecords(); + } + + foreach(var trigger in m_Triggers) + { + trigger.Reset(); + } + } + + public override void OnExit() + { + m_TimeCount = 0; + } + + public override void OnHit(HitInfo info) + { + } + + public override void OnHurt(HurtInfo info) + { + } + + public override void OnTranslate(StateBase to) + { + } + + public override void OnUpdate() + { + AnimatorStateInfo info = m_Config.animator.GetCurrentAnimatorStateInfo(0); + if(info.shortNameHash == m_Config.motion && info.normalizedTime >= 0.99f) + { + m_TimeCount += Time.deltaTime; + } + foreach (var stateTrigger in m_Triggers) + { + if (stateTrigger.Update() && stateTrigger.Swallow) + break; + } + } + + // 在物理模拟之后 + public override void OnPhysicsUpdate() + { + foreach (var trigger in m_PhysicsTriggers) + { + if (trigger.Update() && trigger.Swallow) + break; + } + } + + public void AddTrigger(Trigger trigger) + { + if (trigger == null || m_Triggers.Contains(trigger)) + return; + m_Triggers.Add(trigger); + } + + public void AddPhysicsTrigger(Trigger trigger) + { + if (trigger == null || m_PhysicsTriggers.Contains(trigger)) + return; + m_PhysicsTriggers.Add(trigger); + } + + public void AddHitDefination(HitDefination defination) + { + Hit info = new Hit(); + info.defination = defination; + m_Hits.Add(info); + } + + // 获得当前时间点产生的hit + public Hit GetHit() + { + AnimatorStateInfo info = m_Config.animator.GetCurrentAnimatorStateInfo(0); + float normalizeTime = info.normalizedTime; + for (int i = 0; i< m_Hits.Count; ++i) + { + Hit hit = m_Hits[i]; + float start = hit.defination.start; + float end = hit.defination.end; + if(normalizeTime >= start && normalizeTime <= end) + { + return hit; + } + } + return null; + } + +} diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta b/Assets/Scripts/Avatar/States/AttackState.cs.meta index 4159d2bc..4159d2bc 100644 --- a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta +++ b/Assets/Scripts/Avatar/States/AttackState.cs.meta diff --git a/Assets/Scripts/Avatar/Abilities/DashAbility.cs b/Assets/Scripts/Avatar/States/DashState.cs index b9a479b5..c9237d4c 100644 --- a/Assets/Scripts/Avatar/Abilities/DashAbility.cs +++ b/Assets/Scripts/Avatar/States/DashState.cs @@ -1,18 +1,18 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class DashAbility : MonoBehaviour
-{
- // Start is called before the first frame update
- void Start()
- {
-
- }
-
- // Update is called once per frame
- void Update()
- {
-
- }
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DashState : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta b/Assets/Scripts/Avatar/States/DashState.cs.meta index c246c665..c246c665 100644 --- a/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta +++ b/Assets/Scripts/Avatar/States/DashState.cs.meta diff --git a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs b/Assets/Scripts/Avatar/States/DodgeState.cs index 79e8fc61..58bc9301 100644 --- a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs +++ b/Assets/Scripts/Avatar/States/DodgeState.cs @@ -1,16 +1,16 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-
-/// <summary>
-/// Dodge ability
-/// </summary>
-public class DodgeAbility : AbilityBase
-{
- public DodgeAbility()
- {
-
- }
-
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +/// <summary> +/// Dodge state +/// </summary> +public class DodgeState : StateBase +{ + public DodgeState() + { + + } + +} diff --git a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta b/Assets/Scripts/Avatar/States/DodgeState.cs.meta index e7297a88..e7297a88 100644 --- a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta +++ b/Assets/Scripts/Avatar/States/DodgeState.cs.meta diff --git a/Assets/Scripts/Avatar/States/HurtState.cs b/Assets/Scripts/Avatar/States/HurtState.cs new file mode 100644 index 00000000..db48d1a4 --- /dev/null +++ b/Assets/Scripts/Avatar/States/HurtState.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// <summary> +/// 将伤害类型进行分类,决定不同的motion类型 +/// </summary> +public enum HurtType +{ + Light = 0, // 轻击 + Medium, // 中击 + Hard, // 重击 + Back, + Up, + Diagup +} + + +public class HurtState : StateBase +{ + Animator m_Animator; + + int m_AnimHash; + + /// <summary> + /// 在Idle状态时可以切换的state + /// </summary> + private List<Trigger> m_Triggers = new List<Trigger>(); + + public HurtState(Animator animator, int animation) + : base() + { + m_Animator = animator; + m_AnimHash = animation; + } + + public override void OnEnter() + { + m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.25f); + + foreach (var trigger in m_Triggers) + { + trigger.Reset(); + } + } + + public override void OnInit() + { + base.OnInit(); + } + + public override void OnUpdate() + { + foreach (var trigger in m_Triggers) + { + if (trigger.Update() && trigger.Swallow) + break; + } + + base.OnUpdate(); + } + + public void AddTrigger(Trigger trigger) + { + if (trigger == null || m_Triggers.Contains(trigger)) + return; + m_Triggers.Add(trigger); + } + +} diff --git a/Assets/Scripts/Avatar/States/HurtState.cs.meta b/Assets/Scripts/Avatar/States/HurtState.cs.meta new file mode 100644 index 00000000..ba24ef88 --- /dev/null +++ b/Assets/Scripts/Avatar/States/HurtState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7f21d9eef4527249a00204754fbff5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/IdleAbility.cs b/Assets/Scripts/Avatar/States/IdleState.cs index e692cc2a..8b46b904 100644 --- a/Assets/Scripts/Avatar/Abilities/IdleAbility.cs +++ b/Assets/Scripts/Avatar/States/IdleState.cs @@ -1,57 +1,57 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-
-public class IdleAbility : AbilityBase
-{
- Animator m_Animator;
-
- int m_AnimHash;
-
- /// <summary>
- /// 在Idle状态时可以切换的ability
- /// </summary>
- private List<Trigger> m_Triggers = new List<Trigger>();
-
- public IdleAbility(Animator animator, int animation)
- : base()
- {
- m_Animator = animator;
- m_AnimHash = animation;
- }
-
- public override void OnEnter()
- {
- m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.25f);
-
- foreach (var trigger in m_Triggers)
- {
- trigger.Reset();
- }
- }
-
- public override void OnInit()
- {
- base.OnInit();
- }
-
- public override void OnUpdate()
- {
- foreach(var trigger in m_Triggers)
- {
- if (trigger.Update() && trigger.Swallow)
- break;
- }
-
- base.OnUpdate();
- }
-
- public void AddTrigger(Trigger trigger)
- {
- if (trigger == null || m_Triggers.Contains(trigger))
- return;
- m_Triggers.Add(trigger);
- }
-
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +public class IdleState : StateBase +{ + Animator m_Animator; + + int m_AnimHash; + + /// <summary> + /// 在Idle状态时可以切换的state + /// </summary> + private List<Trigger> m_Triggers = new List<Trigger>(); + + public IdleState(Animator animator, int animation) + : base() + { + m_Animator = animator; + m_AnimHash = animation; + } + + public override void OnEnter() + { + m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.25f); + + foreach (var trigger in m_Triggers) + { + trigger.Reset(); + } + } + + public override void OnInit() + { + base.OnInit(); + } + + public override void OnUpdate() + { + foreach(var trigger in m_Triggers) + { + if (trigger.Update() && trigger.Swallow) + break; + } + + base.OnUpdate(); + } + + public void AddTrigger(Trigger trigger) + { + if (trigger == null || m_Triggers.Contains(trigger)) + return; + m_Triggers.Add(trigger); + } + +} diff --git a/Assets/Scripts/Avatar/States/IdleState.cs.meta b/Assets/Scripts/Avatar/States/IdleState.cs.meta new file mode 100644 index 00000000..f872a5a6 --- /dev/null +++ b/Assets/Scripts/Avatar/States/IdleState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5761f8b5c41ec014381b1bd33ad42f1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/JumpAbility.cs b/Assets/Scripts/Avatar/States/JumpState.cs index 5c2d6366..1e172358 100644 --- a/Assets/Scripts/Avatar/Abilities/JumpAbility.cs +++ b/Assets/Scripts/Avatar/States/JumpState.cs @@ -2,45 +2,45 @@ using System.Collections.Generic; using UnityEngine; -public struct JumpAbilityConfig
-{
- public PhysicsBody body;
- public PhysicsPrimitive collider;
- public Animator animator;
-
- public float neutralJumpSpeedY; // 垂直跳跃的基础速度
- public float fowardJumpSpeedX; // 向前跳跃的水平速度
- public float backwardJumpSpeedX; // 向后跳跃的水平速度(一般来说是负值)
-
- public int animJump;
- public int animNU;
- public int animFU;
- public int animBU;
- public int animND;
- public int animFD;
- public int animBD;
- public int animJumpEnd;
-
- public bool skipStart; //没有准备动作
+public struct JumpStateConfig +{ + public PhysicsBody body; + public PhysicsPrimitive collider; + public Animator animator; + + public float neutralJumpSpeedY; // 垂直跳跃的基础速度 + public float fowardJumpSpeedX; // 向前跳跃的水平速度 + public float backwardJumpSpeedX; // 向后跳跃的水平速度(一般来说是负值) + + public int animJump; + public int animNU; + public int animFU; + public int animBU; + public int animND; + public int animFD; + public int animBD; + public int animJumpEnd; + + public bool skipStart; //没有准备动作 } -public class JumpAbility : AbilityBase +public class JumpState : StateBase { - public enum Direction
- {
- None,
- Neutral,
- Forward,
- Backward
+ public enum Direction + { + None, + Neutral, + Forward, + Backward } - public enum State
- {
- None,
- Ready,
- Up,
- Down,
- End,
+ public enum Stage + { + None, + Ready, + Up, + Down, + End, } Direction m_Dir; @@ -48,216 +48,216 @@ public class JumpAbility : AbilityBase PhysicsBody m_Body; PhysicsPrimitive m_Collider; - Animator m_Animator;
-
- public float m_NeutralJumpSpeedY; // 垂直跳跃的基础速度
- public float m_FowardJumpSpeedX; // 向前跳跃的水平速度
- public float m_BackwardJumpSpeedX; // 向后跳跃的水平速度(一般来说是负值)
-
- // jump motions
+ Animator m_Animator; + + public float m_NeutralJumpSpeedY; // 垂直跳跃的基础速度 + public float m_FowardJumpSpeedX; // 向前跳跃的水平速度 + public float m_BackwardJumpSpeedX; // 向后跳跃的水平速度(一般来说是负值) + + // jump motions int m_AnimJumpStart; // on ground - int m_AnimJumpNeutralUpwards;
- int m_AnimJumpNeutralDownwards;
- int m_AnimJumpFwdUpwards;
- int m_AnimJumpFwdDownwards;
- int m_AnimJumpBackUpwards;
- int m_AnimJumpBackDownwards;
- int m_AnimJumpEnd; // on ground again
-
- int m_CurAnim;
- State m_CurState;
- int m_CurUpMotion;
- int m_CurDownMotion;
- Vector3 m_CurInitVelocity;
-
- public State CurState
- {
- get
- {
- return m_CurState;
- }
- }
-
- public Direction CurDirection
- {
- get
- {
- return m_Dir;
- }
- }
-
- private List<Trigger> m_Triggers = new List<Trigger>();
-
- bool m_SkipStart;
-
- public JumpAbility(JumpAbilityConfig config)
- {
- m_Body = config.body;
- m_Collider = config.collider;
- m_Animator = config.animator;
- m_NeutralJumpSpeedY = config.neutralJumpSpeedY;
- m_FowardJumpSpeedX = config.fowardJumpSpeedX;
- m_BackwardJumpSpeedX = config.backwardJumpSpeedX;
- m_AnimJumpStart = config.animJump;
- m_AnimJumpNeutralUpwards = config.animNU;
- m_AnimJumpNeutralDownwards = config.animND;
- m_AnimJumpFwdUpwards = config.animFU;
- m_AnimJumpFwdDownwards = config.animFD;
- m_AnimJumpBackUpwards = config.animBU;
- m_AnimJumpBackDownwards = config.animBD;
- m_AnimJumpEnd = config.animJumpEnd; // on ground again
- m_SkipStart = config.skipStart;
- }
-
- public void SetDir(Direction dir)
- {
- m_Dir = dir;
- }
-
- public override void OnEnter()
- {
- base.OnEnter();
-
- m_CurAnim = 0;
-
- switch(m_Dir)
- {
- case Direction.Neutral:
- m_CurUpMotion = m_AnimJumpNeutralUpwards;
- m_CurDownMotion = m_AnimJumpNeutralDownwards;
- m_CurInitVelocity = new Vector3(0, m_NeutralJumpSpeedY, 0);
- break;
- case Direction.Forward:
- m_CurUpMotion = m_AnimJumpFwdUpwards;
- m_CurDownMotion = m_AnimJumpFwdDownwards;
- m_CurInitVelocity = new Vector3(m_FowardJumpSpeedX, m_NeutralJumpSpeedY, 0);
- break;
- case Direction.Backward:
- m_CurUpMotion = m_AnimJumpBackUpwards;
- m_CurDownMotion = m_AnimJumpBackDownwards;
- m_CurInitVelocity = new Vector3(m_BackwardJumpSpeedX, m_NeutralJumpSpeedY, 0);
- break;
- }
-
- bool isOnGround = m_Collider.IsOnGround;
- bool isUp = m_Body.Velocity.y > 0;
- bool isDown = m_Body.Velocity.y < 0;
- bool isFreeFall = Mathf.Approximately(m_Body.Velocity.y, 0);
-
- if (isOnGround && !m_SkipStart)
- m_CurState = State.Ready;
- else if (isUp || isOnGround && m_SkipStart)
- m_CurState = State.Up;
- else if (isDown || isFreeFall)
- m_CurState = State.Down;
- }
-
- public override void OnUpdate()
- {
- foreach (var abilityTrigger in m_Triggers)
- {
- if (abilityTrigger.Update() && abilityTrigger.Swallow)
- return;
- }
-
- AnimatorStateInfo motionInfo = m_Animator.GetCurrentAnimatorStateInfo(0);
-
- switch (m_CurState)
- {
- case State.Ready:
- if(m_CurAnim != m_AnimJumpStart)
- {
- m_Animator.CrossFade(m_AnimJumpStart, 0.2f);
- m_CurAnim = m_AnimJumpStart;
- }
- if(motionInfo.shortNameHash == m_AnimJumpStart && motionInfo.normalizedTime >= 1f)
- {
- m_CurState = State.Up;
- }
- break;
- case State.Up:
- if(m_CurAnim != m_CurUpMotion)
- {
- m_Body.LocalVelocity = m_CurInitVelocity;
- m_Animator.CrossFade(m_CurUpMotion, 0.05f);
- m_CurAnim = m_CurUpMotion;
- }
- if(m_Body.Velocity.y < 0)
- {
- m_CurState = State.Down;
- }
- break;
- case State.Down:
- if(m_CurAnim != m_CurDownMotion)
- {
- m_Animator.CrossFade(m_CurDownMotion, 0.5f);
- m_CurAnim = m_CurDownMotion;
- }
- if(m_Collider.IsOnGround)
- {
- m_CurState = State.End;
- }
- break;
- case State.End:
- if(m_CurAnim != m_AnimJumpEnd)
- {
- m_Animator.CrossFade(m_AnimJumpEnd, 0.2f);
- m_CurAnim = m_AnimJumpEnd;
- }
- break;
- }
- }
-
- public override void OnPhysicsUpdate()
- {
- base.OnPhysicsUpdate();
- }
-
- /// <summary>
- /// 跳跃准备动作已经完毕
- /// </summary>
- /// <returns></returns>
- public bool IsJumpReady()
- {
- if (m_CurAnim != m_AnimJumpStart)
- return false;
-
- AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0);
- if (state.shortNameHash == m_CurAnim && state.normalizedTime >= 1f)
- return true;
-
- return false;
- }
-
- /// <summary>
- /// 结束
- /// </summary>
- /// <returns></returns>
- public bool IsJumpDone(float t = 1f)
- {
- if (m_CurState == State.End)
- {
- AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0);
- return state.shortNameHash == m_AnimJumpEnd && state.normalizedTime >= t;
- }
-
- return false;
- }
-
- /// <summary>
- /// 着地
- /// </summary>
- /// <returns></returns>
- public bool IsJumpGround()
- {
- return m_CurState == State.End && m_Collider.IsOnGround;
- }
-
- public void AddTrigger(Trigger trigger)
- {
- if (trigger == null || m_Triggers.Contains(trigger))
- return;
- m_Triggers.Add(trigger);
- }
-
+ int m_AnimJumpNeutralUpwards; + int m_AnimJumpNeutralDownwards; + int m_AnimJumpFwdUpwards; + int m_AnimJumpFwdDownwards; + int m_AnimJumpBackUpwards; + int m_AnimJumpBackDownwards; + int m_AnimJumpEnd; // on ground again + + int m_CurAnim; + Stage m_CurStage; + int m_CurUpMotion; + int m_CurDownMotion; + Vector3 m_CurInitVelocity; + + public Stage CurStage + { + get + { + return m_CurStage; + } + } + + public Direction CurDirection + { + get + { + return m_Dir; + } + } + + private List<Trigger> m_Triggers = new List<Trigger>(); + + bool m_SkipStart; + + public JumpState(JumpStateConfig config) + { + m_Body = config.body; + m_Collider = config.collider; + m_Animator = config.animator; + m_NeutralJumpSpeedY = config.neutralJumpSpeedY; + m_FowardJumpSpeedX = config.fowardJumpSpeedX; + m_BackwardJumpSpeedX = config.backwardJumpSpeedX; + m_AnimJumpStart = config.animJump; + m_AnimJumpNeutralUpwards = config.animNU; + m_AnimJumpNeutralDownwards = config.animND; + m_AnimJumpFwdUpwards = config.animFU; + m_AnimJumpFwdDownwards = config.animFD; + m_AnimJumpBackUpwards = config.animBU; + m_AnimJumpBackDownwards = config.animBD; + m_AnimJumpEnd = config.animJumpEnd; // on ground again + m_SkipStart = config.skipStart; + } + + public void SetDir(Direction dir) + { + m_Dir = dir; + } + + public override void OnEnter() + { + base.OnEnter(); + + m_CurAnim = 0; + + switch(m_Dir) + { + case Direction.Neutral: + m_CurUpMotion = m_AnimJumpNeutralUpwards; + m_CurDownMotion = m_AnimJumpNeutralDownwards; + m_CurInitVelocity = new Vector3(0, m_NeutralJumpSpeedY, 0); + break; + case Direction.Forward: + m_CurUpMotion = m_AnimJumpFwdUpwards; + m_CurDownMotion = m_AnimJumpFwdDownwards; + m_CurInitVelocity = new Vector3(m_FowardJumpSpeedX, m_NeutralJumpSpeedY, 0); + break; + case Direction.Backward: + m_CurUpMotion = m_AnimJumpBackUpwards; + m_CurDownMotion = m_AnimJumpBackDownwards; + m_CurInitVelocity = new Vector3(m_BackwardJumpSpeedX, m_NeutralJumpSpeedY, 0); + break; + } + + bool isOnGround = m_Collider.IsOnGround; + bool isUp = m_Body.Velocity.y > 0; + bool isDown = m_Body.Velocity.y < 0; + bool isFreeFall = Mathf.Approximately(m_Body.Velocity.y, 0); + + if (isOnGround && !m_SkipStart) + m_CurStage = Stage.Ready; + else if (isUp || isOnGround && m_SkipStart) + m_CurStage = Stage.Up; + else if (isDown || isFreeFall) + m_CurStage = Stage.Down; + } + + public override void OnUpdate() + { + foreach (var stateTrigger in m_Triggers) + { + if (stateTrigger.Update() && stateTrigger.Swallow) + return; + } + + AnimatorStateInfo motionInfo = m_Animator.GetCurrentAnimatorStateInfo(0); + + switch (m_CurStage) + { + case Stage.Ready: + if(m_CurAnim != m_AnimJumpStart) + { + m_Animator.CrossFade(m_AnimJumpStart, 0.2f); + m_CurAnim = m_AnimJumpStart; + } + if(motionInfo.shortNameHash == m_AnimJumpStart && motionInfo.normalizedTime >= 1f) + { + m_CurStage = Stage.Up; + } + break; + case Stage.Up: + if(m_CurAnim != m_CurUpMotion) + { + m_Body.LocalVelocity = m_CurInitVelocity; + m_Animator.CrossFade(m_CurUpMotion, 0.05f); + m_CurAnim = m_CurUpMotion; + } + if(m_Body.Velocity.y < 0) + { + m_CurStage = Stage.Down; + } + break; + case Stage.Down: + if(m_CurAnim != m_CurDownMotion) + { + m_Animator.CrossFade(m_CurDownMotion, 0.5f); + m_CurAnim = m_CurDownMotion; + } + if(m_Collider.IsOnGround) + { + m_CurStage = Stage.End; + } + break; + case Stage.End: + if(m_CurAnim != m_AnimJumpEnd) + { + m_Animator.CrossFade(m_AnimJumpEnd, 0.2f); + m_CurAnim = m_AnimJumpEnd; + } + break; + } + } + + public override void OnPhysicsUpdate() + { + base.OnPhysicsUpdate(); + } + + /// <summary> + /// 跳跃准备动作已经完毕 + /// </summary> + /// <returns></returns> + public bool IsJumpReady() + { + if (m_CurAnim != m_AnimJumpStart) + return false; + + AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0); + if (state.shortNameHash == m_CurAnim && state.normalizedTime >= 1f) + return true; + + return false; + } + + /// <summary> + /// 结束 + /// </summary> + /// <returns></returns> + public bool IsJumpDone(float t = 1f) + { + if (m_CurStage == Stage.End) + { + AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0); + return state.shortNameHash == m_AnimJumpEnd && state.normalizedTime >= t; + } + + return false; + } + + /// <summary> + /// 着地 + /// </summary> + /// <returns></returns> + public bool IsJumpGround() + { + return m_CurStage == Stage.End && m_Collider.IsOnGround; + } + + public void AddTrigger(Trigger trigger) + { + if (trigger == null || m_Triggers.Contains(trigger)) + return; + m_Triggers.Add(trigger); + } + }
\ No newline at end of file diff --git a/Assets/Scripts/Avatar/States/JumpState.cs.meta b/Assets/Scripts/Avatar/States/JumpState.cs.meta new file mode 100644 index 00000000..3d18db1c --- /dev/null +++ b/Assets/Scripts/Avatar/States/JumpState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3175c1ee1042e144b77c298e7b61eeb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs b/Assets/Scripts/Avatar/States/MoveState.cs index 61efd0cf..0fbfcddb 100644 --- a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs +++ b/Assets/Scripts/Avatar/States/MoveState.cs @@ -1,65 +1,65 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class MoveAbility : AbilityBase
-{
- Animator m_Animator;
- int m_AnimHash;
-
- /// <summary>
- /// 在跑动状态时可以切换的ability
- /// </summary>
- private List<Trigger> m_Triggers = new List<Trigger>();
-
- public MoveAbility(Animator animator, int animation)
- {
- m_Animator = animator;
- m_AnimHash = animation;
- }
-
- public override void OnInit()
- {
-
- }
-
- public override void OnDefend()
- {
- throw new System.NotImplementedException();
- }
-
- public override void OnEnter()
- {
- m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.1f);
-
- foreach (var trigger in m_Triggers)
- {
- trigger.Reset();
- }
- }
-
- public override void OnExit()
- {
- }
-
- public override void OnTranslate(AbilityBase to)
- {
- }
-
- public override void OnUpdate()
- {
- foreach (var abilityTrigger in m_Triggers)
- {
- if (abilityTrigger.Update() && abilityTrigger.Swallow)
- break;
- }
- }
-
- public void AddTrigger(Trigger trigger)
- {
- if (trigger == null || m_Triggers.Contains(trigger))
- return;
- m_Triggers.Add(trigger);
- }
-
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MoveState : StateBase +{ + Animator m_Animator; + int m_AnimHash; + + /// <summary> + /// 在跑动状态时可以切换的state + /// </summary> + private List<Trigger> m_Triggers = new List<Trigger>(); + + public MoveState(Animator animator, int animation) + { + m_Animator = animator; + m_AnimHash = animation; + } + + public override void OnInit() + { + + } + + public override void OnDefend() + { + throw new System.NotImplementedException(); + } + + public override void OnEnter() + { + m_Animator.CrossFadeInFixedTime(m_AnimHash, 0.1f); + + foreach (var trigger in m_Triggers) + { + trigger.Reset(); + } + } + + public override void OnExit() + { + } + + public override void OnTranslate(StateBase to) + { + } + + public override void OnUpdate() + { + foreach (var stateTrigger in m_Triggers) + { + if (stateTrigger.Update() && stateTrigger.Swallow) + break; + } + } + + public void AddTrigger(Trigger trigger) + { + if (trigger == null || m_Triggers.Contains(trigger)) + return; + m_Triggers.Add(trigger); + } + +} diff --git a/Assets/Scripts/Avatar/States/MoveState.cs.meta b/Assets/Scripts/Avatar/States/MoveState.cs.meta new file mode 100644 index 00000000..eb1dbbd7 --- /dev/null +++ b/Assets/Scripts/Avatar/States/MoveState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae20739ccc918064dbe538d303d4be99 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/UberAbility.cs b/Assets/Scripts/Avatar/States/UberState.cs index ca2e7c06..a0b6d940 100644 --- a/Assets/Scripts/Avatar/Abilities/UberAbility.cs +++ b/Assets/Scripts/Avatar/States/UberState.cs @@ -1,12 +1,12 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-// 一个角色只能有一个uber ability,用来处理状态的自动切换
-public abstract class UberAbility : AbilityBase
-{
- public abstract void OnUpdate();
-
- public abstract void OnPhysicsUpdate();
-
-}
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// 一个角色只能有一个uber state,用来处理状态的自动切换 +public abstract class UberState : StateBase +{ + public abstract void OnUpdate(); + + public abstract void OnPhysicsUpdate(); + +} diff --git a/Assets/Scripts/Avatar/States/UberState.cs.meta b/Assets/Scripts/Avatar/States/UberState.cs.meta new file mode 100644 index 00000000..b36ffc94 --- /dev/null +++ b/Assets/Scripts/Avatar/States/UberState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eafda132ea825cc46b32edfe09ebdecc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: |