diff options
author | chai <chaifix@163.com> | 2021-08-06 09:31:08 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-08-06 09:31:08 +0800 |
commit | 35f2e468715e12d93cb88f2258c2d0ae82d1d189 (patch) | |
tree | 1edb1f0919cee10352e8e732654c959ff2e471dd /Assets/Scripts/Unit/Collider/CollisionSystem.cs | |
parent | 128d70642ddb8fa7818a84d0d23ca24ed2f8802c (diff) |
*collision
Diffstat (limited to 'Assets/Scripts/Unit/Collider/CollisionSystem.cs')
-rw-r--r-- | Assets/Scripts/Unit/Collider/CollisionSystem.cs | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/Assets/Scripts/Unit/Collider/CollisionSystem.cs b/Assets/Scripts/Unit/Collider/CollisionSystem.cs new file mode 100644 index 00000000..efbb2784 --- /dev/null +++ b/Assets/Scripts/Unit/Collider/CollisionSystem.cs @@ -0,0 +1,108 @@ +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<CollisionSystem> +{ + 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<ColliderDescriptor> hitboxes = ListPool<ColliderDescriptor>.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<ColliderDescriptor> hurtboxes = ListPool<ColliderDescriptor>.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<ColliderDescriptor>.Release(hitboxes); + ListPool<ColliderDescriptor>.Release(hurtboxes); + } + + // throwbox <-> hurtbox + void SolveThrow() + { + + } + + // defendbox <-> hurtbox + void SolveDefend() + { + + } + + // blockbox <-> hitbox + void SolveBlock() + { + + } + +} |