Hole Game

A finite-city black-hole game built in Unity 6 + WebGL. Click and drag (or touch) to move the hole, eat blocks to grow, clear the city before the timer runs out. Built in public — each milestone below is a permanent snapshot tied to a tag in the Unity repo.

Snappier gravity + live-tunable debug panel
Latest

v0.9-tuning

Snappier gravity + live-tunable debug panel

Things finally fall like they mean it. Unity gravity is bumped to 25 m/s² (~2.5× Earth) for the play session, plus a per-absorbable supplemental boost (+12 m/s² flat, plus up to +8 for the smallest items) so cones and signs feel snappier than buildings even though real physics would give them all the same acceleration. A new debug tuning panel (toggle with the backquote / `~` key) exposes sliders for every knob — tweak gravity, growth scale, hole speed, all live mid-match without rebuilding. A spatial-hash registry replaces every per-frame `FindObjectsByType` call so adding more objects no longer scales bot decision-making linearly.

Bots' holes cut the world too — wake-fix + fullscreen

v0.8-multihole

Bots' holes cut the world too — wake-fix + fullscreen

Three things shipped together: (1) the shader cutout now applies to every hole, not just the player's — bots' holes dissolve the ground and streets just like yours. (2) Wake-fix in the dynamic mesh ground: rebuilds every FixedUpdate (no movement threshold) and uses a swept-cull that culls cells the hole's footprint passes *through* this tick, so cubes the hole passes over at high speed actually fall now. (3) A fullscreen toggle button on every version page — works on desktop, Android Chrome, and iOS Safari 16.4+.

Real 3D void — shader cutout + physics walls

v0.7-meshclip

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.

Building variety, asphalt, keyboard, disc squash

v0.6-buildings-polish

Building variety, asphalt, keyboard, disc squash

Buildings now split residential vs commercial with curated palettes, doors, awnings, and rooftop equipment. Streets use a real asphalt texture (image-gen PNG). WASD + arrow keys move the hole at full speed. The hole disc is geometrically squashed to read as an ellipse from the camera's perspective.

Procedural city blocks

v0.5-cityblocks

Procedural city blocks

Buildings, cars, and props are procedurally built from primitives at scene-build time. Each block has a multi-story building (random height, pastel body, blue windows) at center; vehicles park on streets; cones and signs at block corners. Pivoted away from Kenney CC0 packs after URP material conversion proved a rabbit hole.

City grid layout

v0.4-cityprep

City grid layout

Playfield is now a 4×4 city block with asphalt streets and lawn block interiors. Five absorbable tiers (ExtraTiny → Big) with weighted distribution. Hole disk floats cleanly above streets. Primitives only — Blender meshes drop into this layout next.

Continuous-sink absorption

v0.3-suction

Continuous-sink absorption

Cubes sink continuously based on overlap depth, not a fixed 0.25 s timer. Drive-by absorption works — no need to stop. Once a cube has started sinking, it commits and finishes even if the hole moves on.

Bots & leaderboard

v0.2-bots

Bots & leaderboard

Three AI rivals (Nova / GravityKid / VoidRider) compete for the same cubes. Bigger absorbs smaller. Defeated holes respawn after 1.4 s with brief ghost-blink invulnerability. Live leaderboard top-left.

MVP — drag, eat, grow

v0.1-mvp

MVP — drag, eat, grow

Working drag-to-move loop. 120 cubes in 3 tiers. 90 s match timer, score, city-cleared %, replay. No bots yet.