independent project
Shattered Mind
A surreal exploration game where fragmented objects become tactile perspective puzzles and incomplete memories.
Piecing together unreliable memories
I'm building Shattered Mind as a short, surreal exploration game about missed opportunities, forgotten relationships, memory, and grief. The player restores scattered objects inside shifting spaces while the story emerges through environments, symbolism, lighting, and interaction rather than exposition.
I turn that theme into a physical action through the central mechanic: players inspect, rotate, and reconnect fragments until an incomplete object becomes coherent again. Solving is not only a lock-and-key action; it is a reveal tied to where the player stands and what they can finally see.
Turning solve progress into expressive motion
ClusterAnimator converts solve progress into fragment poses. It caches each fragment's authored position, rotation, radius, and outward direction, then blends between exploded and settled states. Style profiles and interchangeable pose strategies let the same puzzle data produce a restrained assembly, an unstable oscillation, or a smeared surreal transition.
The expensive per-fragment pose generation runs through Burst-compiled parallel jobs, including a specialized smear path. The main thread applies the resulting transforms and emits settled or unsettled events only when state actually changes. This keeps presentation coupled to the solve signal rather than tangled into the rules that decide whether a fragment belongs.
Separating player intent from puzzle rules
The interaction stack separates input sources, camera and raycast context, manipulation drivers, and puzzle gateways. That lets mouse and controller input share the same underlying rules while each interaction can still feel camera-relative and immediate. The resolver determines what the player is actually targeting; the driver then asks the selected cluster or fragment to perform the operation.
That boundary matters because the puzzle logic does not need to know which device produced an action, and input code does not need to understand how fragments are authored. I can adjust targeting, dragging, looking, or rotation without rewriting the cluster state model.
Making every fragment deterministic
Each FragmentPiece owns a stable identifier and maps to one canonical FragmentSlot. The cluster builds that one-to-one binding up front, rejects missing or duplicate mappings, reserves a slot as soon as a smooth snap begins, and publishes events when a piece lands. This keeps an authored object predictable even when it contains hundreds of independently animated pieces.
The current test scene exercises two cluster styles with 200 fragments and 200 matching slots in each cluster. Distance checks stop unrelated pieces from joining, while the stable ID prevents a nearby fragment from snapping into the wrong place. Smooth transitions preserve the tactile finish without making identity or occupancy ambiguous.
Treating completion and revelation as different states
Placing every fragment completes the object, but it does not automatically solve the scene. A composable criteria system can also require the object to face a target direction, occupy a specific position, remain visible inside the camera viewport, or wait for an external story flag. The same criteria produce a continuous progress value before they approve the final solve.
I can combine those signals by minimum, weighted average, multiplication, or an authored order. That gives me a useful technical-design control: the animation can begin acknowledging alignment before the puzzle resolves, while the final event still waits for every required condition. The mechanic can therefore create the intended “line it up and reveal it” moment instead of resolving as soon as a checklist is mechanically complete.
Building an authoring loop, not just a prototype
The companion editor workflow turns an imported fragment hierarchy into a playable cluster. An auto-setup command creates the slot scaffold, adds fragment and identity components, populates canonical bindings, and wires the runtime stack. Runtime C# events and inspector-facing UnityEvents expose piece-snapped, cluster-complete, puzzle-solved, and animation-settled moments to lighting, VFX, access, and narrative scripting.
The current footage deliberately uses checker materials and a minimal environment. It is a systems prototype: clear enough to evaluate targeting, state changes, silhouette, and feedback before final environments make those judgments more expensive. The result is a mechanic I can now author repeatedly and connect to the game's larger language of unreliable memory.


