From f325841eff10ae492ce6c634d4b07cf058a068c6 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 16 Nov 2020 08:30:54 +0800 Subject: *state system --- Assets/Scripts/Avatar/Abilities.meta | 8 - Assets/Scripts/Avatar/Abilities/AbilityBase.cs | 66 ---- .../Scripts/Avatar/Abilities/AbilityBase.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/AttackAbility.cs | 175 --------- .../Scripts/Avatar/Abilities/AttackAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/DashAbility.cs | 18 - .../Scripts/Avatar/Abilities/DashAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/DodgeAbility.cs | 16 - .../Scripts/Avatar/Abilities/DodgeAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/HurtAbility.cs | 21 -- .../Scripts/Avatar/Abilities/HurtAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/IdleAbility.cs | 57 --- .../Scripts/Avatar/Abilities/IdleAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/JumpAbility.cs | 263 ------------- .../Scripts/Avatar/Abilities/JumpAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/MoveAbility.cs | 65 ---- .../Scripts/Avatar/Abilities/MoveAbility.cs.meta | 11 - Assets/Scripts/Avatar/Abilities/UberAbility.cs | 12 - .../Scripts/Avatar/Abilities/UberAbility.cs.meta | 11 - Assets/Scripts/Avatar/AbilitySystem.cs | 106 ------ Assets/Scripts/Avatar/AbilitySystem.cs.meta | 11 - Assets/Scripts/Avatar/Actions/ActionJump.cs | 14 +- Assets/Scripts/Avatar/Actions/ActionJumpForward.cs | 16 +- .../Scripts/Avatar/Actions/ActionSwitchAbility.cs | 16 +- Assets/Scripts/Avatar/Avatar.cs | 51 ++- Assets/Scripts/Avatar/Avatar_Hurt.cs | 16 +- .../Avatar/Conditions/ConditionAbilitySeq.cs | 12 +- .../Avatar/Conditions/ConditionAttkExpireTime.cs | 8 +- .../Avatar/Conditions/ConditionCheckJumpState.cs | 26 +- .../Scripts/Avatar/Conditions/ConditionJumpDone.cs | 4 +- .../Avatar/Conditions/ConditionJumpOnGround.cs | 4 +- Assets/Scripts/Avatar/StateSystem.cs | 106 ++++++ Assets/Scripts/Avatar/StateSystem.cs.meta | 11 + Assets/Scripts/Avatar/States.meta | 8 + Assets/Scripts/Avatar/States/AbilityBase.cs | 66 ++++ Assets/Scripts/Avatar/States/AbilityBase.cs.meta | 11 + Assets/Scripts/Avatar/States/AttackState.cs | 175 +++++++++ Assets/Scripts/Avatar/States/AttackState.cs.meta | 11 + Assets/Scripts/Avatar/States/DashState.cs | 18 + Assets/Scripts/Avatar/States/DashState.cs.meta | 11 + Assets/Scripts/Avatar/States/DodgeState.cs | 16 + Assets/Scripts/Avatar/States/DodgeState.cs.meta | 11 + Assets/Scripts/Avatar/States/HurtState.cs | 70 ++++ Assets/Scripts/Avatar/States/HurtState.cs.meta | 11 + Assets/Scripts/Avatar/States/IdleState.cs | 57 +++ Assets/Scripts/Avatar/States/IdleState.cs.meta | 11 + Assets/Scripts/Avatar/States/JumpState.cs | 263 +++++++++++++ Assets/Scripts/Avatar/States/JumpState.cs.meta | 11 + Assets/Scripts/Avatar/States/MoveState.cs | 65 ++++ Assets/Scripts/Avatar/States/MoveState.cs.meta | 11 + Assets/Scripts/Avatar/States/UberState.cs | 12 + Assets/Scripts/Avatar/States/UberState.cs.meta | 11 + Assets/Scripts/Physics/PhysicsPrimitive.cs | 5 +- Assets/Scripts/Test/ArmorSoldierScript.cs | 17 +- Assets/Scripts/Test/ArmorSoldierScript_Anim.cs | 31 ++ .../Scripts/Test/ArmorSoldierScript_Anim.cs.meta | 11 + Assets/Scripts/Test/ArmorSoldierScript_States.cs | 53 +++ .../Scripts/Test/ArmorSoldierScript_States.cs.meta | 11 + Assets/Scripts/Test/SaionjiScript.cs | 10 +- Assets/Scripts/Test/SaionjiScript_Ability.cs | 405 --------------------- Assets/Scripts/Test/SaionjiScript_Ability.cs.meta | 11 - Assets/Scripts/Test/SaionjiScript_States.cs | 382 +++++++++++++++++++ Assets/Scripts/Test/SaionjiScript_States.cs.meta | 11 + Assets/Scripts/Test/SaionjiUberAbility.cs | 8 +- 64 files changed, 1591 insertions(+), 1414 deletions(-) delete mode 100644 Assets/Scripts/Avatar/Abilities.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/AbilityBase.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/AttackAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/DashAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/DodgeAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/HurtAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/HurtAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/IdleAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/IdleAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/JumpAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/JumpAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/MoveAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/MoveAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/Abilities/UberAbility.cs delete mode 100644 Assets/Scripts/Avatar/Abilities/UberAbility.cs.meta delete mode 100644 Assets/Scripts/Avatar/AbilitySystem.cs delete mode 100644 Assets/Scripts/Avatar/AbilitySystem.cs.meta create mode 100644 Assets/Scripts/Avatar/StateSystem.cs create mode 100644 Assets/Scripts/Avatar/StateSystem.cs.meta create mode 100644 Assets/Scripts/Avatar/States.meta create mode 100644 Assets/Scripts/Avatar/States/AbilityBase.cs create mode 100644 Assets/Scripts/Avatar/States/AbilityBase.cs.meta create mode 100644 Assets/Scripts/Avatar/States/AttackState.cs create mode 100644 Assets/Scripts/Avatar/States/AttackState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/DashState.cs create mode 100644 Assets/Scripts/Avatar/States/DashState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/DodgeState.cs create mode 100644 Assets/Scripts/Avatar/States/DodgeState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/HurtState.cs create mode 100644 Assets/Scripts/Avatar/States/HurtState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/IdleState.cs create mode 100644 Assets/Scripts/Avatar/States/IdleState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/JumpState.cs create mode 100644 Assets/Scripts/Avatar/States/JumpState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/MoveState.cs create mode 100644 Assets/Scripts/Avatar/States/MoveState.cs.meta create mode 100644 Assets/Scripts/Avatar/States/UberState.cs create mode 100644 Assets/Scripts/Avatar/States/UberState.cs.meta create mode 100644 Assets/Scripts/Test/ArmorSoldierScript_Anim.cs create mode 100644 Assets/Scripts/Test/ArmorSoldierScript_Anim.cs.meta create mode 100644 Assets/Scripts/Test/ArmorSoldierScript_States.cs create mode 100644 Assets/Scripts/Test/ArmorSoldierScript_States.cs.meta delete mode 100644 Assets/Scripts/Test/SaionjiScript_Ability.cs delete mode 100644 Assets/Scripts/Test/SaionjiScript_Ability.cs.meta create mode 100644 Assets/Scripts/Test/SaionjiScript_States.cs create mode 100644 Assets/Scripts/Test/SaionjiScript_States.cs.meta (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/Avatar/Abilities.meta b/Assets/Scripts/Avatar/Abilities.meta deleted file mode 100644 index 4b958769..00000000 --- a/Assets/Scripts/Avatar/Abilities.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 962b8b798c2077c4db88f3828ba14d55 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs deleted file mode 100644 index c8c09a6b..00000000 --- a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -/// -/// 同一个角色同一个时间只能有一个ability -/// -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() { } - - /// - /// 进入当前ability的回调 - /// - public virtual void OnEnter() { } - - /// - /// 退出当前ability的回调 - /// - public virtual void OnExit() { } - - /// - /// 当前ability的update函数 - /// - public virtual void OnUpdate() { } - - /// - /// 在物理模拟之后更新 - /// - public virtual void OnPhysicsUpdate() { } - - /// - /// 过渡到下一个ability的回调 - /// - /// - public virtual void OnTranslate(AbilityBase to) { } - - /// - /// 检测到hitbox碰撞时的回调 - /// - public virtual void OnHit(HitInfo info) { } - - /// - /// 检测到hurtbox碰撞时的回调 - /// - public virtual void OnHurt(HurtInfo info) { } - - /// - /// 检测到defendbox碰撞时的回调 - /// - public virtual void OnDefend() { } -} diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta deleted file mode 100644 index 79a6b7eb..00000000 --- a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a3b3cfab4bd1dd74bb539687535b58f1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs deleted file mode 100644 index 6e7c503f..00000000 --- a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs +++ /dev/null @@ -1,175 +0,0 @@ -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 m_Triggers = new List(); - - private List m_PhysicsTriggers = new List(); - - /// - /// 这个招式配置的hit - /// - private List m_Hits = new List(); - - /// - /// 从动画结束开始计时 - /// - float m_TimeCount; - public float ExpireTime - { - get - { - return m_TimeCount; - } - } - - /// - /// 这个招式的hit个数 - /// - 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; - } - -} diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta deleted file mode 100644 index 4159d2bc..00000000 --- a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eefcc728a2660c0459b0d79230cc4dec -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/DashAbility.cs b/Assets/Scripts/Avatar/Abilities/DashAbility.cs deleted file mode 100644 index b9a479b5..00000000 --- a/Assets/Scripts/Avatar/Abilities/DashAbility.cs +++ /dev/null @@ -1,18 +0,0 @@ -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() - { - - } -} diff --git a/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta deleted file mode 100644 index c246c665..00000000 --- a/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6d5a31f4a65fbba429d0a2ff3b3a49a4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs b/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs deleted file mode 100644 index 79e8fc61..00000000 --- a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - - -/// -/// Dodge ability -/// -public class DodgeAbility : AbilityBase -{ - public DodgeAbility() - { - - } - -} diff --git a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta deleted file mode 100644 index e7297a88..00000000 --- a/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 838e30895704e13479bfb0f5c06229e5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: 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; - -/// -/// 将伤害类型进行分类,决定不同的motion类型 -/// -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 b/Assets/Scripts/Avatar/Abilities/IdleAbility.cs deleted file mode 100644 index e692cc2a..00000000 --- a/Assets/Scripts/Avatar/Abilities/IdleAbility.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - - -public class IdleAbility : AbilityBase -{ - Animator m_Animator; - - int m_AnimHash; - - /// - /// 在Idle状态时可以切换的ability - /// - private List m_Triggers = new List(); - - 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); - } - -} 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 b/Assets/Scripts/Avatar/Abilities/JumpAbility.cs deleted file mode 100644 index 5c2d6366..00000000 --- a/Assets/Scripts/Avatar/Abilities/JumpAbility.cs +++ /dev/null @@ -1,263 +0,0 @@ -using System.Collections; -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 class JumpAbility : AbilityBase -{ - public enum Direction - { - None, - Neutral, - Forward, - Backward - } - - public enum State - { - None, - Ready, - Up, - Down, - End, - } - - Direction m_Dir; - - PhysicsBody m_Body; - PhysicsPrimitive m_Collider; - - 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 m_Triggers = new List(); - - 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(); - } - - /// - /// 跳跃准备动作已经完毕 - /// - /// - 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; - } - - /// - /// 结束 - /// - /// - 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; - } - - /// - /// 着地 - /// - /// - 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); - } - -} \ No newline at end of file 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 b/Assets/Scripts/Avatar/Abilities/MoveAbility.cs deleted file mode 100644 index 61efd0cf..00000000 --- a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class MoveAbility : AbilityBase -{ - Animator m_Animator; - int m_AnimHash; - - /// - /// 在跑动状态时可以切换的ability - /// - private List m_Triggers = new List(); - - 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); - } - -} 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 b/Assets/Scripts/Avatar/Abilities/UberAbility.cs deleted file mode 100644 index ca2e7c06..00000000 --- a/Assets/Scripts/Avatar/Abilities/UberAbility.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -// 一个角色只能有一个uber ability,用来处理状态的自动切换 -public abstract class UberAbility : AbilityBase -{ - public abstract void OnUpdate(); - - public abstract void OnPhysicsUpdate(); - -} 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/AbilitySystem.cs b/Assets/Scripts/Avatar/AbilitySystem.cs deleted file mode 100644 index 5f6e9364..00000000 --- a/Assets/Scripts/Avatar/AbilitySystem.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -/// -/// 每个角色拥有一个ablity system -/// -public class AbilitySystem -{ - /// - /// 当前执行的ability - /// - private AbilityBase m_Currrent; - - public AbilityBase Current - { - get - { - return m_Currrent; - } - } - - private List m_Abilities = new List(); - - private UberAbility m_UberAbility; - - public AbilitySystem() - { - } - - public void ForceStart(AbilityBase ability) - { - if (ability == null) - return; - - if (m_Currrent != null) - m_Currrent.OnExit(); - - m_Currrent = ability; - m_Currrent.OnEnter(); - } - - public void SetUberAbility(UberAbility ability) - { - m_UberAbility = ability; - } - - public void AddAbility(AbilityBase ability) - { - m_Abilities.Add(ability); - } - - public void OnUpdate() - { - if(m_Currrent != null) - { - m_Currrent.OnUpdate(); - } - if(m_UberAbility != null) - { - m_UberAbility.OnUpdate(); - } - } - - public void OnPhysicsUpdate() - { - if(m_Currrent != null) - { - m_Currrent.OnPhysicsUpdate(); - } - if(m_UberAbility != null) - { - m_UberAbility.OnPhysicsUpdate(); - } - } - - 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) - { - if (m_Currrent != null) - m_Currrent.OnExit(); - m_Currrent = targetAbility; - m_Currrent.OnEnter(); - } - - // 获得当前击打如果有的话 - public Hit GetHit() - { - if (Current == null || !(Current is AttackAbility)) - return null; - AttackAbility ability = Current as AttackAbility; - return ability.GetHit(); - } - -} \ No newline at end of file diff --git a/Assets/Scripts/Avatar/AbilitySystem.cs.meta b/Assets/Scripts/Avatar/AbilitySystem.cs.meta deleted file mode 100644 index 52e8267c..00000000 --- a/Assets/Scripts/Avatar/AbilitySystem.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2cf426be55a8b8b48a1b794fa6938e94 -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 conditions = new List(); + 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; /// -/// 记录之前的ability序列满足某个序列 +/// 记录之前的state序列满足某个序列 /// combo的时候根据当前序列决定combo /// -public class ConditionAbilitySeq : ConditionBase +public class ConditionStateSeq : ConditionBase { - List m_TargetAbilitySeq = new List(); + List m_TargetStateSeq = new List(); - public ConditionAbilitySeq(List commandSeq) + public ConditionStateSeq(List 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/StateSystem.cs b/Assets/Scripts/Avatar/StateSystem.cs new file mode 100644 index 00000000..42e35445 --- /dev/null +++ b/Assets/Scripts/Avatar/StateSystem.cs @@ -0,0 +1,106 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 每个角色拥有一个state system +/// +public class StateSystem +{ + /// + /// 当前执行的state + /// + private StateBase m_Currrent; + + public StateBase Current + { + get + { + return m_Currrent; + } + } + + private List m_States = new List(); + + private UberState m_UberState; + + public StateSystem() + { + } + + public void ForceStart(StateBase state) + { + if (state == null) + return; + + if (m_Currrent != null) + m_Currrent.OnExit(); + + m_Currrent = state; + m_Currrent.OnEnter(); + } + + public void SetUberState(UberState state) + { + m_UberState = state; + } + + public void AddState(StateBase state) + { + m_States.Add(state); + } + + public void OnUpdate() + { + if(m_Currrent != null) + { + m_Currrent.OnUpdate(); + } + if(m_UberState != null) + { + m_UberState.OnUpdate(); + } + } + + public void OnPhysicsUpdate() + { + if(m_Currrent != null) + { + m_Currrent.OnPhysicsUpdate(); + } + if(m_UberState != null) + { + m_UberState.OnPhysicsUpdate(); + } + } + + 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 SwitchToState(StateBase targetState) + { + if (m_Currrent != null) + m_Currrent.OnExit(); + m_Currrent = targetState; + m_Currrent.OnEnter(); + } + + // 获得当前击打如果有的话 + 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/StateSystem.cs.meta b/Assets/Scripts/Avatar/StateSystem.cs.meta new file mode 100644 index 00000000..52e8267c --- /dev/null +++ b/Assets/Scripts/Avatar/StateSystem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cf426be55a8b8b48a1b794fa6938e94 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/States.meta b/Assets/Scripts/Avatar/States.meta new file mode 100644 index 00000000..4b958769 --- /dev/null +++ b/Assets/Scripts/Avatar/States.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 962b8b798c2077c4db88f3828ba14d55 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/States/AbilityBase.cs b/Assets/Scripts/Avatar/States/AbilityBase.cs new file mode 100644 index 00000000..4932a3de --- /dev/null +++ b/Assets/Scripts/Avatar/States/AbilityBase.cs @@ -0,0 +1,66 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 同一个角色同一个时间只能有一个state +/// +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() { } + + /// + /// 进入当前state的回调 + /// + public virtual void OnEnter() { } + + /// + /// 退出当前state的回调 + /// + public virtual void OnExit() { } + + /// + /// 当前state的update函数 + /// + public virtual void OnUpdate() { } + + /// + /// 在物理模拟之后更新 + /// + public virtual void OnPhysicsUpdate() { } + + /// + /// 过渡到下一个state的回调 + /// + /// + public virtual void OnTranslate(StateBase to) { } + + /// + /// 检测到hitbox碰撞时的回调 + /// + public virtual void OnHit(HitInfo info) { } + + /// + /// 检测到hurtbox碰撞时的回调 + /// + public virtual void OnHurt(HurtInfo info) { } + + /// + /// 检测到defendbox碰撞时的回调 + /// + public virtual void OnDefend() { } +} diff --git a/Assets/Scripts/Avatar/States/AbilityBase.cs.meta b/Assets/Scripts/Avatar/States/AbilityBase.cs.meta new file mode 100644 index 00000000..79a6b7eb --- /dev/null +++ b/Assets/Scripts/Avatar/States/AbilityBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3b3cfab4bd1dd74bb539687535b58f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/States/AttackState.cs b/Assets/Scripts/Avatar/States/AttackState.cs new file mode 100644 index 00000000..ae8f3b66 --- /dev/null +++ b/Assets/Scripts/Avatar/States/AttackState.cs @@ -0,0 +1,175 @@ +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 m_Triggers = new List(); + + private List m_PhysicsTriggers = new List(); + + /// + /// 这个招式配置的hit + /// + private List m_Hits = new List(); + + /// + /// 从动画结束开始计时 + /// + float m_TimeCount; + public float ExpireTime + { + get + { + return m_TimeCount; + } + } + + /// + /// 这个招式的hit个数 + /// + 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/States/AttackState.cs.meta b/Assets/Scripts/Avatar/States/AttackState.cs.meta new file mode 100644 index 00000000..4159d2bc --- /dev/null +++ b/Assets/Scripts/Avatar/States/AttackState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eefcc728a2660c0459b0d79230cc4dec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/States/DashState.cs b/Assets/Scripts/Avatar/States/DashState.cs new file mode 100644 index 00000000..c9237d4c --- /dev/null +++ b/Assets/Scripts/Avatar/States/DashState.cs @@ -0,0 +1,18 @@ +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/States/DashState.cs.meta b/Assets/Scripts/Avatar/States/DashState.cs.meta new file mode 100644 index 00000000..c246c665 --- /dev/null +++ b/Assets/Scripts/Avatar/States/DashState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d5a31f4a65fbba429d0a2ff3b3a49a4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/States/DodgeState.cs b/Assets/Scripts/Avatar/States/DodgeState.cs new file mode 100644 index 00000000..58bc9301 --- /dev/null +++ b/Assets/Scripts/Avatar/States/DodgeState.cs @@ -0,0 +1,16 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +/// +/// Dodge state +/// +public class DodgeState : StateBase +{ + public DodgeState() + { + + } + +} diff --git a/Assets/Scripts/Avatar/States/DodgeState.cs.meta b/Assets/Scripts/Avatar/States/DodgeState.cs.meta new file mode 100644 index 00000000..e7297a88 --- /dev/null +++ b/Assets/Scripts/Avatar/States/DodgeState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 838e30895704e13479bfb0f5c06229e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: 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; + +/// +/// 将伤害类型进行分类,决定不同的motion类型 +/// +public enum HurtType +{ + Light = 0, // 轻击 + Medium, // 中击 + Hard, // 重击 + Back, + Up, + Diagup +} + + +public class HurtState : StateBase +{ + Animator m_Animator; + + int m_AnimHash; + + /// + /// 在Idle状态时可以切换的state + /// + private List m_Triggers = new List(); + + 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/States/IdleState.cs b/Assets/Scripts/Avatar/States/IdleState.cs new file mode 100644 index 00000000..8b46b904 --- /dev/null +++ b/Assets/Scripts/Avatar/States/IdleState.cs @@ -0,0 +1,57 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +public class IdleState : StateBase +{ + Animator m_Animator; + + int m_AnimHash; + + /// + /// 在Idle状态时可以切换的state + /// + private List m_Triggers = new List(); + + 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/States/JumpState.cs b/Assets/Scripts/Avatar/States/JumpState.cs new file mode 100644 index 00000000..1e172358 --- /dev/null +++ b/Assets/Scripts/Avatar/States/JumpState.cs @@ -0,0 +1,263 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +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 JumpState : StateBase +{ + public enum Direction + { + None, + Neutral, + Forward, + Backward + } + + public enum Stage + { + None, + Ready, + Up, + Down, + End, + } + + Direction m_Dir; + + PhysicsBody m_Body; + PhysicsPrimitive m_Collider; + + 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; + 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 m_Triggers = new List(); + + 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(); + } + + /// + /// 跳跃准备动作已经完毕 + /// + /// + 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; + } + + /// + /// 结束 + /// + /// + 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; + } + + /// + /// 着地 + /// + /// + 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/States/MoveState.cs b/Assets/Scripts/Avatar/States/MoveState.cs new file mode 100644 index 00000000..0fbfcddb --- /dev/null +++ b/Assets/Scripts/Avatar/States/MoveState.cs @@ -0,0 +1,65 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MoveState : StateBase +{ + Animator m_Animator; + int m_AnimHash; + + /// + /// 在跑动状态时可以切换的state + /// + private List m_Triggers = new List(); + + 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/States/UberState.cs b/Assets/Scripts/Avatar/States/UberState.cs new file mode 100644 index 00000000..a0b6d940 --- /dev/null +++ b/Assets/Scripts/Avatar/States/UberState.cs @@ -0,0 +1,12 @@ +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(); + } 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.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_Ability.cs deleted file mode 100644 index 5fc92f62..00000000 --- a/Assets/Scripts/Test/SaionjiScript_Ability.cs +++ /dev/null @@ -1,405 +0,0 @@ -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 conditions = new List(); - 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); - } - - /// - /// 设置abilities - /// - 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.Right, GamepadButton.Right }, 0.8f); - ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List { GamepadButton.Left, GamepadButton.Left }, 0.8f); - ConditionCommandSeq condDRC = new ConditionCommandSeq(new List { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f); - ConditionCommandSeq condDLC = new ConditionCommandSeq(new List { 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 { wipeCmdRecord, switchToSuperKick }); - idle.AddTrigger(trigger); - trigger = new Trigger(And(condTowardLeft, condDLC), new List { wipeCmdRecord, switchToSuperKick }); - idle.AddTrigger(trigger); - trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord , switchToDash }); - idle.AddTrigger(trigger); - trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord , switchToDash }); - idle.AddTrigger(trigger); - trigger = new Trigger(condRightButtonHold, new List { switchToMove, towardRight }); - idle.AddTrigger(trigger); - trigger = new Trigger(condLeftButtonHold, new List { switchToMove, towardLeft }); - idle.AddTrigger(trigger); - trigger = new Trigger(condCircleCmd, switchToAttk1); - idle.AddTrigger(trigger); - trigger = new Trigger(condCrossCmd, switchToSideKick); - idle.AddTrigger(trigger); - trigger = new Trigger(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 { wipeCmdRecord, switchToDash, }); - move.AddTrigger(trigger); - trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord, switchToDash }); - move.AddTrigger(trigger); - trigger = new Trigger(And(condRightButtonHold, condCircleCmd), new List { towardRight, switchToAttkRush }); - move.AddTrigger(trigger); - trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List { towardLeft, switchToAttkRush }); - move.AddTrigger(trigger); - trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List { towardRight, switchToSideKickRush }); - move.AddTrigger(trigger); - trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List { 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 { 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 { 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 { 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 { towardRight, new ActionSetVelocityX(m_Body, 4)}, TriggerOnlyOnce.Off, TriggerSwallow.Off); - jump.AddTrigger(trigger); - trigger = new Trigger(And(condLeftButtonHold, condCheckJump), new List { 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 { towardRight, switchToAttkRush }); - sideKickRush.AddTrigger(trigger); - trigger = new Trigger(And(condSideKickRushMotionRange, And(condLeftButtonHold, condCircleCmd)), new List { 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 { switchToDash, towardRight }); - gun4.AddTrigger(trigger); - trigger = new Trigger(And(condGun4MotionRange, condLeft2Cmd), new List { 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 { 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 { new ActionSetVelocity(m_Body, Vector3.zero), new ActionUseGravity(m_Body), toJump}); - airAttk1.AddTrigger(trigger); - - m_AbilitySystem.ForceStart(idle); - } - -} \ No newline at end of file diff --git a/Assets/Scripts/Test/SaionjiScript_Ability.cs.meta b/Assets/Scripts/Test/SaionjiScript_Ability.cs.meta deleted file mode 100644 index 10e51e09..00000000 --- a/Assets/Scripts/Test/SaionjiScript_Ability.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1421bbd1c6a776d4b9dd2340b37d9a8b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Test/SaionjiScript_States.cs b/Assets/Scripts/Test/SaionjiScript_States.cs new file mode 100644 index 00000000..68d09280 --- /dev/null +++ b/Assets/Scripts/Test/SaionjiScript_States.cs @@ -0,0 +1,382 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class SaionjiScript : Avatar +{ + + /// + /// 设置states + /// + 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.Right, GamepadButton.Right }, 0.8f); + ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List { GamepadButton.Left, GamepadButton.Left }, 0.8f); + ConditionCommandSeq condDRC = new ConditionCommandSeq(new List { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f); + ConditionCommandSeq condDLC = new ConditionCommandSeq(new List { 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 { wipeCmdRecord, switchToSuperKick }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, condDLC), new List { wipeCmdRecord, switchToSuperKick }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord , switchToDash }); + idle.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord , switchToDash }); + idle.AddTrigger(trigger); + trigger = new Trigger(condRightButtonHold, new List { switchToMove, towardRight }); + idle.AddTrigger(trigger); + trigger = new Trigger(condLeftButtonHold, new List { switchToMove, towardLeft }); + idle.AddTrigger(trigger); + trigger = new Trigger(condCircleCmd, switchToAttk1); + idle.AddTrigger(trigger); + trigger = new Trigger(condCrossCmd, switchToSideKick); + idle.AddTrigger(trigger); + trigger = new Trigger(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 { wipeCmdRecord, switchToDash, }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord, switchToDash }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condRightButtonHold, condCircleCmd), new List { towardRight, switchToAttkRush }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List { towardLeft, switchToAttkRush }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List { towardRight, switchToSideKickRush }); + move.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List { 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 { 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 { 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 { 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 { towardRight, new ActionSetVelocityX(m_Body, 4)}, TriggerOnlyOnce.Off, TriggerSwallow.Off); + jump.AddTrigger(trigger); + trigger = new Trigger(And(condLeftButtonHold, condCheckJump), new List { 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 { towardRight, switchToAttkRush }); + sideKickRush.AddTrigger(trigger); + trigger = new Trigger(And(condSideKickRushMotionRange, And(condLeftButtonHold, condCircleCmd)), new List { 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 { switchToDash, towardRight }); + gun4.AddTrigger(trigger); + trigger = new Trigger(And(condGun4MotionRange, condLeft2Cmd), new List { 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 { 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 { 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_States.cs.meta b/Assets/Scripts/Test/SaionjiScript_States.cs.meta new file mode 100644 index 00000000..10e51e09 --- /dev/null +++ b/Assets/Scripts/Test/SaionjiScript_States.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1421bbd1c6a776d4b9dd2340b37d9a8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: 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() -- cgit v1.1-26-g67d0