v1.1.0 · Unity 2021.3+

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.

Unity 2021.3+ 10 Games 28 Boosters HCE Bundled

🏠 Overview

Ten polished casual games, all built on a single contract so you can drop, replace, or extend them as you wish.

One contract, ten implementations. Every game implements IMiniGame and is auto-discovered by the dashboard. Boosters, achievements, reskins, and tutorials are picked up by reflection — no central registration list.

Shared Capabilities

How It Works & Customizing

Read this first — it explains what kind of asset this is and the right way to customize it.

This is a procedural-UI games template. Every game builds its own interface and logic in C# at runtime — there are no hand-placed UI prefabs to drag around. The scene only ever stores visuals; all behaviour (buttons, game logic, animation, scoring) is generated by code when the game runs. This is a deliberate, common architecture: it keeps the pack tiny, resolution-independent, and trivial to extend.

What this means for you

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.

💡
Settings you edit in the Toolset are saved to ScriptableObject assets under 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 / dimensionsToolset → category tab → game panel — or its <Game>Settings asset in Resources/Config/
Per-level difficulty curveToolset → game panel → Levels editor — regenerate or hand-edit each level (see Level Scaling)
Colours / overall lookThe 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 countsEach game's <Game>BoosterSpec.cs
Deeper layout / behaviour changesThe game's <Game>Game.cs build code — see Architecture
Set expectations correctly. If you want a hand-authored, designer-drag-and-drop UI, this procedural approach is not that — and converting it would be a full rewrite. For 99% of customization (rules, difficulty, colours, art, boosters) the data-driven path above is faster and fully supported.

Quick Start

Get the demo running and your first game on screen in under 2 minutes.

Import the package
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.
Open the demo scene
Find the demo at Assets/PocketMiniGames/Demo/PocketMiniGamesDashboard.unity (or under Samples in Package Manager). It shows all 10 games in a single picker.
Press Play
The dashboard auto-discovers every game tagged with [MiniGame] and lists them. Click any tile to play.
(Optional) Run HCE Setup Wizard
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.
Drop a single game into your scene
You don't need the dashboard. Each game implements IMiniGame: create an instance, call Mount(host, ctx), then NewRound(). See Add to Your Project.
💡
Procedural everything. No prefabs to wire up. Every game builds its UI at runtime inside the 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:

RegistryDiscoversConvention
MiniGameRegistryClasses implementing IMiniGame tagged [MiniGame(id, name, ...)]One per game
BoosterSpecRegistryClasses implementing IBoosterSpec<Game>BoosterSpec.cs
AchievementRegistryClasses implementing IAchievementSpec<Game>AchievementSpec.cs
ReskinSpecRegistryClasses implementing IReskinSpec<Game>ReskinSpec.cs
TutorialSpecRegistryClasses 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
Modular by design. Delete any single game's folder and the rest keep working. Add a new game by mirroring the layout above — no edits to any other file required.

Runtime flow

Mount(host, ctx) NewRound() Player input loop RoundWon / RoundLost NewRound() or Unmount()

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

SpecialCreated byEffect
Striped (H/V)4 in a lineClears the entire row or column
WrappedL / T-shape (3×3 corner)3×3 burst around the candy
Colour Bomb5 in a lineClears every gem of the swapped colour

Controls

Boosters

KeyNameEffect
hammerHammerTap a single gem to smash it (no specials)
shuffleShuffleRe-rolls the whole board until match-free
bombDrop a BombSpawns a Colour Bomb at a random cell
clockMore play+10s in time mode, +5 moves in move-limited mode

Configurable Settings

Edit Match3Settings.cs or override the default at runtime:

FieldRangeNotes
Cols / Rows5–9Board dimensions
Colours3–6Palette size
RoundSeconds0–2400 = unlimited; ignored if MoveLimit > 0
ScoreTarget0–5000Win condition. 0 = play to time-out
MoveLimit0–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

TypeBehaviour
Normal (coloured)Clusters with same colour
BombDetonates surrounding bubbles on impact
RainbowAdopts the most-common adjacent colour on land
StoneUnpoppable; only drops when its support is broken
CrackedTakes multiple hits before popping

Boosters

KeyNameEffect
force_bombBomb ShotReplaces the current bubble with a Bomb
force_rainbowRainbow ShotReplaces the current bubble with a Rainbow
aimAuto-AimTraces every shot angle, then auto-aims and fires at the largest poppable cluster

Win / Lose Conditions

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

TypeBehaviour
BrickTakes hits equal to level. Score per kill.
StoneIndestructible — bounces balls forever (until pushed off the bottom)
PickupGrants an extra ball on contact for next salvo
BombDetonates in a small radius on hit, chain-reacting
ArrowRow / column arrows clear a whole line

Boosters

KeyNameEffect
extra_ballsExtra Balls+5 balls to your salvo
aim_assistLong AimAuto-Aim: simulates the full bouncing flight for every angle and fires the salvo at the most damaging shot
bomb_shotBomb ShotArms 3 splash-bomb balls (3×3 detonation); charges carry across salvos
freeze_rowHold The LineSkip 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

KeyNameEffect
undoUndo MoveRevert the last slide. One-shot per use
smashSmash TileArms tap-to-delete mode; cancels with refund
shuffleShuffleRe-arranges every tile to a random cell

Settings

FieldRangeNotes
GridSize3–6Board side length
WinTileany power of 2Default 2048
FourSpawnChance0–1Probability of spawning a 4 instead of a 2
💡
The merge resolver correctly blocks double-merges within a single swipe — a freshly merged tile can't merge again the same step.

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

Boosters

KeyNameEffect
slowSlow TimeHalves snake speed for 5 seconds
ghostPhase GhostPass through your own body for 5 seconds; body dims
magnetApple MagnetReels the apple toward your head with an accelerating gravity-pull, red trail and spark particles
Snake's 180° reversal guard uses the last-stepped direction, not the buffered input — chaining two turns in one tick can't instantly drive the head back into the body.

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

KeyNameEffect
revealReveal PathBFS from current cell to goal; draws a fading dot trail along the route
dashSpeed Dash2.5× travel speed for 5 seconds; cyan halo around player
breakwallBreak WallArms the next blocked direction to break through; amber halo

Settings

FieldRangeNotes
Width / Height5–25Grid cells per side
RoundSeconds0–240Optional 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

KeyNameEffect
peekPeekReveal every face for 1 second
hint_pairPair HintHighlight a still-unmatched pair
auto_matchAuto-MatchInstantly 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

KeyNameEffect
slowSlow MolesDoubles spawn interval for 6 seconds
score2xDouble ScoreHits worth 2× for 6 seconds
multiAuto-WhackAuto-whacks the next 3 moles that pop up

Settings

FieldRangeNotes
Cols / Rows2–5Grid of holes
RoundSeconds15–120Round duration
StartSpawnInterval0.4–2.5Seconds between pops at round start
EndSpawnInterval0.2–1.5Seconds at round end (faster)
MoleStayDuration0.6–2.5How 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

KeyNameEffect
slow_shuffleSlow ShuffleDoubles the duration of every remaining swap
peekPeekBriefly pulses the ball-cup. Defers to end-of-shuffle if pressed mid-shuffle

Settings

FieldRangeNotes
CupCount3–5How many cups
Shuffles3–30Number of swap animations per round
SwapDuration0.10–0.50Seconds per swap (lower = harder to follow)
PeekDuration0.3–2.0How 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

LevelStrategy
EasyPicks any empty cell at random
MediumWin-if-possible → block player win → centre → corners → edges
HardFull minimax — never loses optimal play

Boosters

KeyNameEffect
hintBest MoveGlows the minimax-optimal cell for you
undoUndoRolls 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
}
💡
Refund on false. Returning 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

GameBoosters
Match-3hammer, shuffle, bomb, clock
Bubble Shooterforce_bomb, force_rainbow, aim
Brick Ballsextra_balls, aim_assist, bomb_shot, freeze_row
2048undo, smash, shuffle
Snakeslow, ghost, magnet
Mazereveal, dash, breakwall
Memory Matchpeek, hint_pair, auto_match
Whack-a-Moleslow, score2x, multi
Cups and Ballsslow_shuffle, peek
Tic Tac Toehint, 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.

GameSlots
Match-3gem (tinted per colour), background
Bubble Shooterbubble, bomb, rainbow, shooter_base, background
Brick Ballsball, block, pickup, bomb_block, shooter_base, background
2048tile (tinted per value), cell_empty, background
Snakehead, body, apple, background
Mazeplayer, goal, wall, floor, background
Memory Matchcard_back, card_face, background
Whack-a-Molemole, hole, mallet (hit-effect), background
Cups and Ballscup, ball, background
Tic Tac Toemark_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;
Sprite-only. The reskin system swaps sprites — layouts, colours, and animations stay the same. When a game has custom art for a slot it hides the matching procedural detail (e.g. Whack-a-Mole's drawn face, Memory Match's icon glyph stays, the card shading is dropped) so your sprite reads clean.

🎯 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:

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 ILevelSpecLevelSet 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.

💡
No 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.

💡
Building your own game? Read every colour from _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 */ });
Always Unmount. Every game registers coroutines on a global runner; failing to call 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.ThemeAccent, TextPrimary, PanelBackground, TileFilled, Success, etc. Swap themes globally and every game re-skins instantly.

Boosters: add / remove / rebalance

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.

What HCE handles for the Casual Pack
  • Audio — pooled SFX, music crossfade, mixer routing
  • Save system — persistent booster counts, achievements, level progress
  • Events busRoundStarted, 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
🔗 HyperCasual Essentials on the Asset Store
You already own it. The HCE asset is purchasable separately for projects that don't need the mini-games, but this pack includes the entire codebase — you'll never need to buy it on top.

🧰 Adding New Games

Mirror the per-game folder shape and the dashboard picks up your game automatically.

Create a folder
Assets/PocketMiniGames/Runtime/Casual/MyGame/
Add MyGameGame.cs
Implement IMiniGameMount, Unmount, NewRound, GetCheatActions. Tag the class with [MiniGame(id, name, Category=MiniGameCategory.Casual)].
Add settings (optional)
A MyGameSettings : ScriptableObject with a static Default getter, mirroring the other games.
Add boosters / achievements / reskins / tutorial
Drop in MyGameBoosterSpec.cs, MyGameAchievementSpec.cs, MyGameReskinSpec.cs, MyGameTutorialSpec.cs — each implementing its respective interface. They'll be auto-discovered.
Done
The dashboard now lists your game. No edits required to any existing file.
💡
The same pattern is how future packs (e.g. Word Pack, Puzzle Pack, Solitaire Pack) extend the framework — they're just additional folders of 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

Booster reworks

Polish & fixes

v1.0.0

📬 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.com

We 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
💬 Before Contacting
  • 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
📋 Helpful Info to Include
  • 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

Asset Store  ·  HCE on Asset Store