summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Avatar/Avatar.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-11-02 19:53:12 +0800
committerchai <chaifix@163.com>2020-11-02 19:53:12 +0800
commit3708d0a07ce43c3d98a0171eacfa9c370c873f96 (patch)
tree728f72bd8e6c464c6f56db7b08755031f685c45c /Assets/Scripts/Avatar/Avatar.cs
parent64061aee5d7849f348f07b78fc3f96ad7555c147 (diff)
*受击
Diffstat (limited to 'Assets/Scripts/Avatar/Avatar.cs')
-rw-r--r--Assets/Scripts/Avatar/Avatar.cs74
1 files changed, 73 insertions, 1 deletions
diff --git a/Assets/Scripts/Avatar/Avatar.cs b/Assets/Scripts/Avatar/Avatar.cs
index 47d8c4b7..a8d90fa7 100644
--- a/Assets/Scripts/Avatar/Avatar.cs
+++ b/Assets/Scripts/Avatar/Avatar.cs
@@ -8,18 +8,34 @@ using UnityEngine;
/// </summary>
public class Avatar : MonoBehaviour, IInteractable
{
+ public string Name;
-
+ // 一个角色包括一个身体的collider和若干hitbox和hurtbox
public PhysicsBody m_Body;
public PhysicsBox m_BodyCollider;
public PhysicsBox[] m_Hitbox;
public PhysicsBox[] m_Hurtbox;
+ protected AbilitySystem m_AbilitySystem = new AbilitySystem();
+
+ public PhysicsBody Body
+ {
+ get
+ {
+ return m_Body;
+ }
+ }
+
public PhysicsPrimitive[] GetAllPrimitive()
{
throw new System.NotImplementedException();
}
+ protected void Init()
+ {
+ AvatarManager.Instance.AddAvatar(this);
+ }
+
public PhysicsBox GetHitbox()
{
throw new System.NotImplementedException();
@@ -59,4 +75,60 @@ public class Avatar : MonoBehaviour, IInteractable
return false;
}
+ public void OnUpdate()
+ {
+ m_AbilitySystem.OnUpdate();
+ }
+
+ // 在物理模拟之后调用
+ public void OnLateUpdate()
+ {
+ // 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();
+ }
+
}