From bdf47cf0fd36a5c858575a805cca70ab623868eb Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 29 Oct 2020 19:39:42 +0800 Subject: *misc --- Assets/Scripts/Avatar/Abilities/AbilityBase.cs | 66 ++++++ .../Scripts/Avatar/Abilities/AbilityBase.cs.meta | 11 + Assets/Scripts/Avatar/Abilities/AttackAbility.cs | 143 ++++++++++++ .../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 | 52 +++++ .../Scripts/Avatar/Abilities/IdleAbility.cs.meta | 11 + Assets/Scripts/Avatar/Abilities/JumpAbility.cs | 241 +++++++++++++++++++++ .../Scripts/Avatar/Abilities/JumpAbility.cs.meta | 11 + Assets/Scripts/Avatar/Abilities/MoveAbility.cs | 68 ++++++ .../Scripts/Avatar/Abilities/MoveAbility.cs.meta | 11 + 16 files changed, 713 insertions(+) create mode 100644 Assets/Scripts/Avatar/Abilities/AbilityBase.cs create mode 100644 Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/AttackAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/DashAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/DodgeAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/DodgeAbility.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/HurtAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/HurtAbility.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/IdleAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/IdleAbility.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/JumpAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/JumpAbility.cs.meta create mode 100644 Assets/Scripts/Avatar/Abilities/MoveAbility.cs create mode 100644 Assets/Scripts/Avatar/Abilities/MoveAbility.cs.meta (limited to 'Assets/Scripts/Avatar/Abilities') diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs new file mode 100644 index 00000000..8b1a5549 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs @@ -0,0 +1,66 @@ +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 OnLateUpdate() { } + + /// + /// 过渡到下一个ability的回调 + /// + /// + public virtual void OnTranslate(AbilityBase to) { } + + /// + /// 检测到hitbox碰撞时的回调 + /// + public virtual void OnHit() { } + + /// + /// 检测到hurtbox碰撞时的回调 + /// + public virtual void OnHurt() { } + + /// + /// 检测到defendbox碰撞时的回调 + /// + public virtual void OnDefend() { } +} diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs.meta new file mode 100644 index 00000000..79a6b7eb --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/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/Abilities/AttackAbility.cs b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs new file mode 100644 index 00000000..9ca52a4c --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs @@ -0,0 +1,143 @@ +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(); + + /// + /// 在跑动状态时可以切换的ability + /// + private List m_Triggers = new List(); + + private List m_LateTriggers = new List(); + + /// + /// 这个招式所有hit的效果 + /// + public HitDefination[] HitDef; + + /// + /// 从动画结束开始计时 + /// + float m_TimeCount; + public float ExpireTime + { + get + { + return m_TimeCount; + } + } + + /// + /// 这个招式的hit个数 + /// + public int HitCount + { + get + { + return HitDef != null ? HitDef.Length : 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; + } + } + + public override void OnExit() + { + m_TimeCount = 0; + } + + public override void OnHit() + { + } + + public override void OnHurt() + { + } + + 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 OnLateUpdate() + { + foreach (var trigger in m_LateTriggers) + { + 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 AddLateTrigger(Trigger trigger) + { + if (trigger == null || m_LateTriggers.Contains(trigger)) + return; + m_LateTriggers.Add(trigger); + } + +} diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs.meta new file mode 100644 index 00000000..4159d2bc --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/AttackAbility.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/Abilities/DashAbility.cs b/Assets/Scripts/Avatar/Abilities/DashAbility.cs new file mode 100644 index 00000000..b9a479b5 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/DashAbility.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DashAbility : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta b/Assets/Scripts/Avatar/Abilities/DashAbility.cs.meta new file mode 100644 index 00000000..c246c665 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/DashAbility.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/Abilities/DodgeAbility.cs b/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs new file mode 100644 index 00000000..79e8fc61 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/DodgeAbility.cs @@ -0,0 +1,16 @@ +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 new file mode 100644 index 00000000..e7297a88 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/DodgeAbility.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/Abilities/HurtAbility.cs b/Assets/Scripts/Avatar/Abilities/HurtAbility.cs new file mode 100644 index 00000000..c12c89c6 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/HurtAbility.cs @@ -0,0 +1,21 @@ +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 new file mode 100644 index 00000000..0e70d0be --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/HurtAbility.cs.meta @@ -0,0 +1,11 @@ +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 new file mode 100644 index 00000000..d42308db --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/IdleAbility.cs @@ -0,0 +1,52 @@ +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); + } + + 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 new file mode 100644 index 00000000..07d0c292 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/IdleAbility.cs.meta @@ -0,0 +1,11 @@ +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 new file mode 100644 index 00000000..e0f73efa --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/JumpAbility.cs @@ -0,0 +1,241 @@ +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 class JumpAbility : AbilityBase +{ + public enum Direction + { + Neutral, + Forward, + Backward + } + + private enum State + { + 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; + + private List m_Triggers = new List(); + + 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 + } + + 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_CurState = State.Ready; + else if (isUp) + 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_Body.LocalVelocity = m_CurInitVelocity; + m_CurState = State.Up; + } + break; + case State.Up: + if(m_CurAnim != m_CurUpMotion) + { + m_Animator.CrossFade(m_CurUpMotion, 0.2f); + 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.2f); + 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 OnLateUpdate() + { + base.OnLateUpdate(); + } + + /// + /// 跳跃准备动作已经完毕 + /// + /// + 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() + { + if (m_CurState == State.End) + { + AnimatorStateInfo state = m_Animator.GetCurrentAnimatorStateInfo(0); + return state.shortNameHash == m_AnimJumpEnd && state.normalizedTime >= 1f; + } + + 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 new file mode 100644 index 00000000..6c67c462 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/JumpAbility.cs.meta @@ -0,0 +1,11 @@ +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 new file mode 100644 index 00000000..757cd2d1 --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/MoveAbility.cs @@ -0,0 +1,68 @@ +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); + } + + public override void OnExit() + { + } + + public override void OnHit() + { + } + + public override void OnHurt() + { + } + + 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 new file mode 100644 index 00000000..08b2954c --- /dev/null +++ b/Assets/Scripts/Avatar/Abilities/MoveAbility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4581355020e27084f869d6001787e11e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- cgit v1.1-26-g67d0