From 0fdb81ffb2af8c39cfd611f485d46f3341206832 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 9 Nov 2020 16:03:45 +0800 Subject: * HitManager --- Assets/Scripts/Avatar/Abilities/AbilityBase.cs | 6 +- Assets/Scripts/Avatar/Abilities/AttackAbility.cs | 65 +++++++++++---------- Assets/Scripts/Avatar/Abilities/JumpAbility.cs | 4 +- Assets/Scripts/Avatar/Abilities/UberAbility.cs | 2 +- Assets/Scripts/Avatar/AbilitySystem.cs | 30 +++++----- Assets/Scripts/Avatar/Avatar.cs | 73 +++++++----------------- Assets/Scripts/Avatar/HitInfo.cs | 19 +++--- Assets/Scripts/Avatar/Hitbox.cs | 33 +++++++++++ Assets/Scripts/Avatar/Hitbox.cs.meta | 11 ++++ Assets/Scripts/Avatar/Hurtbox.cs | 33 +++++++++++ Assets/Scripts/Avatar/Hurtbox.cs.meta | 11 ++++ Assets/Scripts/Avatar/IInteractable.cs | 6 +- 12 files changed, 180 insertions(+), 113 deletions(-) create mode 100644 Assets/Scripts/Avatar/Hitbox.cs create mode 100644 Assets/Scripts/Avatar/Hitbox.cs.meta create mode 100644 Assets/Scripts/Avatar/Hurtbox.cs create mode 100644 Assets/Scripts/Avatar/Hurtbox.cs.meta (limited to 'Assets/Scripts/Avatar') diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs index 28f0e8d6..c8c09a6b 100644 --- a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs +++ b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs @@ -41,7 +41,7 @@ public abstract class AbilityBase /// /// 在物理模拟之后更新 /// - public virtual void OnLateUpdate() { } + public virtual void OnPhysicsUpdate() { } /// /// 过渡到下一个ability的回调 @@ -52,12 +52,12 @@ public abstract class AbilityBase /// /// 检测到hitbox碰撞时的回调 /// - public virtual void OnHit(PhysicsCollisionInfo info) { } + public virtual void OnHit(HitInfo info) { } /// /// 检测到hurtbox碰撞时的回调 /// - public virtual void OnHurt(PhysicsCollisionInfo info) { } + public virtual void OnHurt(HurtInfo info) { } /// /// 检测到defendbox碰撞时的回调 diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs index 5a200cf8..6e7c503f 100644 --- a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs +++ b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs @@ -17,12 +17,12 @@ public class AttackAbility : AbilityBase private List m_Triggers = new List(); - private List m_LateTriggers = new List(); + private List m_PhysicsTriggers = new List(); /// - /// 这个招式产生的hit + /// 这个招式配置的hit /// - private List m_HitInfo = new List(); + private List m_Hits = new List(); /// /// 从动画结束开始计时 @@ -43,7 +43,7 @@ public class AttackAbility : AbilityBase { get { - return m_HitInfo != null ? m_HitInfo.Count : 0; + return m_Hits != null ? m_Hits.Count : 0; } } @@ -81,7 +81,7 @@ public class AttackAbility : AbilityBase m_Config.body.LocalVelocity = m_Config.velocity; } - foreach(var hit in m_HitInfo) + foreach(var hit in m_Hits) { hit.WipeRecords(); } @@ -97,30 +97,11 @@ public class AttackAbility : AbilityBase m_TimeCount = 0; } - public override void OnHit(PhysicsCollisionInfo info) + public override void OnHit(HitInfo info) { - Avatar avatar = info.prim2.GetComponentInParent(); - if (avatar == null) - return; - for (int i = 0; i < m_HitInfo.Count; ++i) - { - HitInfo hitInfo = m_HitInfo[i]; - if(!hitInfo.HasRecord(avatar)) - { - hitInfo.AddRecord(avatar); - Debug.Log("hit " + avatar.Name); - PhysicsBody body = avatar.Body; - body.SetLocalForce(new Vector3(-1000, 5000, 0)); - if(avatar is ArmorSoldierScript) - { - ArmorSoldierScript solider = avatar as ArmorSoldierScript; - solider.Hurt(); - } - } - } } - public override void OnHurt(PhysicsCollisionInfo info) + public override void OnHurt(HurtInfo info) { } @@ -143,9 +124,9 @@ public class AttackAbility : AbilityBase } // 在物理模拟之后 - public override void OnLateUpdate() + public override void OnPhysicsUpdate() { - foreach (var trigger in m_LateTriggers) + foreach (var trigger in m_PhysicsTriggers) { if (trigger.Update() && trigger.Swallow) break; @@ -159,18 +140,36 @@ public class AttackAbility : AbilityBase m_Triggers.Add(trigger); } - public void AddLateTrigger(Trigger trigger) + public void AddPhysicsTrigger(Trigger trigger) { - if (trigger == null || m_LateTriggers.Contains(trigger)) + if (trigger == null || m_PhysicsTriggers.Contains(trigger)) return; - m_LateTriggers.Add(trigger); + m_PhysicsTriggers.Add(trigger); } public void AddHitDefination(HitDefination defination) { - HitInfo info = new HitInfo(); + Hit info = new Hit(); info.defination = defination; - m_HitInfo.Add(info); + 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/JumpAbility.cs b/Assets/Scripts/Avatar/Abilities/JumpAbility.cs index b83e8cfb..5c2d6366 100644 --- a/Assets/Scripts/Avatar/Abilities/JumpAbility.cs +++ b/Assets/Scripts/Avatar/Abilities/JumpAbility.cs @@ -208,9 +208,9 @@ public class JumpAbility : AbilityBase } } - public override void OnLateUpdate() + public override void OnPhysicsUpdate() { - base.OnLateUpdate(); + base.OnPhysicsUpdate(); } /// diff --git a/Assets/Scripts/Avatar/Abilities/UberAbility.cs b/Assets/Scripts/Avatar/Abilities/UberAbility.cs index 0a5bb8c5..ca2e7c06 100644 --- a/Assets/Scripts/Avatar/Abilities/UberAbility.cs +++ b/Assets/Scripts/Avatar/Abilities/UberAbility.cs @@ -7,6 +7,6 @@ public abstract class UberAbility : AbilityBase { public abstract void OnUpdate(); - public abstract void OnLateUpdate(); + public abstract void OnPhysicsUpdate(); } diff --git a/Assets/Scripts/Avatar/AbilitySystem.cs b/Assets/Scripts/Avatar/AbilitySystem.cs index 3e2ab838..9d289884 100644 --- a/Assets/Scripts/Avatar/AbilitySystem.cs +++ b/Assets/Scripts/Avatar/AbilitySystem.cs @@ -62,31 +62,26 @@ public class AbilitySystem } } - public void OnLateUpdate() + public void OnPhysicsUpdate() { if(m_Currrent != null) { - m_Currrent.OnLateUpdate(); + m_Currrent.OnPhysicsUpdate(); } if(m_UberAbility != null) { - m_UberAbility.OnLateUpdate(); + m_UberAbility.OnPhysicsUpdate(); } } - public void OnHit(PhysicsCollisionInfo info) + public void OnHit(HitInfo info) { - if(m_Currrent != null) - { - m_Currrent.OnHit(info); - } + } - public void OnHurt(PhysicsCollisionInfo info) + + public void OnHurt(HurtInfo info) { - if (m_Currrent != null) - { - m_Currrent.OnHurt(info); - } + } public void SwitchToAbility(AbilityBase targetAbility) @@ -97,4 +92,13 @@ public class AbilitySystem 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/Avatar.cs b/Assets/Scripts/Avatar/Avatar.cs index 928d2197..dc6c7858 100644 --- a/Assets/Scripts/Avatar/Avatar.cs +++ b/Assets/Scripts/Avatar/Avatar.cs @@ -13,8 +13,8 @@ public class Avatar : MonoBehaviour, IInteractable // 一个角色包括一个身体的collider和若干hitbox和hurtbox public PhysicsBody m_Body; public PhysicsBox m_BodyCollider; - public PhysicsBox[] m_Hitbox; - public PhysicsBox[] m_Hurtbox; + public Hitbox[] m_Hitbox; + public Hurtbox[] m_Hurtbox; protected AbilitySystem m_AbilitySystem = new AbilitySystem(); @@ -55,7 +55,7 @@ public class Avatar : MonoBehaviour, IInteractable { for (int i = 0; i < m_Hitbox.Length; ++i) { - if (PhysicsWorld.Instance.HasCollision(m_Hitbox[i])) + if (PhysicsWorld.Instance.HasCollision(m_Hitbox[i].Collider)) { return true; } @@ -67,7 +67,7 @@ public class Avatar : MonoBehaviour, IInteractable { for (int i = 0; i < m_Hitbox.Length; ++i) { - if (PhysicsWorld.Instance.HasCollision(m_Hurtbox[i])) + if (PhysicsWorld.Instance.HasCollision(m_Hurtbox[i].Collider)) { return true; } @@ -81,54 +81,9 @@ public class Avatar : MonoBehaviour, IInteractable } // 在物理模拟之后调用 - public void OnLateUpdate() + public void OnPhysicsUpdate() { - // hitbox - for(int i = 0;i < m_Hitbox.Length; ++i) - { - PhysicsBox hitbox = m_Hitbox[i]; - if (hitbox == null || !hitbox.IsActive) - continue; - for(int j = 0;j < PhysicsWorld.Instance.Collisions.Count; ++j) - { - PhysicsCollisionInfo info = PhysicsWorld.Instance.Collisions[j]; - if(info.prim1 == hitbox) - { - m_AbilitySystem.OnHit(info); - } - else if(info.prim2 == hitbox) - { - PhysicsPrimitive temp = info.prim1; - info.prim1 = info.prim2; - info.prim2 = temp; - m_AbilitySystem.OnHit(info); - } - } - } - // hurtbox - for (int i = 0; i < m_Hurtbox.Length; ++i) - { - PhysicsBox hurtbox = m_Hurtbox[i]; - if (hurtbox == null || !hurtbox.IsActive) - continue; - for (int j = 0; j < PhysicsWorld.Instance.Collisions.Count; ++j) - { - PhysicsCollisionInfo info = PhysicsWorld.Instance.Collisions[j]; - if (info.prim1 == hurtbox) - { - m_AbilitySystem.OnHurt(info); - } - else if(info.prim2 == hurtbox) - { - PhysicsPrimitive temp = info.prim1; - info.prim1 = info.prim2; - info.prim2 = temp; - m_AbilitySystem.OnHurt(info); - } - } - } - - m_AbilitySystem.OnLateUpdate(); + m_AbilitySystem.OnPhysicsUpdate(); } public virtual Vector3 GetEffectPosition() @@ -136,4 +91,20 @@ public class Avatar : MonoBehaviour, IInteractable return Vector3.zero; } + // 获得当前击打如果有的话 + public Hit GetHit() + { + return m_AbilitySystem.GetHit(); + } + + public virtual void OnHit(HitInfo hitInfo) + { + Debug.Log("Hit"); + } + + public virtual void OnHurt(HurtInfo hurtInfo) + { + Debug.Log("Hurt"); + } + } diff --git a/Assets/Scripts/Avatar/HitInfo.cs b/Assets/Scripts/Avatar/HitInfo.cs index 8d24f6ee..aef9a03f 100644 --- a/Assets/Scripts/Avatar/HitInfo.cs +++ b/Assets/Scripts/Avatar/HitInfo.cs @@ -2,19 +2,22 @@ using System.Collections.Generic; using UnityEngine; -public class HitInfo +/// +/// 每个招式配置的单个hit数据 +/// +public class Hit { public HitDefination defination; /// - /// 记录这个hit命中的avatar + /// 记录这个hit命中的avatar,避免连续击中 /// - private List m_HitAvatars = new List(); + private List m_HitAvatars = new List(); - public void AddRecord(Avatar avatar) + public void AddRecord(IInteractable interactable) { - if (!m_HitAvatars.Contains(avatar)) - m_HitAvatars.Add(avatar); + if (!m_HitAvatars.Contains(interactable)) + m_HitAvatars.Add(interactable); } // 招式结束后,清除记录的avatar @@ -23,9 +26,9 @@ public class HitInfo m_HitAvatars.Clear(); } - public bool HasRecord(Avatar avatar) + public bool HasRecord(IInteractable interactable) { - return m_HitAvatars.Contains(avatar); + return m_HitAvatars.Contains(interactable); } } diff --git a/Assets/Scripts/Avatar/Hitbox.cs b/Assets/Scripts/Avatar/Hitbox.cs new file mode 100644 index 00000000..5fd0cecf --- /dev/null +++ b/Assets/Scripts/Avatar/Hitbox.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Hitbox : MonoBehaviour +{ + [SerializeField] + private PhysicsBox m_BoxCollider; + public PhysicsBox Collider + { + get + { + return m_BoxCollider; + } + } + + [SerializeField] + private MonoBehaviour m_Host ; + + public IInteractable Host + { + get + { + return m_Host as IInteractable; + } + } + + private void Awake() + { + HitManager.Instance.AddHitBox(this); + } + +} diff --git a/Assets/Scripts/Avatar/Hitbox.cs.meta b/Assets/Scripts/Avatar/Hitbox.cs.meta new file mode 100644 index 00000000..19075d69 --- /dev/null +++ b/Assets/Scripts/Avatar/Hitbox.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f763a2db7c267714f824ca6a69bec569 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Hurtbox.cs b/Assets/Scripts/Avatar/Hurtbox.cs new file mode 100644 index 00000000..b5bd738f --- /dev/null +++ b/Assets/Scripts/Avatar/Hurtbox.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Hurtbox : MonoBehaviour +{ + [SerializeField] + private PhysicsBox m_BoxCollider; + public PhysicsBox Collider + { + get { + return m_BoxCollider; + } + } + + [SerializeField] + private MonoBehaviour m_Host; + + public IInteractable Host + { + get + { + return m_Host as IInteractable; + } + } + + private void Awake() + { + HitManager.Instance.AddHurtBox(this); + } + + +} diff --git a/Assets/Scripts/Avatar/Hurtbox.cs.meta b/Assets/Scripts/Avatar/Hurtbox.cs.meta new file mode 100644 index 00000000..f0c2e2ff --- /dev/null +++ b/Assets/Scripts/Avatar/Hurtbox.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 154a74587976e25469eae9a4a8c7762b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/IInteractable.cs b/Assets/Scripts/Avatar/IInteractable.cs index 23e49912..7a648c6c 100644 --- a/Assets/Scripts/Avatar/IInteractable.cs +++ b/Assets/Scripts/Avatar/IInteractable.cs @@ -14,8 +14,10 @@ public interface IInteractable bool IsHit(); - bool IsHurt(); - + bool IsHurt(); + + void OnHit(HitInfo hitInfo); + void OnHurt(HurtInfo hurtInfo); } -- cgit v1.1-26-g67d0