Overview
A match-3 built solo, from the board architecture to the level tooling.
Solo · architecture, algorithms, tooling
The board is split so that each class owns one job: the grid, the filler, the matcher, the sorter, the state machine and the authenticator that validates a move before it commits. They talk through events rather than references, so the collapse and refill sequence does not care what triggered it.
Three skills change how a board gets solved: a bomb that detonates an area, a potion that transforms fruit, and lightning that strikes every matching fruit at once. Each derives from an abstract Skill ScriptableObject, so adding one is an asset and a subclass rather than a change to the manager.
Levels are assembled from goal and obstacle parameters with skills enabled per level, so a new one is a data change rather than new code. Pooling sits behind a generic IPoolSystem interface, which is what let the fruit pool be swapped without touching the board.
My contributions
Board architecture
- Split the board into one class per responsibility: grid and tilemap, filler, matcher, sorter, state machine, and the subscriber that carries events between them. Single responsibility here is not decoration, it is why a match-3 rule change touches one file.
- Built an authenticator above them that validates matches and produces tips, so both features read one definition of what the board allows rather than two that can drift apart.
- Connected them through events rather than direct references, which kept the collapse and refill sequence independent of whatever triggered it.
Algorithms
- Wrote recursive removal on generation so the first board is guaranteed match-free, then a second pass reducing accidental matches as pieces fall.
- Built sequential match handling with a merge pass over it, and shuffle detection driven by events instead of polling every frame.
- Built the tip system to fire on idle and after an invalid swap, with delays tuned so it reads as help rather than as impatience.
Skills and levels
- Built Skill as an abstract ScriptableObject and derived bomb and potion from it, so a new skill is an asset and a subclass and the manager that runs them never changes.
- Made levels data: per-level fruit selection, goal UI and three-star progress driven by parameters rather than by scenes.
- Built an editor tool specifically to test levels.
Pooling and performance
- Wrote pooling behind a generic IPoolSystem<T> interface with a concrete PoolSystem and a fruit-specific pool on top, so the board depends on the abstraction and the implementation can be swapped without touching it.
- Optimised the movement-detection and merge paths and reduced every texture max size, then shipped a web build with a camera size fitter.
Feel
- Built the presentation layer on DOTween: UI and popup animation, button tints, fruit blast and flying particles on a match, lightning VFX.
- Built a sound manager with mute validation covering every audio source, including the ones added late.
Gallery
Project details
- Studio
- Solo
- Genre
- Match-3 Puzzle
- Engine
- Unity
- Platforms
- Web / WebGL
- Stack
- Unity · C# · WebGL · Match-3 · Event Driven · Editor Tools · DOTween




