// not automatically called by the Unity engine // that's where the Supervisor comes in public static void FixedUpdate() { foreach (RigidBodySpherical rgd in rigidBodies) { foreach (BallColliderSpherical ball in rgd.colls) { foreach (ColliderSpherical col in colliders) { // an object shouldn't collide with itself if (col is BallColliderSpherical b && rgd.colls.Contains(b)) { continue; } Vector4 closestPoint; if (col.ClosestPoint(ball.center, out closestPoint) <= ball.radius) { Vector4 skinPoint; ball.ClosestPoint(closestPoint, out skinPoint); rgd.trans.localToWorld = Rot4.StraightFromTo((R4)skinPoint, (R4)closestPoint) * rgd.trans.localToWorld; } } } } }