From ffd1d5af496e0a0eff343b27c4f0f965bbbf79eb Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 31 Aug 2021 19:07:21 +0800 Subject: *projectile --- Assets/Scripts/Unit/Collider/CollisionSystem.cs | 53 +++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'Assets/Scripts/Unit/Collider/CollisionSystem.cs') 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 void SolveProjectile() { + // 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); + } + } - } + 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() -- cgit v1.1-26-g67d0