Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. public interface ICollider
  2. {
  3. Collider MyCollider { get; }
  4. void OnMyCollisionEnter(ICollider otherCollider);
  5. void OnMyCollisionStay(ICollider otherCollider);
  6. void OnMyCollisionExit(ICollider collider);
  7. }
  8.  
  9. public class CollisionsDetector : MonoBehaviour
  10. {
  11. private const int CollidersInitialCapacity = 20;
  12.  
  13. private int collidersCount;
  14. private List<ICollider> colliders;
  15. private Dictionary<Tuple<ICollider, ICollider>, bool> collisions;
  16.  
  17. private void Start()
  18. {
  19. collidersCount = 0;
  20. colliders = new List<ICollider>(CollidersInitialCapacity);
  21. collisions = new Dictionary<Tuple<ICollider, ICollider>, bool>(CollidersInitialCapacity * CollidersInitialCapacity);
  22. }
  23.  
  24. private void OnDestroy()
  25. {
  26. collidersCount = 0;
  27. colliders = null;
  28. collisions = null;
  29. }
  30.  
  31. public void AddCollider(ICollider collider)
  32. {
  33. CheckCollisions(collider);
  34. colliders.Add(collider);
  35. collidersCount++;
  36. }
  37.  
  38. public void RemoveCollider(ICollider collider)
  39. {
  40. colliders.Remove(collider);
  41. collidersCount--;
  42. RemoveCollisions(collider);
  43. }
  44.  
  45. private void FixedUpdate()
  46. {
  47. CheckCollisions();
  48. }
  49.  
  50. private void CheckCollisions()
  51. {
  52. for (int i = 0; i < collidersCount; i++)
  53. {
  54. ICollider collider = colliders[i];
  55. for (int j = i + 1; j < collidersCount; j++)
  56. {
  57. ICollider otherCollider = colliders[j];
  58. CheckCollision(collider, otherCollider);
  59. }
  60. }
  61. }
  62.  
  63. private void CheckCollision(ICollider collider, ICollider otherCollider)
  64. {
  65. bool areColliding = collider.MyCollider.bounds.Intersects(otherCollider.MyCollider.bounds);
  66. Tuple<ICollider, ICollider> tuple = Tuple.Create(collider, otherCollider);
  67. bool whereColliding;
  68. collisions.TryGetValue(tuple, out whereColliding);
  69. collisions[tuple] = areColliding;
  70. NotifyCollisionEvents(collider, otherCollider, areColliding, whereColliding);
  71. }
  72.  
  73. private void NotifyCollisionEvents(ICollider collider, ICollider otherCollider, bool areColliding, bool whereColliding)
  74. {
  75. if (areColliding)
  76. {
  77. if (!whereColliding)
  78. {
  79. collider.OnMyCollisionEnter(otherCollider);
  80. otherCollider.OnMyCollisionEnter(collider);
  81. }
  82. else
  83. {
  84. collider.OnMyCollisionStay(otherCollider);
  85. otherCollider.OnMyCollisionStay(collider);
  86. }
  87. }
  88. else if (whereColliding)
  89. {
  90. collider.OnMyCollisionExit(otherCollider);
  91. otherCollider.OnMyCollisionExit(collider);
  92. }
  93. }
  94.  
  95. private void CheckCollisions(ICollider collider)
  96. {
  97. for (int i = 0; i < collidersCount; i++)
  98. {
  99. ICollider otherCollider = colliders[i];
  100. CheckCollision(otherCollider, collider);
  101. }
  102. }
  103.  
  104. private void RemoveCollisions(ICollider collider)
  105. {
  106. for (int i = 0; i < collidersCount; i++)
  107. {
  108. ICollider otherCollider = colliders[i];
  109. Tuple<ICollider, ICollider> tuple = Tuple.Create(collider, otherCollider);
  110. bool whereColliding;
  111. collisions.TryGetValue(tuple, out whereColliding);
  112. collisions.Remove(tuple);
  113. if (whereColliding)
  114. otherCollider.OnMyCollisionExit(collider);
  115. }
  116. }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement