using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 角色,包括player和opponents /// 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(); } public PhysicsBox GetHurtbox() { throw new System.NotImplementedException(); } public PhysicsPrimitive[] GetAllHit() { throw new System.NotImplementedException(); } public bool IsHit() { for (int i = 0; i < m_Hitbox.Length; ++i) { if (PhysicsWorld.Instance.HasCollision(m_Hitbox[i])) { return true; } } return false; } public bool IsHurt() { for (int i = 0; i < m_Hitbox.Length; ++i) { if (PhysicsWorld.Instance.HasCollision(m_Hurtbox[i])) { return true; } } 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(); } }