Skip to content

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