summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Avatar
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-11-09 16:03:45 +0800
committerchai <chaifix@163.com>2020-11-09 16:03:45 +0800
commit0fdb81ffb2af8c39cfd611f485d46f3341206832 (patch)
treedde782dad44038d5d1d997451e5067e7a08b1d3e /Assets/Scripts/Avatar
parent6a1dc10ecae4fa5e45ba19dc8a57b8f3f3199fcb (diff)
* HitManager
Diffstat (limited to 'Assets/Scripts/Avatar')
-rw-r--r--Assets/Scripts/Avatar/Abilities/AbilityBase.cs6
-rw-r--r--Assets/Scripts/Avatar/Abilities/AttackAbility.cs65
-rw-r--r--Assets/Scripts/Avatar/Abilities/JumpAbility.cs4
-rw-r--r--Assets/Scripts/Avatar/Abilities/UberAbility.cs2
-rw-r--r--Assets/Scripts/Avatar/AbilitySystem.cs30
-rw-r--r--Assets/Scripts/Avatar/Avatar.cs73
-rw-r--r--Assets/Scripts/Avatar/HitInfo.cs19
-rw-r--r--Assets/Scripts/Avatar/Hitbox.cs33
-rw-r--r--Assets/Scripts/Avatar/Hitbox.cs.meta11
-rw-r--r--Assets/Scripts/Avatar/Hurtbox.cs33
-rw-r--r--Assets/Scripts/Avatar/Hurtbox.cs.meta11
-rw-r--r--Assets/Scripts/Avatar/IInteractable.cs6
12 files changed, 180 insertions, 113 deletions
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
/// <summary>
/// 在物理模拟之后更新
/// </summary>
- public virtual void OnLateUpdate() { }
+ public virtual void OnPhysicsUpdate() { }
/// <summary>
/// 过渡到下一个ability的回调
@@ -52,12 +52,12 @@ public abstract class AbilityBase
/// <summary>
/// 检测到hitbox碰撞时的回调
/// </summary>
- public virtual void OnHit(PhysicsCollisionInfo info) { }
+ public virtual void OnHit(HitInfo info) { }
/// <summary>
/// 检测到hurtbox碰撞时的回调
/// </summary>
- public virtual void OnHurt(PhysicsCollisionInfo info) { }
+ public virtual void OnHurt(HurtInfo info) { }
/// <summary>
/// 检测到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<Trigger> m_Triggers = new List<Trigger>();
- private List<Trigger> m_LateTriggers = new List<Trigger>();
+ private List<Trigger> m_PhysicsTriggers = new List<Trigger>();
/// <summary>
- /// 这个招式产生的hit
+ /// 这个招式配置的hit
/// </summary>
- private List<HitInfo> m_HitInfo = new List<HitInfo>();
+ private List<Hit> m_Hits = new List<Hit>();
/// <summary>
/// 从动画结束开始计时
@@ -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<Avatar>();
- 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();
}
/// <summary>
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
+/// <summary>
+/// 每个招式配置的单个hit数据
+/// </summary>
+public class Hit
{
public HitDefination defination;
/// <summary>
- /// 记录这个hit命中的avatar
+ /// 记录这个hit命中的avatar,避免连续击中
/// </summary>
- private List<Avatar> m_HitAvatars = new List<Avatar>();
+ private List<IInteractable> m_HitAvatars = new List<IInteractable>();
- 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);
}