diff options
Diffstat (limited to 'Assets/Scripts')
47 files changed, 1435 insertions, 1258 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: diff --git a/Assets/Scripts/Physics/PhysicsPrimitive.cs b/Assets/Scripts/Physics/PhysicsPrimitive.cs index c94aee1a..fde705fd 100644 --- a/Assets/Scripts/Physics/PhysicsPrimitive.cs +++ b/Assets/Scripts/Physics/PhysicsPrimitive.cs @@ -181,6 +181,8 @@ public abstract class PhysicsPrimitive : MonoBehaviour {
get
{
+ if (Mathf.Approximately(Bound.w, PhysicsWorld.Ground))
+ return true;
return Bound.w <= PhysicsWorld.Ground;
}
}
@@ -189,7 +191,8 @@ public abstract class PhysicsPrimitive : MonoBehaviour {
get
{
- return Bound.w > PhysicsWorld.Ground;
+ //return Bound.w > PhysicsWorld.Ground;
+ return !IsOnGround;
}
}
diff --git a/Assets/Scripts/Test/ArmorSoldierScript.cs b/Assets/Scripts/Test/ArmorSoldierScript.cs index b6863a23..dd4cd3e3 100644 --- a/Assets/Scripts/Test/ArmorSoldierScript.cs +++ b/Assets/Scripts/Test/ArmorSoldierScript.cs @@ -2,14 +2,21 @@ using System.Collections.Generic; using UnityEngine; -public class ArmorSoldierScript : Avatar +public partial class ArmorSoldierScript : Avatar, IInteractable { - int Anim_HurtFront; + public Animator m_Animator; + + void Awake()
+ {
+ m_Animator = GetComponent<Animator>();
+ } private void Start()
{
- base.Init();
- Anim_HurtFront = Animator.StringToHash("Hurt_Front");
+ base.Init();
+
+ SetupAnim();
+ SetupStates();
}
private void OnAnimatorMove() @@ -32,8 +39,6 @@ public class ArmorSoldierScript : Avatar public void Hurt()
{
- Animator animator = GetComponent<Animator>(); - animator.CrossFade(Anim_HurtFront, 0);
} public override void OnHurt(HurtInfo hurtInfo)
diff --git a/Assets/Scripts/Test/ArmorSoldierScript_Anim.cs b/Assets/Scripts/Test/ArmorSoldierScript_Anim.cs new file mode 100644 index 00000000..cf21a504 --- /dev/null +++ b/Assets/Scripts/Test/ArmorSoldierScript_Anim.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class ArmorSoldierScript : Avatar, IInteractable +{ + int Anim_Idle; + + int Anim_HurtFront; + + int Anim_LightHurt; + int Anim_MidiumHurt; + int Anim_HeavyHurt; + int Anim_GroundHurt; + int Anim_AirHurt; + + + void SetupAnim() + { + Anim_Idle = Animator.StringToHash("Idle"); + + Anim_HurtFront = Animator.StringToHash("Hurt_Front"); + Anim_LightHurt = Animator.StringToHash("Hurt_Light"); + Anim_MidiumHurt = Animator.StringToHash("Hurt_Midium"); + Anim_HeavyHurt = Animator.StringToHash("Hurt_Heavy"); + Anim_GroundHurt = Animator.StringToHash("Hurt_Ground"); + Anim_AirHurt = Animator.StringToHash("Hurt_Air"); + + } + +}
\ No newline at end of file diff --git a/Assets/Scripts/Test/ArmorSoldierScript_Anim.cs.meta b/Assets/Scripts/Test/ArmorSoldierScript_Anim.cs.meta new file mode 100644 index 00000000..212feda4 --- /dev/null +++ b/Assets/Scripts/Test/ArmorSoldierScript_Anim.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ff0f58fdd1c9834e858aa0dda2b0ff8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Test/ArmorSoldierScript_States.cs b/Assets/Scripts/Test/ArmorSoldierScript_States.cs new file mode 100644 index 00000000..67eca581 --- /dev/null +++ b/Assets/Scripts/Test/ArmorSoldierScript_States.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class ArmorSoldierScript : Avatar, IInteractable +{ + + void SetupStates() + { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // states + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + IdleState idle = new IdleState(m_Animator, Anim_Idle); + + HurtState lightHurt = new HurtState(m_Animator, Anim_LightHurt); + HurtState midiumHurt = new HurtState(m_Animator, Anim_MidiumHurt); + HurtState heavyHurt = new HurtState(m_Animator, Anim_HeavyHurt); + HurtState groundHurt = new HurtState(m_Animator, Anim_GroundHurt); + HurtState airHurt = new HurtState(m_Animator, Anim_AirHurt); + m_StateLightHurt = lightHurt; + m_StateMidiumHurt = midiumHurt; + m_StateHeavyHurt = heavyHurt; + m_StateGroundHurt = groundHurt; + m_StateAirHurt = airHurt; + + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // conditions + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ConditionInAir condInAir = new ConditionInAir(m_BodyCollider); + + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // actions + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ActionSwitchState switchToIdle = new ActionSwitchState(m_StateSystem, idle); + + Trigger trigger = null; + + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // state setup + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // air hurt + ConditionMotionAtEnd airAtEnd = new ConditionMotionAtEnd(m_Animator, Anim_AirHurt); + trigger = new Trigger(And(airAtEnd, Not(condInAir)), switchToIdle); + airHurt.AddTrigger(trigger); + + m_StateSystem.ForceStart(idle); + } + +}
\ No newline at end of file diff --git a/Assets/Scripts/Test/ArmorSoldierScript_States.cs.meta b/Assets/Scripts/Test/ArmorSoldierScript_States.cs.meta new file mode 100644 index 00000000..02336b68 --- /dev/null +++ b/Assets/Scripts/Test/ArmorSoldierScript_States.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f146c570f99fe2e4aad5f1312524413c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Test/SaionjiScript.cs b/Assets/Scripts/Test/SaionjiScript.cs index e2386350..4e3bf23f 100644 --- a/Assets/Scripts/Test/SaionjiScript.cs +++ b/Assets/Scripts/Test/SaionjiScript.cs @@ -24,7 +24,7 @@ public partial class SaionjiScript : Avatar [SerializeField]
private Weapon m_Weapon;
- public bool EnableAbilitySystem;
+ public bool EnableStateSystem;
public EffectHandler[] Effects;
@@ -45,14 +45,14 @@ public partial class SaionjiScript : Avatar GetAnimHash();
- if (EnableAbilitySystem)
- SetupAbilities();
+ if (EnableStateSystem)
+ SetupStates();
}
//private void Update()
//{
- // //if (EnableAbilitySystem)
- // // m_AbilitySystem.OnUpdate();
+ // //if (EnableStateSystem)
+ // // m_StateSystem.OnUpdate();
//}
// 更新顺序:
diff --git a/Assets/Scripts/Test/SaionjiScript_Ability.cs b/Assets/Scripts/Test/SaionjiScript_States.cs index 5fc92f62..68d09280 100644 --- a/Assets/Scripts/Test/SaionjiScript_Ability.cs +++ b/Assets/Scripts/Test/SaionjiScript_States.cs @@ -1,405 +1,382 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public partial class SaionjiScript : Avatar
-{
-
- ConditionBase Not(ConditionBase cond)
- {
- return new ConditionNot(cond);
- }
-
- ConditionBase And(ConditionBase c1, ConditionBase c2)
- {
- return new ConditionAnd(c1, c2);
- }
-
- 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;
- }
-
- ConditionBase Or(ConditionBase c1, ConditionBase c2)
- {
- return new ConditionOr(c1,c2);
- }
-
- /// <summary>
- /// 设置abilities
- /// </summary>
- void SetupAbilities()
- {
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // abilities
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- IdleAbility idle = new IdleAbility(animator, Anim_Idle);
-
- MoveAbility move = new MoveAbility(animator, Anim_Run);
- MoveAbility dash = new MoveAbility(animator, Anim_DashWithSword);
-
- JumpAbilityConfig jumpConfig = new JumpAbilityConfig
- {
- animator = animator,
- collider = m_BodyCollider,
- body = m_Body,
- neutralJumpSpeedY = 13f,
- fowardJumpSpeedX = 5f,
- backwardJumpSpeedX = -5f,
- animJump = Anim_JumpStart,
- animJumpEnd = Anim_JumpEnd,
- animNU = Anim_JumpUp,
- animND = Anim_JumpDown,
- animFU = Anim_JumpUp,
- animFD = Anim_JumpDown,
- animBU = Anim_JumpUp,
- animBD = Anim_JumpDown,
- skipStart = true,
- };
- JumpAbility jump = new JumpAbility(jumpConfig);
-
- AttackAbility airDash = new AttackAbility(animator, Anim_AirDash, m_Body);
-
- AttackAbilityConfig config;
-
- //招式会绑定一个motion
- HitDefination hitDef = new HitDefination
- {
- };
- AttackAbility attk1 = new AttackAbility(animator, Anim_LightAttack1, m_Body);
- attk1.AddHitDefination(hitDef);
- AttackAbility attk2 = new AttackAbility(animator, Anim_LightAttack2, m_Body);
- attk2.AddHitDefination(hitDef);
- AttackAbility attk3 = new AttackAbility(animator, Anim_LightAttack3, m_Body);
- attk3.AddHitDefination(hitDef);
- AttackAbility attk4 = new AttackAbility(animator, Anim_LightAttack4, m_Body);
- attk4.AddHitDefination(hitDef);
- AttackAbility attk5 = new AttackAbility(animator, Anim_LightAttack5, m_Body);
- attk5.AddHitDefination(hitDef);
- AttackAbility attkRush = new AttackAbility(animator, Anim_LightAttackRush, m_Body);
-
- config = new AttackAbilityConfig() {
- animator = this.animator,
- body = this.m_Body,
- motion = Anim_SideKick,
- velocity = new Vector3(20, 1.5f, 0)
- };
- AttackAbility sideKick = new AttackAbility(config);
-
- AttackAbility sideKickRush = new AttackAbility(animator, Anim_SideKickRush, m_Body);
- AttackAbility superKick = new AttackAbility(animator, Anim_SuperKick, m_Body);
- AttackAbility gun1 = new AttackAbility(animator, Anim_Gun1, m_Body);
- AttackAbility gun2 = new AttackAbility(animator, Anim_Gun2, m_Body);
- AttackAbility gun3 = new AttackAbility(animator, Anim_Gun3, m_Body);
- AttackAbility gun4 = new AttackAbility(animator, Anim_Gun4, m_Body);
-
- AttackAbility airAttk1 = new AttackAbility(animator, Anim_AirAttack1, m_Body);
- hitDef = new HitDefination
- {
- hurtAddForce = new Vector3(1000,2000,0)
- };
- airAttk1.AddHitDefination(hitDef);
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // actions
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ActionTurn180 turn180 = new ActionTurn180(this.transform);
- ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform);
- ActionTowardRight towardRight = new ActionTowardRight(this.transform);
-
- ActionJump toJump = new ActionJump(m_AbilitySystem, jump);
- ActionJumpForward toJumpForward = new ActionJumpForward(m_AbilitySystem, jump);
-
- ActionSwitchAbility switchToMove = new ActionSwitchAbility(m_AbilitySystem, move);
- ActionSwitchAbility switchToIdle = new ActionSwitchAbility(m_AbilitySystem, idle);
- ActionSwitchAbility switchToAttk1 = new ActionSwitchAbility(m_AbilitySystem, attk1);
- ActionSwitchAbility switchToAttk2 = new ActionSwitchAbility(m_AbilitySystem, attk2);
- ActionSwitchAbility switchToAttk3 = new ActionSwitchAbility(m_AbilitySystem, attk3);
- ActionSwitchAbility switchToAttk4 = new ActionSwitchAbility(m_AbilitySystem, attk4);
- ActionSwitchAbility switchToAttk5 = new ActionSwitchAbility(m_AbilitySystem, attk5);
- ActionSwitchAbility switchToAttkRush = new ActionSwitchAbility(m_AbilitySystem, attkRush);
- ActionSwitchAbility switchToSideKick = new ActionSwitchAbility(m_AbilitySystem, sideKick);
- ActionSwitchAbility switchToSideKickRush = new ActionSwitchAbility(m_AbilitySystem, sideKickRush);
- ActionSwitchAbility switchToDash = new ActionSwitchAbility(m_AbilitySystem, dash);
- ActionSwitchAbility switchToSuperKick = new ActionSwitchAbility(m_AbilitySystem, superKick);
- ActionSwitchAbility switchToGun1 = new ActionSwitchAbility(m_AbilitySystem, gun1);
- ActionSwitchAbility switchToGun2 = new ActionSwitchAbility(m_AbilitySystem, gun2);
- ActionSwitchAbility switchToGun3 = new ActionSwitchAbility(m_AbilitySystem, gun3);
- ActionSwitchAbility switchToGun4 = new ActionSwitchAbility(m_AbilitySystem, gun4);
-
- ActionSwitchAbility switchToAirDash = new ActionSwitchAbility(m_AbilitySystem, airDash);
- ActionSwitchAbility switchToAirAttk1 = new ActionSwitchAbility(m_AbilitySystem, airAttk1);
-
- ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord();
-
- ActionEffectGhost enableGhost = new ActionEffectGhost(Effects[0] as CharacterGhostEffect);
- ActionDisableGhost disableGhost = new ActionDisableGhost(Effects[0] as CharacterGhostEffect);
-
- ActionActivateAfterImage enableAfterImage = new ActionActivateAfterImage(true);
- ActionActivateAfterImage disaleAfterImage = new ActionActivateAfterImage(false);
- ActionAfterImageInterval smallAfterImageInterval = new ActionAfterImageInterval(2);
- ActionAfterImageInterval midiumAfterImageInterval = new ActionAfterImageInterval(5);
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // 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 condUpCmd = new ConditionCommand(GamepadButton.Up);
- ConditionCommand condTriangleCmd = new ConditionCommand(GamepadButton.Triangle);
- ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle);
- ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross);
- ConditionCommand condSquareCmd = new ConditionCommand(GamepadButton.Square);
- ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform);
- ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform);
- ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List<GamepadButton>{GamepadButton.Right, GamepadButton.Right }, 0.8f);
- ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Left, GamepadButton.Left }, 0.8f);
- ConditionCommandSeq condDRC = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f);
- ConditionCommandSeq condDLC = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Down, GamepadButton.Left, GamepadButton.Circle}, 1f);
-
- ConditionHit condIsHit = new ConditionHit(this);
-
- ConditionJumpDone condJumpDone = new ConditionJumpDone(jump);
- ConditionJumpOnGround condJumpOnGround = new ConditionJumpOnGround(jump);
-
- ConditionInAir condInAir = new ConditionInAir(m_BodyCollider);
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // common triggers
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- Trigger triggerTurnRight = new Trigger(And(condRightCmd, Not(condTowardRight)), towardRight);
- Trigger triggerTurnLeft = new Trigger(And(condLeftCmd, Not(condTowardLeft)), towardLeft);
-
- Trigger trigger = null;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // ability setup
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- // idle ability
- trigger = new Trigger(condTriangleCmd, toJump) ;
- idle.AddTrigger(trigger);
- trigger = new Trigger(And(condTowardRight, condDRC), new List<ActionBase> { wipeCmdRecord, switchToSuperKick });
- idle.AddTrigger(trigger);
- trigger = new Trigger(And(condTowardLeft, condDLC), new List<ActionBase> { wipeCmdRecord, switchToSuperKick });
- idle.AddTrigger(trigger);
- trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash });
- idle.AddTrigger(trigger);
- trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash });
- idle.AddTrigger(trigger);
- trigger = new Trigger(condRightButtonHold, new List<ActionBase> { switchToMove, towardRight });
- idle.AddTrigger(trigger);
- trigger = new Trigger(condLeftButtonHold, new List<ActionBase> { switchToMove, towardLeft });
- idle.AddTrigger(trigger);
- trigger = new Trigger(condCircleCmd, switchToAttk1);
- idle.AddTrigger(trigger);
- trigger = new Trigger(condCrossCmd, switchToSideKick);
- idle.AddTrigger(trigger);
- trigger = new Trigger(condSquareCmd, switchToGun1);
- idle.AddTrigger(trigger);
- idle.AddTrigger(triggerTurnRight);
- idle.AddTrigger(triggerTurnLeft);
-
- // move ability
- //trigger = new Trigger(Or(Ands(condRightButtonHold, condTowardRight, condTriangleCmd), Ands(condLeftButtonHold, condTowardLeft, condTriangleCmd)), toJumpForward);
- //move.AddTrigger(trigger);
- trigger = new Trigger(condTriangleCmd, toJump);
- move.AddTrigger(trigger);
- trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash, });
- move.AddTrigger(trigger);
- trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash });
- move.AddTrigger(trigger);
- trigger = new Trigger(And(condRightButtonHold, condCircleCmd), new List<ActionBase> { towardRight, switchToAttkRush });
- move.AddTrigger(trigger);
- trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List<ActionBase> { towardLeft, switchToAttkRush });
- move.AddTrigger(trigger);
- trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List<ActionBase> { towardRight, switchToSideKickRush });
- move.AddTrigger(trigger);
- trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List<ActionBase> { towardLeft, switchToSideKickRush });
- 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);
-
- // jump ability
- trigger = new Trigger(Ands(condInAir, condRightCmd, condRight2Cmd), new List<ActionBase> { towardRight, switchToAirDash, new ActionSetVelocity(m_Body, new Vector3(25, 0, 0)), new ActionDontUseGravity(m_Body), enableAfterImage, midiumAfterImageInterval});
- jump.AddTrigger(trigger);
- trigger = new Trigger(Ands(condInAir, condLeftCmd, condLeft2Cmd), new List<ActionBase> { towardLeft, switchToAirDash, new ActionSetVelocity(m_Body, new Vector3(-25, 0, 0)), new ActionDontUseGravity(m_Body), enableAfterImage, midiumAfterImageInterval });
- jump.AddTrigger(trigger);
- trigger = new Trigger(Ands(condInAir, condCircleCmd), new List<ActionBase> { switchToAirAttk1, new ActionSetLocalVelocity(m_Body, new Vector3(0, 0, 0)), new ActionDontUseGravity(m_Body), enableAfterImage, smallAfterImageInterval});
- jump.AddTrigger(trigger);
- ConditionCheckJumpState condCheckJump = new ConditionCheckJumpState(jump, JumpAbility.State.None, JumpAbility.Direction.Neutral);
- trigger = new Trigger(And(condRightButtonHold, condCheckJump), new List<ActionBase> { towardRight, new ActionSetVelocityX(m_Body, 4)}, TriggerOnlyOnce.Off, TriggerSwallow.Off);
- jump.AddTrigger(trigger);
- trigger = new Trigger(And(condLeftButtonHold, condCheckJump), new List<ActionBase> { towardLeft, new ActionSetVelocityX(m_Body,-4) }, TriggerOnlyOnce.Off, TriggerSwallow.Off);
- jump.AddTrigger(trigger);
- //trigger = new Trigger(Ands(condCheckJump, Not(condRightButtonHold), Not(condLeftButtonHold)), new ActionSetVelocityX(m_Body, 0), TriggerOnlyOnce.Off, TriggerSwallow.Off);
- //jump.AddTrigger(trigger);
- trigger = new Trigger(condJumpOnGround, new ActionSetVelocity(m_Body, Vector3.zero), TriggerOnlyOnce.On, TriggerSwallow.Off);
- jump.AddTrigger(trigger);
- trigger = new Trigger(Ands(new ConditionJumpDone(jump, 0.4f), condJumpOnGround, Or(condRightButtonHold, condLeftButtonHold)), switchToMove);
- jump.AddTrigger(trigger);
- trigger = new Trigger(condJumpDone, switchToIdle);
- jump.AddTrigger(trigger);
-
- // dash ability
- trigger = new Trigger(And(new ConditionMotionRange(animator, 0.5f, 1.0f), condCircleCmd), switchToAttk1);
- dash.AddTrigger(trigger);
- trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_DashWithSword), switchToIdle);
- dash.AddTrigger(trigger);
-
- // attack abilities
- float expireTime = 0.3f;
-
- // sword normal attack
- ConditionMotionAtEnd condAttk1AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack1);
- trigger = new Trigger(And(condAttk1AtEnd, condCircleCmd), switchToAttk2);
- attk1.AddTrigger(trigger);
- ConditionAttkExpireTime condAttk1ExpireTime = new ConditionAttkExpireTime(attk1, expireTime);
- trigger = new Trigger(condAttk1ExpireTime, switchToIdle);
- attk1.AddTrigger(trigger);
- attk1.AddTrigger(triggerTurnRight);
- attk1.AddTrigger(triggerTurnLeft);
- //trigger = new Trigger(condIsHit, new ActionLog("hit!!!"));
- //attk1.AddLateTrigger(trigger);
-
- //ConditionMotionRange condAttkRushGhostRange = new ConditionMotionRange(animator, 0f, 0.8f);
- //trigger = new Trigger(condAttkRushGhostRange, enableGhost, false);
- //attkRush.AddTrigger(trigger);
- //ConditionMotionRange condAttkRushGhostDisableRange = new ConditionMotionRange(animator, 0.8f, 10f);
- //trigger = new Trigger(condAttkRushGhostDisableRange, disableGhost, false);
- //attkRush.AddTrigger(trigger);
- ConditionMotionRange condAttkRushAtRange = new ConditionMotionRange(animator, 0.5f, 1f);
- trigger = new Trigger(And(condAttkRushAtRange, condCircleCmd), switchToAttk2);
- attkRush.AddTrigger(trigger);
- //trigger = new Trigger(And(And(condAttkRushAtRange, condTowardRight), condRightCmd), switchToAttkRush);
- //attkRush.AddTrigger(trigger);
- //trigger = new Trigger(And(And(condAttkRushAtRange, condTowardLeft), condLeftCmd), switchToAttkRush);
- //attkRush.AddTrigger(trigger);
- ConditionAttkExpireTime condAttkRushExpireTime = new ConditionAttkExpireTime(attkRush, expireTime);
- trigger = new Trigger(condAttkRushExpireTime, switchToIdle);
- attkRush.AddTrigger(trigger);
- //attkRush.AddTrigger(triggerTurnRight);
- //attkRush.AddTrigger(triggerTurnLeft);
-
- ConditionMotionAtEnd condAttk2AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack2);
- trigger = new Trigger(And(condAttk2AtEnd, condCircleCmd), switchToAttk3);
- attk2.AddTrigger(trigger);
- ConditionAttkExpireTime condAttk2ExpireTime = new ConditionAttkExpireTime(attk2, expireTime);
- trigger = new Trigger(condAttk2ExpireTime, switchToIdle);
- attk2.AddTrigger(trigger);
- attk2.AddTrigger(triggerTurnRight);
- attk2.AddTrigger(triggerTurnLeft);
-
- ConditionMotionAtEnd condAttk3AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack3);
- trigger = new Trigger(And(condAttk3AtEnd, condCircleCmd), switchToAttk4);
- attk3.AddTrigger(trigger);
- ConditionAttkExpireTime condAttk3ExpireTime = new ConditionAttkExpireTime(attk3, expireTime);
- trigger = new Trigger(condAttk3ExpireTime, switchToIdle);
- attk3.AddTrigger(trigger);
- attk3.AddTrigger(triggerTurnRight);
- attk3.AddTrigger(triggerTurnLeft);
-
- ConditionMotionAtEnd condAttk4AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack4);
- trigger = new Trigger(And(condAttk4AtEnd, condCircleCmd), switchToAttk5);
- attk4.AddTrigger(trigger);
- ConditionAttkExpireTime condAttk4ExpireTime = new ConditionAttkExpireTime(attk4, expireTime);
- trigger = new Trigger(condAttk4ExpireTime, switchToIdle);
- attk4.AddTrigger(trigger);
- attk4.AddTrigger(triggerTurnRight);
- attk4.AddTrigger(triggerTurnLeft);
-
- ConditionMotionAtEnd condAttk5AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack5);
- trigger = new Trigger(condAttk5AtEnd, switchToIdle);
- attk5.AddTrigger(trigger);
- ConditionAttkExpireTime condAttk5ExpireTime = new ConditionAttkExpireTime(attk5, expireTime);
- trigger = new Trigger(condAttk5ExpireTime, switchToIdle);
- attk5.AddTrigger(trigger);
- attk5.AddTrigger(triggerTurnRight);
- attk5.AddTrigger(triggerTurnLeft);
-
- // side kick normal
- ConditionMotionAtEnd condKickMotionEnd = new ConditionMotionAtEnd(animator, Anim_SideKick);
- trigger = new Trigger(condKickMotionEnd, new ActionSetVelocity(m_Body, Vector3.zero), TriggerOnlyOnce.On, TriggerSwallow.Off);
- sideKick.AddTrigger(trigger);
- ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime);
- trigger = new Trigger(condSideKickExpireTime, switchToIdle);
- sideKick.AddTrigger(trigger);
-
- // side kick rush
- ConditionAttkExpireTime condSideKickRushExpireTime = new ConditionAttkExpireTime(sideKickRush, expireTime);
- trigger = new Trigger(condSideKickRushExpireTime, switchToIdle);
- sideKickRush.AddTrigger(trigger);
- ConditionMotionRange condSideKickRushMotionRange = new ConditionMotionRange(animator, 0.5f, 10f);
- trigger = new Trigger(And(condSideKickRushMotionRange, And(condRightButtonHold, condCircleCmd)), new List<ActionBase> { towardRight, switchToAttkRush });
- sideKickRush.AddTrigger(trigger);
- trigger = new Trigger(And(condSideKickRushMotionRange, And(condLeftButtonHold, condCircleCmd)), new List<ActionBase> { towardLeft, switchToAttkRush });
- sideKickRush.AddTrigger(trigger);
-
- // super kick combo
- ConditionAttkExpireTime condSuperKickExpireTime = new ConditionAttkExpireTime(superKick, expireTime);
- trigger = new Trigger(condSuperKickExpireTime, switchToIdle);
- superKick.AddTrigger(trigger);
-
- // gun normal
- ConditionMotionAtEnd condGun1AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun1);
- trigger = new Trigger(And(condGun1AtEnd, condSquareCmd), switchToGun2);
- gun1.AddTrigger(trigger);
- ConditionAttkExpireTime condGun1ExpireTime = new ConditionAttkExpireTime(gun1, expireTime);
- trigger = new Trigger(condGun1ExpireTime, switchToIdle);
- gun1.AddTrigger(trigger);
-
- ConditionMotionAtEnd condGun2AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun2);
- trigger = new Trigger(And(condGun2AtEnd, condSquareCmd), switchToGun3);
- gun2.AddTrigger(trigger);
- ConditionAttkExpireTime condGun2ExpireTime = new ConditionAttkExpireTime(gun2, expireTime);
- trigger = new Trigger(condGun2ExpireTime, switchToIdle);
- gun2.AddTrigger(trigger);
-
- ConditionMotionAtEnd condGun3AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun3);
- trigger = new Trigger(And(condGun3AtEnd, condSquareCmd), switchToGun4);
- gun3.AddTrigger(trigger);
- ConditionAttkExpireTime condGun3ExpireTime = new ConditionAttkExpireTime(gun3, expireTime);
- trigger = new Trigger(condGun3ExpireTime, switchToIdle);
- gun3.AddTrigger(trigger);
-
- ConditionAttkExpireTime condGun4ExpireTime = new ConditionAttkExpireTime(gun4, expireTime);
- trigger = new Trigger(condGun4ExpireTime, switchToIdle);
- gun4.AddTrigger(trigger);
- ConditionMotionRange condGun4MotionRange = new ConditionMotionRange(animator, 0.6f, 1f);
- trigger = new Trigger(And(condGun4MotionRange, condRight2Cmd), new List<ActionBase> { switchToDash, towardRight });
- gun4.AddTrigger(trigger);
- trigger = new Trigger(And(condGun4MotionRange, condLeft2Cmd), new List<ActionBase> { switchToDash, towardLeft });
- gun4.AddTrigger(trigger);
-
- // air dash
- trigger = new Trigger(new ConditionMotionRange(animator, 0.8f, 1f), disaleAfterImage, TriggerOnlyOnce.On, TriggerSwallow.Off);
- airDash.AddTrigger(trigger);
- trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_AirDash), new List<ActionBase> { new ActionSetVelocity(m_Body, Vector3.zero), new ActionUseGravity(m_Body), toJump });
- airDash.AddTrigger(trigger);
-
- trigger = new Trigger(new ConditionMotionRange(animator, 0.18f, 1f), new ActionPlayEffect("Air_Attk1", this, new Vector3(-136.805f, 0, 0), new Vector3(0.8f, 0.8f, 0.8f)), TriggerOnlyOnce.On, TriggerSwallow.Off);
- airAttk1.AddTrigger(trigger);
- trigger = new Trigger(new ConditionMotionRange(animator, 0.6f,1f), disaleAfterImage, TriggerOnlyOnce.On, TriggerSwallow.Off);
- airAttk1.AddTrigger(trigger);
- trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_AirAttack1), new List<ActionBase> { new ActionSetVelocity(m_Body, Vector3.zero), new ActionUseGravity(m_Body), toJump});
- airAttk1.AddTrigger(trigger);
-
- m_AbilitySystem.ForceStart(idle);
- }
-
+using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class SaionjiScript : Avatar +{ + + /// <summary> + /// 设置states + /// </summary> + void SetupStates() + { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // states + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + IdleState idle = new IdleState(animator, Anim_Idle); + + MoveState move = new MoveState(animator, Anim_Run); + MoveState dash = new MoveState(animator, Anim_DashWithSword); + + JumpStateConfig jumpConfig = new JumpStateConfig + { + animator = animator, + collider = m_BodyCollider, + body = m_Body, + neutralJumpSpeedY = 13f, + fowardJumpSpeedX = 5f, + backwardJumpSpeedX = -5f, + animJump = Anim_JumpStart, + animJumpEnd = Anim_JumpEnd, + animNU = Anim_JumpUp, + animND = Anim_JumpDown, + animFU = Anim_JumpUp, + animFD = Anim_JumpDown, + animBU = Anim_JumpUp, + animBD = Anim_JumpDown, + skipStart = true, + }; + JumpState jump = new JumpState(jumpConfig); + + AttackState airDash = new AttackState(animator, Anim_AirDash, m_Body); + + AttackStateConfig config; + + //招式会绑定一个motion + HitDefination hitDef = new HitDefination + { + type = HitType.Air, + hurtAddForce = new Vector3(0, 10000, 0) + }; + AttackState attk1 = new AttackState(animator, Anim_LightAttack1, m_Body); + attk1.AddHitDefination(hitDef); + AttackState attk2 = new AttackState(animator, Anim_LightAttack2, m_Body); + attk2.AddHitDefination(hitDef); + AttackState attk3 = new AttackState(animator, Anim_LightAttack3, m_Body); + attk3.AddHitDefination(hitDef); + AttackState attk4 = new AttackState(animator, Anim_LightAttack4, m_Body); + attk4.AddHitDefination(hitDef); + AttackState attk5 = new AttackState(animator, Anim_LightAttack5, m_Body); + attk5.AddHitDefination(hitDef); + AttackState attkRush = new AttackState(animator, Anim_LightAttackRush, m_Body); + + config = new AttackStateConfig() { + animator = this.animator, + body = this.m_Body, + motion = Anim_SideKick, + velocity = new Vector3(20, 1.5f, 0) + }; + AttackState sideKick = new AttackState(config); + + AttackState sideKickRush = new AttackState(animator, Anim_SideKickRush, m_Body); + AttackState superKick = new AttackState(animator, Anim_SuperKick, m_Body); + AttackState gun1 = new AttackState(animator, Anim_Gun1, m_Body); + AttackState gun2 = new AttackState(animator, Anim_Gun2, m_Body); + AttackState gun3 = new AttackState(animator, Anim_Gun3, m_Body); + AttackState gun4 = new AttackState(animator, Anim_Gun4, m_Body); + + AttackState airAttk1 = new AttackState(animator, Anim_AirAttack1, m_Body); + hitDef = new HitDefination + { + type = HitType.Air, + hurtAddForce = new Vector3(0,5000,0) + }; + airAttk1.AddHitDefination(hitDef); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // actions + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ActionTurn180 turn180 = new ActionTurn180(this.transform); + ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform); + ActionTowardRight towardRight = new ActionTowardRight(this.transform); + + ActionJump toJump = new ActionJump(m_StateSystem, jump); + ActionJumpForward toJumpForward = new ActionJumpForward(m_StateSystem, jump); + + ActionSwitchState switchToMove = new ActionSwitchState(m_StateSystem, move); + ActionSwitchState switchToIdle = new ActionSwitchState(m_StateSystem, idle); + ActionSwitchState switchToAttk1 = new ActionSwitchState(m_StateSystem, attk1); + ActionSwitchState switchToAttk2 = new ActionSwitchState(m_StateSystem, attk2); + ActionSwitchState switchToAttk3 = new ActionSwitchState(m_StateSystem, attk3); + ActionSwitchState switchToAttk4 = new ActionSwitchState(m_StateSystem, attk4); + ActionSwitchState switchToAttk5 = new ActionSwitchState(m_StateSystem, attk5); + ActionSwitchState switchToAttkRush = new ActionSwitchState(m_StateSystem, attkRush); + ActionSwitchState switchToSideKick = new ActionSwitchState(m_StateSystem, sideKick); + ActionSwitchState switchToSideKickRush = new ActionSwitchState(m_StateSystem, sideKickRush); + ActionSwitchState switchToDash = new ActionSwitchState(m_StateSystem, dash); + ActionSwitchState switchToSuperKick = new ActionSwitchState(m_StateSystem, superKick); + ActionSwitchState switchToGun1 = new ActionSwitchState(m_StateSystem, gun1); + ActionSwitchState switchToGun2 = new ActionSwitchState(m_StateSystem, gun2); + ActionSwitchState switchToGun3 = new ActionSwitchState(m_StateSystem, gun3); + ActionSwitchState switchToGun4 = new ActionSwitchState(m_StateSystem, gun4); + + ActionSwitchState switchToAirDash = new ActionSwitchState(m_StateSystem, airDash); + ActionSwitchState switchToAirAttk1 = new ActionSwitchState(m_StateSystem, airAttk1); + + ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord(); + + ActionEffectGhost enableGhost = new ActionEffectGhost(Effects[0] as CharacterGhostEffect); + ActionDisableGhost disableGhost = new ActionDisableGhost(Effects[0] as CharacterGhostEffect); + + ActionActivateAfterImage enableAfterImage = new ActionActivateAfterImage(true); + ActionActivateAfterImage disaleAfterImage = new ActionActivateAfterImage(false); + ActionAfterImageInterval smallAfterImageInterval = new ActionAfterImageInterval(2); + ActionAfterImageInterval midiumAfterImageInterval = new ActionAfterImageInterval(5); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 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 condUpCmd = new ConditionCommand(GamepadButton.Up); + ConditionCommand condTriangleCmd = new ConditionCommand(GamepadButton.Triangle); + ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle); + ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross); + ConditionCommand condSquareCmd = new ConditionCommand(GamepadButton.Square); + ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform); + ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform); + ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List<GamepadButton>{GamepadButton.Right, GamepadButton.Right }, 0.8f); + ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Left, GamepadButton.Left }, 0.8f); + ConditionCommandSeq condDRC = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f); + ConditionCommandSeq condDLC = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Down, GamepadButton.Left, GamepadButton.Circle}, 1f); + + ConditionHit condIsHit = new ConditionHit(this); + + ConditionJumpDone condJumpDone = new ConditionJumpDone(jump); + ConditionJumpOnGround condJumpOnGround = new ConditionJumpOnGround(jump); + + ConditionInAir condInAir = new ConditionInAir(m_BodyCollider); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // common triggers + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Trigger triggerTurnRight = new Trigger(And(condRightCmd, Not(condTowardRight)), towardRight); + Trigger triggerTurnLeft = new Trigger(And(condLeftCmd, Not(condTowardLeft)), towardLeft); + + Trigger trigger = null; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // state setup + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // idle state + trigger = new Trigger(condTriangleCmd, toJump) ; + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardRight, condDRC), new List<ActionBase> { wipeCmdRecord, switchToSuperKick }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, condDLC), new List<ActionBase> { wipeCmdRecord, switchToSuperKick }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash }); + idle.AddTrigger(trigger); + trigger = new Trigger(condRightButtonHold, new List<ActionBase> { switchToMove, towardRight }); + idle.AddTrigger(trigger); + trigger = new Trigger(condLeftButtonHold, new List<ActionBase> { switchToMove, towardLeft }); + idle.AddTrigger(trigger); + trigger = new Trigger(condCircleCmd, switchToAttk1); + idle.AddTrigger(trigger); + trigger = new Trigger(condCrossCmd, switchToSideKick); + idle.AddTrigger(trigger); + trigger = new Trigger(condSquareCmd, switchToGun1); + idle.AddTrigger(trigger); + idle.AddTrigger(triggerTurnRight); + idle.AddTrigger(triggerTurnLeft); + + // move state + //trigger = new Trigger(Or(Ands(condRightButtonHold, condTowardRight, condTriangleCmd), Ands(condLeftButtonHold, condTowardLeft, condTriangleCmd)), toJumpForward); + //move.AddTrigger(trigger); + trigger = new Trigger(condTriangleCmd, toJump); + move.AddTrigger(trigger); + trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash, }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condRightButtonHold, condCircleCmd), new List<ActionBase> { towardRight, switchToAttkRush }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List<ActionBase> { towardLeft, switchToAttkRush }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List<ActionBase> { towardRight, switchToSideKickRush }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List<ActionBase> { towardLeft, switchToSideKickRush }); + 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); + + // jump state + trigger = new Trigger(condJumpOnGround, new ActionSetVelocity(m_Body, Vector3.zero), TriggerOnlyOnce.On, TriggerSwallow.Off); + jump.AddTrigger(trigger); + trigger = new Trigger(Ands(condInAir, condRightCmd, condRight2Cmd), new List<ActionBase> { towardRight, switchToAirDash, new ActionSetVelocity(m_Body, new Vector3(25, 0, 0)), new ActionDontUseGravity(m_Body), enableAfterImage, midiumAfterImageInterval}); + jump.AddTrigger(trigger); + trigger = new Trigger(Ands(condInAir, condLeftCmd, condLeft2Cmd), new List<ActionBase> { towardLeft, switchToAirDash, new ActionSetVelocity(m_Body, new Vector3(-25, 0, 0)), new ActionDontUseGravity(m_Body), enableAfterImage, midiumAfterImageInterval }); + jump.AddTrigger(trigger); + trigger = new Trigger(Ands(condInAir, condCircleCmd), new List<ActionBase> { switchToAirAttk1, new ActionSetLocalVelocity(m_Body, new Vector3(0, 0, 0)), new ActionDontUseGravity(m_Body), enableAfterImage, smallAfterImageInterval}); + jump.AddTrigger(trigger); + ConditionCheckJumpState condCheckJump = new ConditionCheckJumpState(jump, JumpState.Stage.None, JumpState.Direction.Neutral); + trigger = new Trigger(And(condRightButtonHold, condCheckJump), new List<ActionBase> { towardRight, new ActionSetVelocityX(m_Body, 4)}, TriggerOnlyOnce.Off, TriggerSwallow.Off); + jump.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, condCheckJump), new List<ActionBase> { towardLeft, new ActionSetVelocityX(m_Body,-4) }, TriggerOnlyOnce.Off, TriggerSwallow.Off); + jump.AddTrigger(trigger); + //trigger = new Trigger(Ands(condCheckJump, Not(condRightButtonHold), Not(condLeftButtonHold)), new ActionSetVelocityX(m_Body, 0), TriggerOnlyOnce.Off, TriggerSwallow.Off); + //jump.AddTrigger(trigger); + trigger = new Trigger(Ands(new ConditionJumpDone(jump, 0.4f), condJumpOnGround, Or(condRightButtonHold, condLeftButtonHold)), switchToMove); + jump.AddTrigger(trigger); + trigger = new Trigger(condJumpDone, switchToIdle); + jump.AddTrigger(trigger); + + // dash state + trigger = new Trigger(And(new ConditionMotionRange(animator, 0.5f, 1.0f), condCircleCmd), switchToAttk1); + dash.AddTrigger(trigger); + trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_DashWithSword), switchToIdle); + dash.AddTrigger(trigger); + + // attack states + float expireTime = 0.3f; + + // sword normal attack + ConditionMotionAtEnd condAttk1AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack1); + trigger = new Trigger(And(condAttk1AtEnd, condCircleCmd), switchToAttk2); + attk1.AddTrigger(trigger); + ConditionAttkExpireTime condAttk1ExpireTime = new ConditionAttkExpireTime(attk1, expireTime); + trigger = new Trigger(condAttk1ExpireTime, switchToIdle); + attk1.AddTrigger(trigger); + attk1.AddTrigger(triggerTurnRight); + attk1.AddTrigger(triggerTurnLeft); + //trigger = new Trigger(condIsHit, new ActionLog("hit!!!")); + //attk1.AddLateTrigger(trigger); + + //ConditionMotionRange condAttkRushGhostRange = new ConditionMotionRange(animator, 0f, 0.8f); + //trigger = new Trigger(condAttkRushGhostRange, enableGhost, false); + //attkRush.AddTrigger(trigger); + //ConditionMotionRange condAttkRushGhostDisableRange = new ConditionMotionRange(animator, 0.8f, 10f); + //trigger = new Trigger(condAttkRushGhostDisableRange, disableGhost, false); + //attkRush.AddTrigger(trigger); + ConditionMotionRange condAttkRushAtRange = new ConditionMotionRange(animator, 0.5f, 1f); + trigger = new Trigger(And(condAttkRushAtRange, condCircleCmd), switchToAttk2); + attkRush.AddTrigger(trigger); + //trigger = new Trigger(And(And(condAttkRushAtRange, condTowardRight), condRightCmd), switchToAttkRush); + //attkRush.AddTrigger(trigger); + //trigger = new Trigger(And(And(condAttkRushAtRange, condTowardLeft), condLeftCmd), switchToAttkRush); + //attkRush.AddTrigger(trigger); + ConditionAttkExpireTime condAttkRushExpireTime = new ConditionAttkExpireTime(attkRush, expireTime); + trigger = new Trigger(condAttkRushExpireTime, switchToIdle); + attkRush.AddTrigger(trigger); + //attkRush.AddTrigger(triggerTurnRight); + //attkRush.AddTrigger(triggerTurnLeft); + + ConditionMotionAtEnd condAttk2AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack2); + trigger = new Trigger(And(condAttk2AtEnd, condCircleCmd), switchToAttk3); + attk2.AddTrigger(trigger); + ConditionAttkExpireTime condAttk2ExpireTime = new ConditionAttkExpireTime(attk2, expireTime); + trigger = new Trigger(condAttk2ExpireTime, switchToIdle); + attk2.AddTrigger(trigger); + attk2.AddTrigger(triggerTurnRight); + attk2.AddTrigger(triggerTurnLeft); + + ConditionMotionAtEnd condAttk3AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack3); + trigger = new Trigger(And(condAttk3AtEnd, condCircleCmd), switchToAttk4); + attk3.AddTrigger(trigger); + ConditionAttkExpireTime condAttk3ExpireTime = new ConditionAttkExpireTime(attk3, expireTime); + trigger = new Trigger(condAttk3ExpireTime, switchToIdle); + attk3.AddTrigger(trigger); + attk3.AddTrigger(triggerTurnRight); + attk3.AddTrigger(triggerTurnLeft); + + ConditionMotionAtEnd condAttk4AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack4); + trigger = new Trigger(And(condAttk4AtEnd, condCircleCmd), switchToAttk5); + attk4.AddTrigger(trigger); + ConditionAttkExpireTime condAttk4ExpireTime = new ConditionAttkExpireTime(attk4, expireTime); + trigger = new Trigger(condAttk4ExpireTime, switchToIdle); + attk4.AddTrigger(trigger); + attk4.AddTrigger(triggerTurnRight); + attk4.AddTrigger(triggerTurnLeft); + + ConditionMotionAtEnd condAttk5AtEnd = new ConditionMotionAtEnd(animator, Anim_LightAttack5); + trigger = new Trigger(condAttk5AtEnd, switchToIdle); + attk5.AddTrigger(trigger); + ConditionAttkExpireTime condAttk5ExpireTime = new ConditionAttkExpireTime(attk5, expireTime); + trigger = new Trigger(condAttk5ExpireTime, switchToIdle); + attk5.AddTrigger(trigger); + attk5.AddTrigger(triggerTurnRight); + attk5.AddTrigger(triggerTurnLeft); + + // side kick normal + ConditionMotionAtEnd condKickMotionEnd = new ConditionMotionAtEnd(animator, Anim_SideKick); + trigger = new Trigger(condKickMotionEnd, new ActionSetVelocity(m_Body, Vector3.zero), TriggerOnlyOnce.On, TriggerSwallow.Off); + sideKick.AddTrigger(trigger); + ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime); + trigger = new Trigger(condSideKickExpireTime, switchToIdle); + sideKick.AddTrigger(trigger); + + // side kick rush + ConditionAttkExpireTime condSideKickRushExpireTime = new ConditionAttkExpireTime(sideKickRush, expireTime); + trigger = new Trigger(condSideKickRushExpireTime, switchToIdle); + sideKickRush.AddTrigger(trigger); + ConditionMotionRange condSideKickRushMotionRange = new ConditionMotionRange(animator, 0.5f, 10f); + trigger = new Trigger(And(condSideKickRushMotionRange, And(condRightButtonHold, condCircleCmd)), new List<ActionBase> { towardRight, switchToAttkRush }); + sideKickRush.AddTrigger(trigger); + trigger = new Trigger(And(condSideKickRushMotionRange, And(condLeftButtonHold, condCircleCmd)), new List<ActionBase> { towardLeft, switchToAttkRush }); + sideKickRush.AddTrigger(trigger); + + // super kick combo + ConditionAttkExpireTime condSuperKickExpireTime = new ConditionAttkExpireTime(superKick, expireTime); + trigger = new Trigger(condSuperKickExpireTime, switchToIdle); + superKick.AddTrigger(trigger); + + // gun normal + ConditionMotionAtEnd condGun1AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun1); + trigger = new Trigger(And(condGun1AtEnd, condSquareCmd), switchToGun2); + gun1.AddTrigger(trigger); + ConditionAttkExpireTime condGun1ExpireTime = new ConditionAttkExpireTime(gun1, expireTime); + trigger = new Trigger(condGun1ExpireTime, switchToIdle); + gun1.AddTrigger(trigger); + + ConditionMotionAtEnd condGun2AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun2); + trigger = new Trigger(And(condGun2AtEnd, condSquareCmd), switchToGun3); + gun2.AddTrigger(trigger); + ConditionAttkExpireTime condGun2ExpireTime = new ConditionAttkExpireTime(gun2, expireTime); + trigger = new Trigger(condGun2ExpireTime, switchToIdle); + gun2.AddTrigger(trigger); + + ConditionMotionAtEnd condGun3AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun3); + trigger = new Trigger(And(condGun3AtEnd, condSquareCmd), switchToGun4); + gun3.AddTrigger(trigger); + ConditionAttkExpireTime condGun3ExpireTime = new ConditionAttkExpireTime(gun3, expireTime); + trigger = new Trigger(condGun3ExpireTime, switchToIdle); + gun3.AddTrigger(trigger); + + ConditionAttkExpireTime condGun4ExpireTime = new ConditionAttkExpireTime(gun4, expireTime); + trigger = new Trigger(condGun4ExpireTime, switchToIdle); + gun4.AddTrigger(trigger); + ConditionMotionRange condGun4MotionRange = new ConditionMotionRange(animator, 0.6f, 1f); + trigger = new Trigger(And(condGun4MotionRange, condRight2Cmd), new List<ActionBase> { switchToDash, towardRight }); + gun4.AddTrigger(trigger); + trigger = new Trigger(And(condGun4MotionRange, condLeft2Cmd), new List<ActionBase> { switchToDash, towardLeft }); + gun4.AddTrigger(trigger); + + // air dash + trigger = new Trigger(new ConditionMotionRange(animator, 0.8f, 1f), disaleAfterImage, TriggerOnlyOnce.On, TriggerSwallow.Off); + airDash.AddTrigger(trigger); + trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_AirDash), new List<ActionBase> { new ActionSetVelocity(m_Body, Vector3.zero), new ActionUseGravity(m_Body), toJump }); + airDash.AddTrigger(trigger); + + trigger = new Trigger(new ConditionMotionRange(animator, 0.18f, 1f), new ActionPlayEffect("Air_Attk1", this, new Vector3(-136.805f, 0, 0), new Vector3(0.8f, 0.8f, 0.8f)), TriggerOnlyOnce.On, TriggerSwallow.Off); + airAttk1.AddTrigger(trigger); + trigger = new Trigger(new ConditionMotionRange(animator, 0.6f,1f), disaleAfterImage, TriggerOnlyOnce.On, TriggerSwallow.Off); + airAttk1.AddTrigger(trigger); + trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_AirAttack1), new List<ActionBase> { new ActionSetVelocity(m_Body, Vector3.zero), new ActionUseGravity(m_Body), toJump}); + airAttk1.AddTrigger(trigger); + + m_StateSystem.ForceStart(idle); + } + }
\ No newline at end of file diff --git a/Assets/Scripts/Test/SaionjiScript_Ability.cs.meta b/Assets/Scripts/Test/SaionjiScript_States.cs.meta index 10e51e09..10e51e09 100644 --- a/Assets/Scripts/Test/SaionjiScript_Ability.cs.meta +++ b/Assets/Scripts/Test/SaionjiScript_States.cs.meta diff --git a/Assets/Scripts/Test/SaionjiUberAbility.cs b/Assets/Scripts/Test/SaionjiUberAbility.cs index b1f39938..aef538a2 100644 --- a/Assets/Scripts/Test/SaionjiUberAbility.cs +++ b/Assets/Scripts/Test/SaionjiUberAbility.cs @@ -2,15 +2,15 @@ using System.Collections.Generic;
using UnityEngine;
-public class SaionjiUberAbility : UberAbility
+public class SaionjiUberState : UberState
{
Avatar m_Avatar;
- AbilitySystem m_AbilitySystem;
+ StateSystem m_StateSystem;
- public SaionjiUberAbility(Avatar avatar, AbilitySystem system)
+ public SaionjiUberState(Avatar avatar, StateSystem system)
{
m_Avatar = avatar;
- m_AbilitySystem = system;
+ m_StateSystem = system;
}
public override void OnUpdate()
|