Real 3D void — shader cutout + physics walls · The hole is a real 3D void now, not a flat disc. A URP shader carves the ground and streets where the hole opens; a 5.4 m cylindrical wall of contact-modified box colliders catches absorbables once they descend below ground level; the ground collider itself is a dynamically rebuilt mesh with the hole subtracted from it. Things fall under real Unity gravity, tumble with their actual center of mass, and remain whole rigid bodies as they go down — no scripted lerp, no clip-on-the-cube.
_HoleCenter is less than _HoleRadius AND its world-space Y is below _HoleCenter.y._HoleCenter (Vector4) and _HoleRadius (float) are pushed each LateUpdate by HoleClipFeeder from the player's hole transform plus a 0.04 Y offset (so the cut plane is just above ground level).AbsorbableObject.Awake scans its child renderers and swaps any clippable material back to URP/Lit, preserving _BaseColor / _BaseMap / scale / offset. Even if the scene builder accidentally tags an absorbable's child, runtime fixes it.BoxCollider segments arranged in a cylinder of radius = hole radius, extending from Y=-0.03 down to Y=-5.43 (5.4 m deep). Segment count scales with circumference so segments stay ~0.42 m wide.hasModifiableContacts = true. A static Physics.ContactModifyEvent callback iterates contact points each frame and ignores any contact whose Y is above -0.12 (configurable contactActivationDepth).Defeat() (so the player isn't trapped under their own dead hole's walls) and reactivate on respawn.Rigidbody collision detection is ContinuousSpeculative so fast-moving holes don't tunnel through the wall mesh during a contact-modify rebuild.MeshCollider whose sharedMesh is rebuilt at runtime with the hole geometrically subtracted.FixedUpdate, scan all cells; for each, test whether its AABB intersects any hole's circle (closest-point-to-center distance squared vs radius squared). Cells that intersect are skipped; the rest are emitted as quads.OverlapSphereNonAlloc wakes any sleeping rigidbodies within hole radius + 1.4 m. Without this, cubes that came to rest under gravity would stay asleep when the cutout passed under them — fixes the 'drive past, nothing happens' bug.AbsorbableObject reverted to pure Unity gravity. No custom gravityAccel, no scripted lerp.useGravity = true, interpolation = Interpolate, collisionDetectionMode = ContinuousDynamic (handles fast falls without tunneling), sleepThreshold = 0.005 (won't sleep over the slightest jitter).centerOfMass = box.center so tall buildings tip naturally over the hole rim instead of pivoting at the transform origin.topY < -4.5 (was 1.5) so cubes vanish near the bottom of the wall cylinder, not at ground level. You see them descend into the void.HoleVisual disc is no longer a thin overlay at Y=0.04. It's parented to the hole actor at localY = -4.8 — deep at the bottom of the wall cylinder.0.88 Z-axis squash so it reads elliptical from the camera (consistent with prior versions).