From 3708d0a07ce43c3d98a0171eacfa9c370c873f96 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 2 Nov 2020 19:53:12 +0800 Subject: =?UTF-8?q?*=E5=8F=97=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Avatar/Avatar.cs | 74 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) (limited to 'Assets/Scripts/Avatar/Avatar.cs') 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; /// 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(); + } + } -- cgit v1.1-26-g67d0