private void CollisionDetected(RigidBody body1, RigidBody body2, Vector3 point1, Vector3 point2, Vector3 normal, float penetration) { Arbiter arbiter = null; if (body1.IsTrigger || body2.IsTrigger) { return; } lock (arbiterMap) { arbiterMap.LookUpArbiter(body1, body2, out arbiter); if (arbiter == null) { arbiter = Arbiter.Pool.GetNew(); arbiter.body1 = body1; arbiter.body2 = body2; arbiterMap.Add(new ArbiterKey(body1, body2), arbiter); addedArbiterQueue.Enqueue(arbiter); events.RaiseBodiesBeginCollide(body1, body2); } } Contact contact = null; if (arbiter.body1 == body1) { Vector3.Negate(ref normal, out normal); contact = arbiter.AddContact(point1, point2, normal, penetration, contactSettings); } else { contact = arbiter.AddContact(point2, point1, normal, penetration, contactSettings); } if (contact != null) { events.RaiseContactCreated(contact); } }