Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public interface ICollider
- {
- Collider MyCollider { get; }
- void OnMyCollisionEnter(ICollider otherCollider);
- void OnMyCollisionStay(ICollider otherCollider);
- void OnMyCollisionExit(ICollider collider);
- }
- public class CollisionsDetector : MonoBehaviour
- {
- private const int CollidersInitialCapacity = 20;
- private int collidersCount;
- private List<ICollider> colliders;
- private Dictionary<Tuple<ICollider, ICollider>, bool> collisions;
- private void Start()
- {
- collidersCount = 0;
- colliders = new List<ICollider>(CollidersInitialCapacity);
- collisions = new Dictionary<Tuple<ICollider, ICollider>, bool>(CollidersInitialCapacity * CollidersInitialCapacity);
- }
- private void OnDestroy()
- {
- collidersCount = 0;
- colliders = null;
- collisions = null;
- }
- public void AddCollider(ICollider collider)
- {
- CheckCollisions(collider);
- colliders.Add(collider);
- collidersCount++;
- }
- public void RemoveCollider(ICollider collider)
- {
- colliders.Remove(collider);
- collidersCount--;
- RemoveCollisions(collider);
- }
- private void FixedUpdate()
- {
- CheckCollisions();
- }
- private void CheckCollisions()
- {
- for (int i = 0; i < collidersCount; i++)
- {
- ICollider collider = colliders[i];
- for (int j = i + 1; j < collidersCount; j++)
- {
- ICollider otherCollider = colliders[j];
- CheckCollision(collider, otherCollider);
- }
- }
- }
- private void CheckCollision(ICollider collider, ICollider otherCollider)
- {
- bool areColliding = collider.MyCollider.bounds.Intersects(otherCollider.MyCollider.bounds);
- Tuple<ICollider, ICollider> tuple = Tuple.Create(collider, otherCollider);
- bool whereColliding;
- collisions.TryGetValue(tuple, out whereColliding);
- collisions[tuple] = areColliding;
- NotifyCollisionEvents(collider, otherCollider, areColliding, whereColliding);
- }
- private void NotifyCollisionEvents(ICollider collider, ICollider otherCollider, bool areColliding, bool whereColliding)
- {
- if (areColliding)
- {
- if (!whereColliding)
- {
- collider.OnMyCollisionEnter(otherCollider);
- otherCollider.OnMyCollisionEnter(collider);
- }
- else
- {
- collider.OnMyCollisionStay(otherCollider);
- otherCollider.OnMyCollisionStay(collider);
- }
- }
- else if (whereColliding)
- {
- collider.OnMyCollisionExit(otherCollider);
- otherCollider.OnMyCollisionExit(collider);
- }
- }
- private void CheckCollisions(ICollider collider)
- {
- for (int i = 0; i < collidersCount; i++)
- {
- ICollider otherCollider = colliders[i];
- CheckCollision(otherCollider, collider);
- }
- }
- private void RemoveCollisions(ICollider collider)
- {
- for (int i = 0; i < collidersCount; i++)
- {
- ICollider otherCollider = colliders[i];
- Tuple<ICollider, ICollider> tuple = Tuple.Create(collider, otherCollider);
- bool whereColliding;
- collisions.TryGetValue(tuple, out whereColliding);
- collisions.Remove(tuple);
- if (whereColliding)
- otherCollider.OnMyCollisionExit(collider);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement