Miaw Cooks
A top-down kitchen game built as a study in clean architecture. I wired event-driven input with rebindable controls, a polymorphic counter hierarchy behind a shared interface, ScriptableObject recipes, and two state machines driving the cooking and the match itself.
Playable Open the WebGL tab to play it in your browser.
-
01
Input Event-Driven, Rebindable Input
Built an input layer on Unity's New Input System that rebroadcasts intent as C# events (
OnInteractAction,OnInteractAlternateAction), and added full interactive rebinding for keyboard and gamepad, persisted to PlayerPrefs as JSON. Gameplay subscribes to intent instead of polling keys.GameInput.cs -
02
OOP Counter Inheritance Hierarchy
Designed a
BaseCounterwith virtualInteractandInteractAlternate, then subclassed the clear, cutting, stove, container, plates, delivery, and trash counters so new stations drop in through polymorphism - the player calls the base method and the override handles the rest.BaseCounter.cs -
03
Interface Shared Carry Contract
Implemented an
IKitchenObjectParentinterface on both the player and every counter, so a held item is parented, queried, cleared, and transferred through one contract no matter who holds it - the item never needs to know whether its parent is a player or a benchtop.KitchenObject.cs -
04
State Machine Stove Cooking FSM
Programmed the stove as a finite state machine - Idle → Frying → Fried → Burned - that advances on per-recipe timers and raises
OnStateChangedandOnProgressChangedevents, exposing progress to the UI through anIHasProgressinterface so the bar code stays decoupled.StoveCounter.cs -
05
Data ScriptableObject Recipes
Drove cutting, frying, and burning from ScriptableObject recipe assets pairing input, output, and timing, so designers add or rebalance recipes in the Inspector with zero code changes.
CuttingRecipeSO.cs -
06
Systems Order & Game-State Managers
Built a
DeliveryManagerthat spawns timed orders and validates a delivered plate by comparing ingredient sets, and aKitchenGameManagerthat runs the match as a state machine - waiting → countdown → playing → over - with pause handled throughTime.timeScale.DeliveryManager.cs·KitchenGameManager.cs