summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/Collider/CollisionSystem.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-08-31 19:07:21 +0800
committerchai <chaifix@163.com>2021-08-31 19:07:21 +0800
commitffd1d5af496e0a0eff343b27c4f0f965bbbf79eb (patch)
treec5a8ae2116040ce8c483454b2e82093f247db341 /Assets/Scripts/Unit/Collider/CollisionSystem.cs
parent476abf41a7357db0dd870f0d221f1a26481ab2bf (diff)
*projectile
Diffstat (limited to 'Assets/Scripts/Unit/Collider/CollisionSystem.cs')
-rw-r--r--Assets/Scripts/Unit/Collider/CollisionSystem.cs53
1 files changed, 49 insertions, 4 deletions
diff --git a/Assets/Scripts/Unit/Collider/CollisionSystem.cs b/Assets/Scripts/Unit/Collider/CollisionSystem.cs
index 0e3c92f0..e84c54a9 100644
--- a/Assets/Scripts/Unit/Collider/CollisionSystem.cs
+++ b/Assets/Scripts/Unit/Collider/CollisionSystem.cs
@@ -1,4 +1,4 @@
-using System.Collections;
+using System;
using System.Collections.Generic;
using UnityEngine;
@@ -8,10 +8,11 @@ public struct ColliderDescriptor
public UnitCollider unitCollider;
}
+[Serializable]
public struct Box
{
- public Vector3 center;
- public Vector3 size;
+ [SerializeField] public Vector3 center;
+ [SerializeField] public Vector3 size;
}
public struct CollisionInfo
@@ -107,9 +108,53 @@ public class CollisionSystem : SingletonMB<CollisionSystem>
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)
+ {
+ for(int i = 0; i < hurtboxes.Count; ++i)
+ {
+ ColliderDescriptor hurtCollider = hurtboxes[i];
+ if (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()