Advertisement
Guest User

Untitled

a guest
Aug 30th, 2021
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.93 KB | None | 0 0
  1. using Unity.Collections;
  2. using Unity.Mathematics;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5.  
  6. public class CollisionEventManager : MonoBehaviour
  7. {
  8.  
  9.     private List<int> currentlyCollidingBodies;
  10.     private Dictionary<int, bool> collisionSubscribers;
  11.     public Rigidbody debugBody;
  12.  
  13.     private void Awake(){
  14.         collisionSubscribers = new Dictionary<int, bool>();
  15.         currentlyCollidingBodies = new List<int>();
  16.     }
  17.  
  18.     void Start(){
  19.         SubscribeToCollisionEvents(debugBody);
  20.         Physics.ContactModifyEvent += ModificationCallback;
  21.     }
  22.     void FixedUpdate() => DetectCollisonExitsBasic();
  23.  
  24.     private void OnDisable() => Physics.ContactModifyEvent -= ModificationCallback;
  25.  
  26.     public void SubscribeToCollisionEvents(Rigidbody rigidbody)
  27.     {
  28.         collisionSubscribers.Add(rigidbody.GetInstanceID(), false);
  29.         foreach (Collider col in rigidbody.GetComponentsInChildren<Collider>())
  30.         {
  31.             col.hasModifiableContacts = true;
  32.         }
  33.         foreach (Collider col in rigidbody.GetComponents<Collider>())
  34.         {
  35.             col.hasModifiableContacts = true;
  36.         }
  37.     }
  38.     public void ModificationCallback(PhysicsScene scene, NativeArray<ModifiableContactPair> contactPairs)
  39.     {
  40.         foreach (var pair in contactPairs)
  41.         {
  42.             if (collisionSubscribers.ContainsKey(pair.bodyInstanceID))
  43.                 DetectCollisionEventBasic(pair, pair.bodyInstanceID);
  44.  
  45.             if (collisionSubscribers.ContainsKey(pair.otherBodyInstanceID))
  46.                 DetectCollisionEventBasic(pair, pair.otherBodyInstanceID);
  47.         }
  48.     }
  49.  
  50.     private void DetectCollisionEventBasic(ModifiableContactPair pair, int thisID)
  51.     {
  52.         float minSeparation = 1f;
  53.         for (int i = 0; i < pair.contactCount; i++)
  54.             minSeparation = math.min(pair.GetSeparation(i), minSeparation);
  55.         // this conditional logic is about the simplest way to determine event triggers
  56.         if (!currentlyCollidingBodies.Contains(thisID))
  57.         {
  58.             if (minSeparation <= 0.05f)
  59.             {
  60.                 currentlyCollidingBodies.Add(thisID);
  61.                 collisionSubscribers[thisID] = true;
  62.                 Debug.Log("entered");
  63.             }
  64.         }
  65.         else if (minSeparation <= 0.05f)
  66.         {
  67.             Debug.Log("stayed");
  68.             collisionSubscribers[thisID] = true;
  69.         }
  70.     }
  71.     public void DetectCollisonExitsBasic()
  72.     {
  73.         for (int i = 0; i < currentlyCollidingBodies.Count; i++)
  74.         {
  75.             if (!collisionSubscribers[currentlyCollidingBodies[i]])
  76.             {
  77.                 collisionSubscribers[currentlyCollidingBodies[i]] = false;
  78.                   Debug.Log("exited");
  79.                 currentlyCollidingBodies.RemoveAt(i);
  80.             }
  81.             else
  82.             {
  83.                 collisionSubscribers[currentlyCollidingBodies[i]] = false;
  84.             }
  85.         }
  86.     }
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement