Tombakan: An AR Spearfishing Game That Teaches Fish
A Unity AR game where you place a water surface in your actual room and spear the fish matching a target colour. Seven weekly iterations, a tester report each time, and a scope that grew from a colour drill into a marine-life learning game.
Tombakan is Indonesian for spearing fish. You point your phone at the floor, the app finds the plane, and a water surface drops into your actual room. Fish swim across it. A target colour appears, and you throw a spear at the fish that matches.
That is the whole loop, and for the first weeks it was the whole game.
The scope changed on purpose
The build started as a colour-matching drill: see a colour, hit that fish, score a point. It worked, and it was boring in the way a drill is boring — there was nothing to come back for.
The ROADMAP.md in the repo records the turn. The game became a marine-life
learning game with three pillars instead of one: learn the fish you spear
(colour first, then real Indonesian species names), collect them into a
Fishipedia with facts attached, and progress through a persistent player
level that unlocks content. Cosmetic spear skins came along as the reward that
is not a power-up.
The principle written down alongside it is the one that made the change cheap: fish and spears are defined as data, decoupled from art. Adding a species is adding a row, not a scene.
Seven weeks, seven tester reports
The repo is unusual for a coursework project in one way: every iteration has a
scope document written before it and a tester report written after it.
ITERATION_week1_SCOPE.md through week 6, TESTER_REPORT_week1.md through
week 7. The ITERATION_LOG.md lists each task and the exact files it touched.
Reading them back, the bugs are the honest kind — the ones you only find by playing:
OnFishHitscored hits that landed after the timer ran out, because nothing checkedgameRunning.PlaceWaterOnPlanewould happily place a second water surface if you looked at another plane, so the room ended up with two.FishSwimwas being attached twice, and the duplicate fought the original over the same transform.- The result screen showed
+0 XPand an accuracy of0.0%for a round where you never threw anything. Both are technically true and both read as bugs, so they became"--"and nothing at all.
None of those are architecture problems. They are what happens between “the feature works” and “the feature is finished”.
What it is built on
Unity 2022.3.62f3 LTS, one scene — GamePlay.unity. AR comes from
ARFoundation 5.2 with ARCore and ARKit behind it, so the same project builds for
Android and iOS, plus the XR Interaction Toolkit for the throw.
One setting mattered more than it looks: AndroidMinSdkVersion came down from
35 to 24. Twenty-four is where ARCore starts, and anything above it just
narrows the pool of phones that can run the thing for no benefit. An AR game
that only installs on new phones is an AR game nobody tries.
Tests arrived late and deliberately narrow. com.unity.test-framework was
already in the manifest; what was missing were assembly definitions. The PlayMode
tests cover the scoring contract and the accuracy formatting, because those are
the two places where a silent change would look like a correct number.
Where it is now
Still in progress. The loop, the Fishipedia, levels and the achievement toast are in; the species data is thin and the art is placeholder in places. The repository has the roadmap, every iteration scope and every tester report, which between them describe the state of it more precisely than this page can.