Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Unity.Collections;
- using Unity.Mathematics;
- using System.Collections.Generic;
- using UnityEngine;
- public class CollisionEventManager : MonoBehaviour
- {
- private List<int> currentlyCollidingBodies;
- private Dictionary<int, bool> collisionSubscribers;
- public Rigidbody debugBody;
- private void Awake(){
- collisionSubscribers = new Dictionary<int, bool>();
- currentlyCollidingBodies = new List<int>();
- }
- void Start(){
- SubscribeToCollisionEvents(debugBody);
- Physics.ContactModifyEvent += ModificationCallback;
- }
- void FixedUpdate() => DetectCollisonExitsBasic();
- private void OnDisable() => Physics.ContactModifyEvent -= ModificationCallback;
- public void SubscribeToCollisionEvents(Rigidbody rigidbody)
- {
- collisionSubscribers.Add(rigidbody.GetInstanceID(), false);
- foreach (Collider col in rigidbody.GetComponentsInChildren<Collider>())
- {
- col.hasModifiableContacts = true;
- }
- foreach (Collider col in rigidbody.GetComponents<Collider>())
- {
- col.hasModifiableContacts = true;
- }
- }
- public void ModificationCallback(PhysicsScene scene, NativeArray<ModifiableContactPair> contactPairs)
- {
- foreach (var pair in contactPairs)
- {
- if (collisionSubscribers.ContainsKey(pair.bodyInstanceID))
- DetectCollisionEventBasic(pair, pair.bodyInstanceID);
- if (collisionSubscribers.ContainsKey(pair.otherBodyInstanceID))
- DetectCollisionEventBasic(pair, pair.otherBodyInstanceID);
- }
- }
- private void DetectCollisionEventBasic(ModifiableContactPair pair, int thisID)
- {
- float minSeparation = 1f;
- for (int i = 0; i < pair.contactCount; i++)
- minSeparation = math.min(pair.GetSeparation(i), minSeparation);
- // this conditional logic is about the simplest way to determine event triggers
- if (!currentlyCollidingBodies.Contains(thisID))
- {
- if (minSeparation <= 0.05f)
- {
- currentlyCollidingBodies.Add(thisID);
- collisionSubscribers[thisID] = true;
- Debug.Log("entered");
- }
- }
- else if (minSeparation <= 0.05f)
- {
- Debug.Log("stayed");
- collisionSubscribers[thisID] = true;
- }
- }
- public void DetectCollisonExitsBasic()
- {
- for (int i = 0; i < currentlyCollidingBodies.Count; i++)
- {
- if (!collisionSubscribers[currentlyCollidingBodies[i]])
- {
- collisionSubscribers[currentlyCollidingBodies[i]] = false;
- Debug.Log("exited");
- currentlyCollidingBodies.RemoveAt(i);
- }
- else
- {
- collisionSubscribers[currentlyCollidingBodies[i]] = false;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement