summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/Collider/CollisionSystem.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2022-03-10 14:07:40 +0800
committerchai <chaifix@163.com>2022-03-10 14:07:40 +0800
commit22891bf59032ba88262824255a706d652031384b (patch)
tree7595439ba9966c9402d37e37cee5e8cf098757d5 /Assets/Scripts/Unit/Collider/CollisionSystem.cs
parent8b04ea73e540067f83870b61d89db4868fea5e8a (diff)
* move folder
Diffstat (limited to 'Assets/Scripts/Unit/Collider/CollisionSystem.cs')
-rw-r--r--Assets/Scripts/Unit/Collider/CollisionSystem.cs262
1 files changed, 0 insertions, 262 deletions
diff --git a/Assets/Scripts/Unit/Collider/CollisionSystem.cs b/Assets/Scripts/Unit/Collider/CollisionSystem.cs
deleted file mode 100644
index 83052073..00000000
--- a/Assets/Scripts/Unit/Collider/CollisionSystem.cs
+++ /dev/null
@@ -1,262 +0,0 @@
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-
-public struct ColliderDescriptor
-{
- public ColliderInfo colliderInfo;
- public UnitCollider unitCollider;
-}
-
-[Serializable]
-public struct Box
-{
- [SerializeField] public Vector3 center;
- [SerializeField] public Vector3 size;
-}
-
-public struct CollisionInfo
-{
- public ColliderDescriptor collider; // 主动
- public ColliderDescriptor collidee; // 从动
- public Box intersection;
- public bool isCollision;
-}
-
-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();
- SolveProjectile();
- }
-
- // 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)
- continue;
- if (hitbox.unitCollider.owner.type == hurtbox.unitCollider.owner.type)
- continue;
- CollisionInfo collision = ColliderUtility.GetCollision(hitbox, hurtbox);
- if (!collision.isCollision)
- continue;
- if (!hitbox.unitCollider.CanCollide(hitbox.colliderInfo.colliderHash, hurtbox.unitCollider.owner.GetHashCode()))
- continue;
- hitbox.unitCollider.RecordCollision(hitbox.colliderInfo.colliderHash, hurtbox.unitCollider.owner.GetHashCode());
- hitbox.unitCollider.owner.OnHit(collision);
- hurtbox.unitCollider.owner.OnGetHit(collision);
- }
- }
-
- ListPool<ColliderDescriptor>.Release(hitboxes);
- ListPool<ColliderDescriptor>.Release(hurtboxes);
- }
-
- void SolveProjectile()
- {
- // 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);
- }
- }
-
- foreach (var projectile in registry.projectiles)
- {
- if (projectile == null)
- continue;
- for(int i = 0; i < hurtboxes.Count; ++i)
- {
- ColliderDescriptor hurtCollider = hurtboxes[i];
- if (hurtCollider.unitCollider == null)
- continue;
- if (projectile.owner == null || hurtCollider.unitCollider.owner == null || projectile.owner.type == hurtCollider.unitCollider.owner.type)
- continue;
- Box hurtbox = ColliderUtility.GetColliderInWorldSpace(hurtCollider);
- foreach (var itor in projectile.GetCollidersInWorldSpace())
- {
- Box box = (Box)itor;
- Box intersection = ColliderUtility.GetIntersection(box, hurtbox);
- if (intersection.size.magnitude == 0)
- continue;
- if (!projectile.CanHit(hurtCollider.unitCollider.owner.GetHashCode()))
- continue;
- projectile.RecordTarget(hurtCollider.unitCollider.owner.GetHashCode());
-
- CollisionInfo collision = new CollisionInfo();
- collision.isCollision = true;
- collision.intersection = intersection;
- collision.collidee = hurtCollider;
- hurtCollider.unitCollider.owner.OnGetShot(collision);
- projectile.OnShot(collision);
-
- goto next;
- }
- }
- next:;
- }
- }
-
- // throwbox <-> hurtbox
- void SolveThrow()
- {
-
- }
-
- // defendbox <-> hurtbox
- void SolveDefend()
- {
-
- }
-
- // blockbox <-> hitbox
- void SolveBlock()
- {
-
- }
-
- private void OnDrawGizmos()
- {
- }
-
-}
-
-public static class ColliderUtility
-{
- public static CollisionInfo GetCollision(ColliderDescriptor collider, ColliderDescriptor collidee)
- {
- CollisionInfo collision = new CollisionInfo();
- collision.collider = collider;
- collision.collidee = collidee;
- Box colliderBox = GetColliderInWorldSpace(collider);
- Box collideeBox = GetColliderInWorldSpace(collidee);
- Box intersection = GetIntersection(colliderBox, collideeBox);
- collision.intersection = intersection;
- collision.isCollision = intersection.size.magnitude != 0;
- return collision;
- }
-
- public static Box GetColliderInWorldSpace(ColliderDescriptor collider)
- {
- Box box = new Box();
- Vector3 fac = new Vector3(1, 1, collider.unitCollider.owner.transform.forward.normalized == Vector3.forward ? 1 : -1);
- Vector3 unitPos = collider.unitCollider.owner.transform.position;
- Vector3 pos = Vector3.zero; // gizmo位置
- Vector3 localPos = collider.unitCollider.owner.transform.rotation * collider.colliderInfo.position;
- Vector3 localSize = collider.colliderInfo.size;
- var pivot = collider.colliderInfo.pivot;
- switch (pivot)
- {
- case ColliderBox.Pivot.MiddleBottom:
- localPos.y += localSize.y / 2;
- break;
- }
- pos = unitPos + Vector3.Scale(localPos, fac);
- box.center = pos;
- box.size = localSize;
- return box;
- }
-
- public static Box GetIntersection(Box b1, Box b2)
- {
- bool isIntersection = true;
-
- float l1 = b1.center.x - b1.size.x / 2;
- float r1 = b1.center.x + b1.size.x / 2;
- float l2 = b2.center.x - b2.size.x / 2;
- float r2 = b2.center.x + b2.size.x / 2;
- isIntersection &= r1 >= l2 && l1 <= r2;
-
- float o1 = b1.center.y - b1.size.y / 2;
- float t1 = b1.center.y + b1.size.y / 2;
- float o2 = b2.center.y - b2.size.y / 2;
- float t2 = b2.center.y + b2.size.y / 2;
- isIntersection &= t1 >= o2 && o1 <= t2;
-
- float c1 = b1.center.z - b1.size.z / 2;
- float f1 = b1.center.z + b1.size.z / 2;
- float c2 = b2.center.z - b2.size.z / 2;
- float f2 = b2.center.z + b2.size.z / 2;
- isIntersection &= f1 >= c2 && c1 <= f2;
-
- if(!isIntersection)
- {
- return new Box();
- }
-
- Box box = new Box();
- float l = Mathf.Max(l1, l2);
- float r = Mathf.Min(r1, r2);
- float b = Mathf.Max(o1, o2);
- float t = Mathf.Min(t1, t2);
- float c = Mathf.Max(c1, c2);
- float f = Mathf.Max(f1, f2);
- box.center = new Vector3((l + r) / 2, (b + t) / 2, (c + f) / 2 );
- box.size = new Vector3(r - l, t - b, f - c);
- return box;
- }
-
-} \ No newline at end of file