using System.Collections; using System.Collections.Generic; using UnityEngine; public struct ColliderDescriptor { public ColliderInfo colliderInfo; public UnitCollider unitCollider; } public struct CollisionInfo { ColliderDescriptor collider; // 主动 ColliderDescriptor collidee; // 从动 } public class CollisionSystem : SingletonMB { public delegate void StageHandle(); public StageHandle onSolveHit; [SerializeField] private int m_UnitColliderCount; ColliderRegistry registry { get { return ColliderRegistry.Instance; } } private void Start() { } void Update() { m_UnitColliderCount = registry.colliders != null ? registry.colliders.Count : 0; SolveHit(); } // hitbox <-> hurtbox void SolveHit() { // collect all hit box List hitboxes = ListPool.Get(); foreach (var collider in registry.colliders) { ColliderInfo[] boxes = collider.GetCurrentBoxesInfoByType(ColliderBox.EColliderType.HitBox); if (boxes == null || boxes.Length == 0) continue; for(int i = 0; i < boxes.Length; ++i) { ColliderDescriptor descriptor = new ColliderDescriptor(); descriptor.colliderInfo = boxes[i]; descriptor.unitCollider = collider; hitboxes.Add(descriptor); } } // collect all hurt box List hurtboxes = ListPool.Get(); foreach (var collider in registry.colliders) { ColliderInfo[] boxes = collider.GetCurrentBoxesInfoByType(ColliderBox.EColliderType.HurtBox); if (boxes == null || boxes.Length == 0) continue; for (int i = 0; i < boxes.Length; ++i) { ColliderDescriptor descriptor = new ColliderDescriptor(); descriptor.colliderInfo = boxes[i]; descriptor.unitCollider = collider; hurtboxes.Add(descriptor); } } // solve for(int i = 0; i < hitboxes.Count; ++ i) { ColliderDescriptor hitbox = hitboxes[i]; for (int j = 0; j < hurtboxes.Count; ++j) { ColliderDescriptor hurtbox = hurtboxes[j]; if (hitbox.unitCollider == hurtbox.unitCollider) // 同一个角色的hitbox和hurtbox不交互 continue; } } ListPool.Release(hitboxes); ListPool.Release(hurtboxes); } // throwbox <-> hurtbox void SolveThrow() { } // defendbox <-> hurtbox void SolveDefend() { } // blockbox <-> hitbox void SolveBlock() { } }