Pocket Mini Games
Casual Pack
Ten fully playable casual mini-games — Match-3, Bubble Shooter, Brick Balls, 2048, Snake, Maze, Memory Match, Whack-a-Mole, Cups and Balls, and Tic Tac Toe. Boosters, achievements, reskins, tutorials, and difficulty scaling are wired up out of the box.
Overview
Ten polished casual games, all built on a single contract so you can drop, replace, or extend them as you wish.
Match-3
Swap-to-match candy-style with specials, cascades, and combos
Bubble Shooter
Aim & pop cluster-matching shooter with bombs and rainbow
Brick Balls
Salvo-launching arkanoid hybrid with descending rows
2048
Slide-and-merge classic with undo, smash & shuffle
Snake
Smooth or snappy snake with ghost / slow / magnet boosters
Maze
Carved maze with breadcrumb trail and decision arrows
Memory Match
Pair-flipping memory game with streak bonuses
Whack-a-Mole
Timed mole-tapping arcade with golden bonus moles
Cups and Balls
Shell-game shuffle with streak scoring
Tic Tac Toe
Versus AI (Easy / Medium / Minimax) with hint & undo
IMiniGame and is auto-discovered by the dashboard. Boosters, achievements, reskins, and tutorials are picked up by reflection — no central registration list.Shared Capabilities
💥 Boosters
2-4 per-game power-ups with refund safety, defined in <Game>BoosterSpec.cs
🏆 Achievements
3-5 progression goals per game with toast notifications
🎨 Reskins
Per-slot sprite overrides via ReskinManager + skin pill UI
🎯 Tutorials
First-run overlay tutorials defined in <Game>TutorialSpec.cs
📈 Difficulty Scaling
Per-level multipliers via LevelManager
🎁 HCE Bundled
HyperCasual Essentials included for audio, IAP, ads, save
How It Works & Customizing
Read this first — it explains what kind of asset this is and the right way to customize it.
What this means for you
- You customize through data, not by hand-editing the scene. Hand-moving a generated UI object won't persist — the game regenerates it on Play. Customize via the settings assets, theme, and reskins described below — those are read by the build, so your changes persist and the game stays fully playable.
- The included demo scenes (
PocketMiniGames_Dashboard,PocketMiniGames_Casual) are real, fully-built scenes you can open and inspect. On Play the dashboard regenerates the UI live from current code.
The Toolset — your customization hub
Open Tools → Pocket MiniGames → Toolset. It has a tab per category, and inside, a panel for every game exposing all of its tunable settings — board size, colours, speed, time limits, AI difficulty, win conditions, and more.
Assets/PocketMiniGames/Resources/Config/ and are loaded by the games at runtime — so your tuning takes effect both in the editor and in a built game. Edit them in the Toolset, or select the .asset directly and use the Inspector.Customization at a glance
| Want to change… | Where |
|---|---|
| A game's rules / difficulty / dimensions | Toolset → category tab → game panel — or its <Game>Settings asset in Resources/Config/ |
| Per-level difficulty curve | Toolset → game panel → Levels editor — regenerate or hand-edit each level (see Level Scaling) |
| Colours / overall look | The MiniGameTheme asset (Toolset → Theme tab) + the in-app Light/Dark toggle |
| Game art (gems, bubbles, snake, cards…) | The Reskin system — drop your sprites per slot |
| Boosters offered / their counts | Each game's <Game>BoosterSpec.cs |
| Deeper layout / behaviour changes | The game's <Game>Game.cs build code — see Architecture |
Quick Start
Get the demo running and your first game on screen in under 2 minutes.
Pull Pocket Mini Games · Casual Pack in from the Asset Store, or copy
Assets/PocketMiniGames/ into your project. The bundled Assets/HyperCasualEssentials/ folder comes along for the ride.Find the demo at
Assets/PocketMiniGames/Demo/PocketMiniGamesDashboard.unity (or under Samples in Package Manager). It shows all 10 games in a single picker.The dashboard auto-discovers every game tagged with
[MiniGame] and lists them. Click any tile to play.Tools → HCE → Setup Wizard — creates the audio, economy, IAP, and ads config assets HCE needs for production builds. The casual games themselves run without any HCE setup at all.You don't need the dashboard. Each game implements
IMiniGame: create an instance, call Mount(host, ctx), then NewRound(). See Add to Your Project.RectTransform you give it, so the pack has zero scene dependencies.Architecture
A small, predictable contract; every game follows the same shape.
The IMiniGame contract
Every game is a plain C# class implementing this interface. The dashboard (or your own host) hands the game a RectTransform to build inside and an IMiniGameContext for audio, theme, events, and settings.
C#public interface IMiniGame
{
string Id { get; } // stable snake_case id
string DisplayName { get; }
string Category { get; } // "Casual" for this pack
string ShortDescription { get; }
void Mount(RectTransform host, IMiniGameContext ctx);
void Unmount();
void NewRound();
IEnumerable<CheatAction> GetCheatActions();
}
Auto-discovery
Four reflection-based registries scan every loaded assembly at startup — you never edit a central registration list:
| Registry | Discovers | Convention |
|---|---|---|
MiniGameRegistry | Classes implementing IMiniGame tagged [MiniGame(id, name, ...)] | One per game |
BoosterSpecRegistry | Classes implementing IBoosterSpec | <Game>BoosterSpec.cs |
AchievementRegistry | Classes implementing IAchievementSpec | <Game>AchievementSpec.cs |
ReskinSpecRegistry | Classes implementing IReskinSpec | <Game>ReskinSpec.cs |
TutorialSpecRegistry | Classes implementing ITutorialSpec | <Game>TutorialSpec.cs |
Per-game folder layout
Every game lives in its own folder under Runtime/Casual/<GameName>/ with exactly five companion files:
FolderAssets/PocketMiniGames/Runtime/Casual/Match3/
│
└─ Match3Game.cs // IMiniGame — gameplay + visuals
└─ Match3Settings.cs // ScriptableObject defaults
└─ Match3BoosterSpec.cs // IBoosterSpec
└─ Match3AchievementSpec.cs // IAchievementSpec
└─ Match3ReskinSpec.cs // IReskinSpec — per-slot sprite slots
└─ Match3TutorialSpec.cs // ITutorialSpec
Runtime flow
Match-3
Candy-style swap-to-match-three with cascades, specials, and combo chains.
Gameplay
Swipe or tap-tap an adjacent pair of gems to swap them. Three-in-a-row pops with score and audio, cascades resolve until the board is stable, and longer matches promote special candies that detonate rows, columns, 3×3 areas, or whole colours.
Specials
| Special | Created by | Effect |
|---|---|---|
| Striped (H/V) | 4 in a line | Clears the entire row or column |
| Wrapped | L / T-shape (3×3 corner) | 3×3 burst around the candy |
| Colour Bomb | 5 in a line | Clears every gem of the swapped colour |
Controls
- Drag from a gem onto an adjacent gem — instant swap
- Tap, then tap an adjacent gem — same result, two-step fallback
Boosters
| Key | Name | Effect |
|---|---|---|
hammer | Hammer | Tap a single gem to smash it (no specials) |
shuffle | Shuffle | Re-rolls the whole board until match-free |
bomb | Drop a Bomb | Spawns a Colour Bomb at a random cell |
clock | More play | +10s in time mode, +5 moves in move-limited mode |
Configurable Settings
Edit Match3Settings.cs or override the default at runtime:
| Field | Range | Notes |
|---|---|---|
Cols / Rows | 5–9 | Board dimensions |
Colours | 3–6 | Palette size |
RoundSeconds | 0–240 | 0 = unlimited; ignored if MoveLimit > 0 |
ScoreTarget | 0–5000 | Win condition. 0 = play to time-out |
MoveLimit | 0–60 | >0 disables timer and runs in puzzle mode |
Bubble Shooter
Aim, fire, and pop clusters of three or more matching bubbles before the ceiling overflows.
Gameplay
Mouse / touch to aim, click to fire. Bubbles bounce off side walls and stick on contact. Clusters of MinPopChain+ same-coloured bubbles pop and grant score. Disconnected "floaters" drop and pay double. A combo streak rewards back-to-back successful shots.
Special Bubbles
| Type | Behaviour |
|---|---|
| Normal (coloured) | Clusters with same colour |
| Bomb | Detonates surrounding bubbles on impact |
| Rainbow | Adopts the most-common adjacent colour on land |
| Stone | Unpoppable; only drops when its support is broken |
| Cracked | Takes multiple hits before popping |
Boosters
| Key | Name | Effect |
|---|---|---|
force_bomb | Bomb Shot | Replaces the current bubble with a Bomb |
force_rainbow | Rainbow Shot | Replaces the current bubble with a Rainbow |
aim | Auto-Aim | Traces every shot angle, then auto-aims and fires at the largest poppable cluster |
Win / Lose Conditions
- Win: board cleared of all coloured bubbles (+250 bonus)
- Lose: any bubble reaches the configured danger row
Brick Balls
A salvo-launching arkanoid hybrid — aim once, watch your whole ball stack bounce, then survive a descending row of bricks.
Gameplay
Each turn the player aims and fires a salvo of balls. Balls bounce off walls and bricks, draining brick HP. After the salvo ends, the bricks descend one row and a new row spawns at the top. Survive long enough and you win the level.
Tile Types
| Type | Behaviour |
|---|---|
| Brick | Takes hits equal to level. Score per kill. |
| Stone | Indestructible — bounces balls forever (until pushed off the bottom) |
| Pickup | Grants an extra ball on contact for next salvo |
| Bomb | Detonates in a small radius on hit, chain-reacting |
| Arrow | Row / column arrows clear a whole line |
Boosters
| Key | Name | Effect |
|---|---|---|
extra_balls | Extra Balls | +5 balls to your salvo |
aim_assist | Long Aim | Auto-Aim: simulates the full bouncing flight for every angle and fires the salvo at the most damaging shot |
bomb_shot | Bomb Shot | Arms 3 splash-bomb balls (3×3 detonation); charges carry across salvos |
freeze_row | Hold The Line | Skip the next descend; bricks stay in place |
2048
The classic slide-and-merge puzzle — reach 2048, but no further moves loses.
Gameplay
Swipe / arrow keys to slide every tile in that direction. Identical adjacent tiles merge into double-value tiles. After every move a new 2 (or occasional 4) spawns. Reach the configured WinTile to win; lose when the board is full with no merges available.
Boosters
| Key | Name | Effect |
|---|---|---|
undo | Undo Move | Revert the last slide. One-shot per use |
smash | Smash Tile | Arms tap-to-delete mode; cancels with refund |
shuffle | Shuffle | Re-arranges every tile to a random cell |
Settings
| Field | Range | Notes |
|---|---|---|
GridSize | 3–6 | Board side length |
WinTile | any power of 2 | Default 2048 |
FourSpawnChance | 0–1 | Probability of spawning a 4 instead of a 2 |
Snake
The classic, with smooth interpolation, walls / wrap modes, two visual styles, and three boosters.
Gameplay
Steer with arrow keys, WASD, or the on-screen D-pad. Eat the apple to grow and score; crash into a wall (when wrap is off) or your own body and lose. Filling the entire grid wins the round.
Modes
- Snappy — one cell per tick, no interpolation (true classic)
- Smooth — segments lerp between cells; mid-tick steering is allowed
- Wrap on/off — toroidal edges or hard walls (with visible boundary)
- Modern / Classic visual styles, toggleable from the top-right pills
Boosters
| Key | Name | Effect |
|---|---|---|
slow | Slow Time | Halves snake speed for 5 seconds |
ghost | Phase Ghost | Pass through your own body for 5 seconds; body dims |
magnet | Apple Magnet | Reels the apple toward your head with an accelerating gravity-pull, red trail and spark particles |
Maze
Recursive-backtracker maze with breadcrumb trail, decision arrows, and three navigation boosters.
Gameplay
Move with arrow keys / WASD / on-screen D-pad / on-board direction arrows. At every junction the available exits are highlighted. A yellow trail tracks the path you've walked; backtracking erases it. Reach the goal in the bottom-right to win.
Boosters
| Key | Name | Effect |
|---|---|---|
reveal | Reveal Path | BFS from current cell to goal; draws a fading dot trail along the route |
dash | Speed Dash | 2.5× travel speed for 5 seconds; cyan halo around player |
breakwall | Break Wall | Arms the next blocked direction to break through; amber halo |
Settings
| Field | Range | Notes |
|---|---|---|
Width / Height | 5–25 | Grid cells per side |
RoundSeconds | 0–240 | Optional time pressure; 0 = no timer |
Memory Match
Pair-flipping memory game with streak bonuses and three helper boosters.
Gameplay
Tap two cards to flip them. If their icons match, they stay face-up and the streak counter increments. If not, both flip back. Clear the whole board to win; fewer moves means a higher score. A "Perfect Recall" achievement fires when you clear with zero mismatches.
Boosters
| Key | Name | Effect |
|---|---|---|
peek | Peek | Reveal every face for 1 second |
hint_pair | Pair Hint | Highlight a still-unmatched pair |
auto_match | Auto-Match | Instantly resolves one matching pair |
Scoring
Formulascore = max(0, _pairs × 50 − _moves × 5)
Whack-a-Mole
Timed mole-tapping arcade. Spawn interval ramps from StartSpawnInterval to EndSpawnInterval as the round clock drains.
Gameplay
Moles pop out of holes at quickening intervals. Tap them while they're up for points; let one disappear or tap an empty hole and you lose points. ~12% of spawns are golden moles — 3× score and a brief stay window.
Boosters
| Key | Name | Effect |
|---|---|---|
slow | Slow Moles | Doubles spawn interval for 6 seconds |
score2x | Double Score | Hits worth 2× for 6 seconds |
multi | Auto-Whack | Auto-whacks the next 3 moles that pop up |
Settings
| Field | Range | Notes |
|---|---|---|
Cols / Rows | 2–5 | Grid of holes |
RoundSeconds | 15–120 | Round duration |
StartSpawnInterval | 0.4–2.5 | Seconds between pops at round start |
EndSpawnInterval | 0.2–1.5 | Seconds at round end (faster) |
MoleStayDuration | 0.6–2.5 | How long a mole stays up |
Cups and Balls
The shell game — remember which cup hides the ball, then pick after the shuffle.
Gameplay
Peek which cup holds the ball, watch a sequence of swap animations, then tap the cup you think still hides it. Correct picks build a streak that multiplies score; wrong picks reset the streak.
Boosters
| Key | Name | Effect |
|---|---|---|
slow_shuffle | Slow Shuffle | Doubles the duration of every remaining swap |
peek | Peek | Briefly pulses the ball-cup. Defers to end-of-shuffle if pressed mid-shuffle |
Settings
| Field | Range | Notes |
|---|---|---|
CupCount | 3–5 | How many cups |
Shuffles | 3–30 | Number of swap animations per round |
SwapDuration | 0.10–0.50 | Seconds per swap (lower = harder to follow) |
PeekDuration | 0.3–2.0 | How long the initial reveal lingers |
Tic Tac Toe
3×3 versus AI — pick your difficulty.
Gameplay
You play X, the AI plays O. Three in a row (horizontal, vertical, or diagonal) wins. Win streaks are tracked across rounds.
AI Difficulty
| Level | Strategy |
|---|---|
| Easy | Picks any empty cell at random |
| Medium | Win-if-possible → block player win → centre → corners → edges |
| Hard | Full minimax — never loses optimal play |
Boosters
| Key | Name | Effect |
|---|---|---|
hint | Best Move | Glows the minimax-optimal cell for you |
undo | Undo | Rolls back the last player+AI pair of moves |
Boosters
2–4 per-game power-ups with persistent counts, refund safety, and auto-discovery.
Defining a booster
Every game owns a <Game>BoosterSpec.cs implementing IBoosterSpec. The spec is auto-discovered by BoosterSpecRegistry:
C#public sealed class Match3BoosterSpec : IBoosterSpec
{
public string GameId => "casual_match3";
public IReadOnlyList<BoosterDef> Boosters { get; }
public Match3BoosterSpec()
{
Boosters = new[]
{
new BoosterDef("hammer", "Hammer", BoosterIconFactory.Hammer,
Color.white, new Color(0.95f, 0.55f, 0.30f),
description: "Tap any single gem to smash it."),
// ...
};
}
}
Activating a booster
The shared BoosterBar component renders the strip and calls back into the game's handler. Each game routes the key through its own switch:
C#bool OnBoosterActivated(string key)
{
if (_ended || _busy) return false; // false = refund
switch (key)
{
case "hammer": /* ... */ return true;
case "shuffle": /* ... */ return true;
}
return false; // unknown key, refund the booster charge
}
false from the handler refunds the booster — use this when the activation can't proceed (e.g. not enough balls for Bomb Shot). Returning true deducts one charge from BoosterManager.Full booster catalogue
| Game | Boosters |
|---|---|
| Match-3 | hammer, shuffle, bomb, clock |
| Bubble Shooter | force_bomb, force_rainbow, aim |
| Brick Balls | extra_balls, aim_assist, bomb_shot, freeze_row |
| 2048 | undo, smash, shuffle |
| Snake | slow, ghost, magnet |
| Maze | reveal, dash, breakwall |
| Memory Match | peek, hint_pair, auto_match |
| Whack-a-Mole | slow, score2x, multi |
| Cups and Balls | slow_shuffle, peek |
| Tic Tac Toe | hint, undo |
Achievements
3–5 progression goals per game. Tracked persistently via AchievementManager with toast notifications on unlock.
Defining achievements
Every game owns a <Game>AchievementSpec.cs:
C#public sealed class Match3AchievementSpec : IAchievementSpec
{
public string GameId => "casual_match3";
public IReadOnlyList<AchievementDef> Achievements { get; } = new[]
{
new AchievementDef("cascade_5", "Sweet Cascade",
"Reach a 5+ cascade depth", target: 5),
// ...
};
}
Raising progress
Two helper calls from inside the game:
C#// Set the progress to a value if it's higher than the current.
AchievementManager.RaiseProgress(Id, "cascade_5", chain);
// Increment cumulative counters (eg. total apples eaten).
AchievementManager.IncrementProgress(Id, "apple_picker", 1);
Stored data
Progress is persisted via HCE's save system. Each achievement remembers its current value and unlock state; toast notifications fire automatically when the target is reached.
Reskins
Drop in your own art per slot, per game — no code required.
The Reskin Editor
Open Tools → Pocket MiniGames → Reskin Editor. Pick a game on the left, then for each slot browse or drag in your own image. The art is copied into Resources/Reskin/<gameId>/<slot>.png, auto-imported as a Sprite, and a per-slot transform (scale / offset / rotation) is saved alongside it as .json. Both ship in builds — no addressables setup.
Per-game slot list
Each game owns a <Game>ReskinSpec.cs declaring its sprite slots. Every slot below is read and applied by the game — drop in art and it shows up. Any slot left empty falls back to the built-in procedural look.
| Game | Slots |
|---|---|
| Match-3 | gem (tinted per colour), background |
| Bubble Shooter | bubble, bomb, rainbow, shooter_base, background |
| Brick Balls | ball, block, pickup, bomb_block, shooter_base, background |
| 2048 | tile (tinted per value), cell_empty, background |
| Snake | head, body, apple, background |
| Maze | player, goal, wall, floor, background |
| Memory Match | card_back, card_face, background |
| Whack-a-Mole | mole, hole, mallet (hit-effect), background |
| Cups and Balls | cup, ball, background |
| Tic Tac Toe | mark_x, mark_o, cell, background |
Applying a custom sprite
Every game reads its reskin via ReskinManager.GetSprite(gameId, slotKey, fallback). Once a game has custom art in any slot it uses that art by default — no toggle needed. The Skin Toggle Pill in each game's top-left still lets the player flip between custom and default art at runtime, and any explicit choice they make is persisted (PlayerPrefs) across relaunches.
C#// Inside a game's spawn / styling code
var custom = ReskinManager.GetSprite(Id, "bubble", null);
var sprite = custom != null ? custom : SpriteFactory.Circle;
Tutorials
First-run overlay walkthroughs — defined declaratively per game.
Defining a tutorial
Each game owns a <Game>TutorialSpec.cs with an ordered list of steps. The overlay appears once on the player's first session per game and can be replayed from the cheat panel.
C#public sealed class SnakeTutorialSpec : ITutorialSpec
{
public string GameId => "casual_snake";
public IReadOnlyList<TutorialStep> Steps { get; } = new[]
{
new TutorialStep("Use arrow keys or the D-pad to steer."),
new TutorialStep("Eat the red apple to grow."),
new TutorialStep("Don't crash into yourself!"),
};
}
Level Scaling
Per-game difficulty progression — auto-generated, fully editable in the Toolset.
How it works
LevelManager.GetDifficultyForCurrent(gameId) returns a bag of scaling multipliers indexed by key. Games read e.g. diff.Get("difficulty", 1f) and use it to ramp score targets, time budgets, AI depth, etc.
C#var diff = LevelManager.GetDifficultyForCurrent(Id);
float k = Mathf.Max(0.5f, diff.Get("difficulty", 1f));
_scoreTargetForRound = Mathf.RoundToInt(_settings.ScoreTarget * k);
_timeLeft = Mathf.Max(20f, _settings.RoundSeconds / Mathf.Sqrt(k));
Level state is persisted, so LevelManager.GetCurrent(gameId) remembers where the player left off across sessions. Use LevelManager.Advance(gameId) on win, LevelManager.Reset(gameId) on loss (or never, depending on your design).
Editing levels in the Toolset
Out of the box every game gets a 30-level curve from a built-in formula (difficulty ramps gently from level 1). You don't have to leave it at that — each game's Toolset tab now has a Levels editor under its Level / authoring tools section, where you can:
- Regenerate the whole curve — set a level count, a start and end difficulty, and an optional random jitter, then hit Regenerate levels.
- Hand-edit any level — rename it and set its exact difficulty multiplier in the scrollable per-level list.
The first time you open a game's Levels editor it creates a LevelSet asset at Resources/Config/Levels/<gameId>.asset. When that asset exists it overrides the built-in formula — LevelSpecRegistry resolves levels in the order: explicitly-coded ILevelSpec → LevelSet asset → the default formula. Because the asset lives under Resources/, your edited curve is loaded by the game at runtime, in both the editor and a built game.
LevelSet asset, no change in behaviour — the formula curve is the default. Create one only for the games whose progression you want to hand-tune.Light & Dark Mode
One toggle re-themes the whole scene — chrome and all ten games — between a dark and a light palette.
How it works
Every game reads its colours from _ctx.Theme, a MiniGameTheme asset. The theme now carries two full palettes and a switch:
C#// Swap every colour field between the dark and light palettes.
theme.ApplyMode(bool light);
// True while the light palette is active — games can branch on it.
bool isLight = theme.IsLightMode;
The dashboard header has a DARK / LIGHT pill. Tapping it flips the palette, persists the choice (pmg_light_mode), and rebuilds the scene — chrome plus the active game — so every element repaints. The default is dark.
Both palettes stay readable
The light palette is contrast-checked: light scene + white panels, dark text, medium-blue accents. The well-defined pairings — PanelBackground/TextPrimary, TileFilled/TextOnTile, Accent/TextOnAccent — keep high contrast in both modes, so text never washes out.
Per-game adaptation
Each game's internal surfaces (boards, grids, walls, holes, cells) adapt too. Vivid gameplay-identity colours — gem palette, snake green, 2048 number tiles, brick colours, mole brown/gold — stay vivid in both modes. A few elements flip by necessity: the maze walls are drawn light-on-dark in dark mode and must become dark-on-light in light mode, and Brick Balls' white balls / aim dots tint dark so they read against the light board.
_ctx.Theme rather than hardcoding new Color(...), and it will support light mode for free. Only route structural surfaces through the theme — keep identity colours fixed.Add to Your Project
Two paths: the bundled dashboard, or a single game inside your own UI.
Path A — use the bundled dashboard
The fastest way: drop Assets/PocketMiniGames/Demo/PocketMiniGamesDashboard.unity into your build settings. It auto-loads every IMiniGame in the project and lets the player switch between them. Skin it via the included theme system.
Path B — embed a single game
If you want exactly one game inside your own scene / UI:
C#using PocketMiniGames.Core;
using PocketMiniGames.Casual.Match3;
public class MyGameHost : MonoBehaviour
{
[SerializeField] RectTransform _host; // where the game builds its UI
IMiniGame _game;
void Start()
{
_game = new Match3Game();
_game.Mount(_host, MiniGameContext.Default);
// NewRound() is called by Mount() automatically; call it again to restart.
}
void OnDestroy() => _game?.Unmount();
}
Listening to events
C#ctx.Events.Subscribe<int>(GameEvents.RoundWon, score => {
Debug.Log($"Player scored {score}");
});
ctx.Events.Subscribe<int>(GameEvents.RoundLost, score => { /* ... */ });
ctx.Events.Subscribe<int>(GameEvents.ScoreChanged, score => { /* HUD update */ });
Unmount() leaves animation coroutines running on destroyed transforms. The unmount path latches an internal flag that lets in-flight tweens short-circuit safely.Customizing
Tune defaults, swap art, rewire boosters — everything is configurable.
Override default settings
Each game uses a ScriptableObject for its defaults (e.g. Match3Settings.asset). Create a new Match3Settings via Create → Pocket MiniGames → Casual menus, edit fields in the inspector, and assign it via ctx.Settings.Get<Match3Settings>() — or just mutate the fields on Match3Settings.Default at runtime.
Theme colours
Each game pulls colours from ctx.Theme — Accent, TextPrimary, PanelBackground, TileFilled, Success, etc. Swap themes globally and every game re-skins instantly.
Boosters: add / remove / rebalance
- To remove a booster from a game, delete its
BoosterDeffrom the spec. - To add a booster, append a new
BoosterDefAND handle the key inside the game'sOnBoosterActivated. - To change starting counts, pass
defaultCount: Nto theBoosterDefconstructor. - To award boosters from your meta-game, call
BoosterManager.Add(gameId, key, count).
Audio
Every game uses ctx.Audio.Play(SfxKind.<...>) — piping into HCE's AudioService. Configure the sound bank via Tools → HCE → Toolset → Audio to override which clip plays for which kind.
HCE Bundled
HyperCasual Essentials is included in this pack as the backend — full version, no stripping.
- Audio — pooled SFX, music crossfade, mixer routing
- Save system — persistent booster counts, achievements, level progress
- Events bus —
RoundStarted,ScoreChanged,RoundWon,RoundLost - Theme service — colours each game reads from at build time
- UI feedback — tweens, confetti, popups, toasts, countdown timers
- Ads / IAP / Daily / Wheel — optional meta-game systems; unused by gameplay but available for your shop / reward flows
The bundled HCE is the full version — identical to the standalone Asset Store SKU. It has its own deep documentation:
PathAssets/HyperCasualEssentials/Documentation/HCE-Documentation.html
Adding New Games
Mirror the per-game folder shape and the dashboard picks up your game automatically.
Assets/PocketMiniGames/Runtime/Casual/MyGame/MyGameGame.csImplement
IMiniGame — Mount, Unmount, NewRound, GetCheatActions. Tag the class with [MiniGame(id, name, Category=MiniGameCategory.Casual)].A
MyGameSettings : ScriptableObject with a static Default getter, mirroring the other games.Drop in
MyGameBoosterSpec.cs, MyGameAchievementSpec.cs, MyGameReskinSpec.cs, MyGameTutorialSpec.cs — each implementing its respective interface. They'll be auto-discovered.The dashboard now lists your game. No edits required to any existing file.
IMiniGame implementations, with MiniGameCategory changed.Troubleshooting
The most common issues, with answers.
My game doesn't show up in the dashboard
Three things to check: (1) the class implements IMiniGame, (2) it has the [MiniGame("snake_case_id", "Display Name", Category=MiniGameCategory.Casual)] attribute, (3) the assembly is loaded — if your game lives in its own asmdef, make sure that asmdef references PocketMiniGames.Core.
A booster button does nothing when pressed
The booster's key in the spec must EXACTLY match the case in your game's OnBoosterActivated. If the key is unknown, the handler returns false and the booster is silently refunded — nothing visible happens. Compare strings character-for-character.
Boosters never run out / never persist
Booster counts are persisted via HCE's save system. If HCE's save layer isn't initialised (e.g. running tests with no HCESettings asset), counts default to the booster's defaultCount every session. Run Tools → HCE → Setup Wizard to create the asset.
Tutorials replay every time I press Play in the editor
The "seen" flag is keyed by gameId in PlayerPrefs. If you delete PlayerPrefs / Library between runs the flag resets. To force-disable replay, set ITutorialSpec.AutoShow = false in your tutorial spec.
Reskin sprites don't apply
Two things: (1) the image must be imported into a slot via Tools → Pocket MiniGames → Reskin Editor — it lands under Resources/Reskin/<gameId>/, and once it's there the game uses it by default; (2) the skin pill stays greyed out (Skin: —) until at least one slot has custom art — that's expected, not a bug. If you previously toggled the pill to Default for that game, that choice is remembered — toggle it back to Custom.
Coroutines complain about destroyed RectTransforms when I switch games
You're not calling Unmount() before destroying the host. The unmount path latches an internal _ended flag that the fire-and-forget tween coroutines watch. Skipping it means the tweens fire one extra frame against a destroyed transform. Always pair Mount with Unmount.
Where do I report a bug specific to one game?
Email ragendom@gmail.com with: Unity version, target platform, the game id (e.g. casual_match3), the exact steps to reproduce, and the console log if there's an exception.
Release Notes
What changed since the first release.
v1.1.0
New — Light & Dark Mode
- A DARK / LIGHT toggle in the dashboard header re-themes the whole scene — chrome plus all ten games. See Light & Dark Mode.
MiniGameThemegained a full light palette,ApplyMode(bool light), and anIsLightModeflag. The choice is persisted; default is dark.- Every game's internal surfaces (boards, grids, walls, holes, cells) adapt to the active palette while keeping vivid gameplay colours fixed.
Booster reworks
- Bubble Shooter — Auto-Aim (was Long Aim): traces every shot angle and auto-fires at the largest poppable cluster.
- Brick Balls — Long Aim is now a true auto-shot: it simulates the full bouncing flight for every angle and fires the salvo at the most damaging shot.
- Brick Balls — Bomb Shot always activates now; bomb charges carry across salvos instead of being gated by ball count.
- Whack-a-Mole — Auto-Whack (was Multi-Hit): auto-whacks the next 3 moles that pop up. All three boosters now show live status chips in the header.
- Snake — Apple Magnet now reels the apple toward the head with an accelerating gravity-pull, red trail and spark particles, instead of teleporting it.
- Maze — Reveal Path draws a BFS dot trail to the goal; Dash and Break Wall show a coloured aura around the player.
- Match-3 — More play (the clock booster) adds +5 moves in move-limited mode where a timer doesn't exist.
- Slow-down boosters now use an hourglass icon; Brick Balls' Hold The Line uses a snowflake; new icons for Extra Balls and the dashboard shop button.
Polish & fixes
- Timed games (Match-3, Whack-a-Mole, Maze) now pop-animate the timer, redden it, and play a tick each second in the final 5 seconds.
- Snake: rapid 180° turns can no longer cause an instant self-collision; filling the grid now counts as a win.
- Match-3: fixed the score-target scaling; a held tile darkens while dragged.
- Whack-a-Mole: difficulty ramp now actually accelerates; tapping a just-hit mole no longer applies a miss penalty.
- Tic Tac Toe: light-mode grid cells are light-gray rather than blue.
- Hardened game teardown across the pack — coroutines, boosters and round state are cancelled / reset cleanly on Unmount and New Round.
v1.0.0
- Initial release — ten casual games with boosters, achievements, reskins, tutorials and difficulty scaling.
Support & Review
We'd love to hear from you — bug reports, feature requests, or a quick review.
Get in Touch
If you run into any issues, have feature requests, or want help integrating a game into your project — or you'd like a brand-new mini-game added to a future update — drop us a line.
✉ ragendom@gmail.comWe typically respond within 24–48 hours.
Enjoying the pack?
Reviews on the Asset Store are the single biggest help to a small indie publisher — they take a minute and they make a real difference. If Pocket Mini Games · Casual Pack saved you time or inspired you, leaving a star rating means the world.
⭐ Leave a Review on the Asset Store- Check the Troubleshooting section
- Open the demo dashboard to verify the game runs in isolation
- Check the Unity Console for exceptions
- Include the game id (e.g.
casual_snake) so we know which game
- Unity version & render pipeline
- Pack version (currently 1.0.0) and HCE version (1.0.1)
- Target platform (Android / iOS / standalone)
- Console error logs or screenshots
Pocket Mini Games · Casual Pack v1.1.0 · Built for Unity 2021.3+
Support: ragendom@gmail.com