# Free Cooking & Restaurant Game Assets (Blender, Unreal, Unity, Godot, Three.js)

Part of the Index Scout "Game-making assets" series: free sources organized by genre, downloaded and checked on our own machine. This entry covers Overcooked-style cooking games, restaurant and cafe sims, food trucks, kitchen interiors and food props.

## When to use
Use when an agent or developer needs free, commercial-safe 3D food, kitchen stations and ingredients that come in raw, chopped and cooked versions, plus a tested JavaScript core for chopping, cooking, burning, recipes and timed orders.

## Tested packs (all CC0, downloaded and checked 2026-10-22)
| Pack | What's inside (counted) | Link |
|---|---|---|
| Kenney Food Kit (2.0) | 200 food and kitchenware models, each in GLB, FBX and OBJ, plus 200 preview PNGs: burgers, pizza, sushi, fruit, vegetables, bread, desserts, drinks, plates, pots, pans, knives, cutting boards | [kenney.nl/assets/food-kit](https://kenney.nl/assets/food-kit) |
| KayKit Restaurant Bits (1.0) by Kay Lousberg | 144 glTF models (also FBX and OBJ), one gradient atlas texture: counters, sinks, stoves, ovens, fridges, crates, tables, chairs, plates (clean and dirty), pots, pans, and ingredients in states such as tomato / tomato_slice, burger_uncooked / burger_cooked / burger_trash, potato / potato_chopped / potato_mashed. Ships as a Godot addon folder | [GitHub](https://github.com/KayKit-Game-Assets/KayKit-Restaurant-Bits-1.0) · [itch.io](https://kaylousberg.itch.io/restaurant-bits) |

What we checked: every Food Kit GLB has a valid glTF header, matching file length and at least one mesh (200/200); every Restaurant Bits .gltf parses, has meshes and its external buffer file exists (144/144); all PNGs have valid PNG signatures. Both License.txt files state CC0 1.0 (credit optional: "Kenney" / "Kay Lousberg, www.kaylousberg.com").

For kitchen sounds, see the [Kenney Audio Assets](https://promoteindex.com/p/kenney-audio-assets) listing; for chairs, shelves and room pieces, the Kenney Furniture Kit from our cozy life-sim entry works with both packs.

## Engine import notes
- Godot 4: copy `addons/kaykit_restaurant_bits` into your project; drop .glb/.gltf into the FileSystem dock.
- Unity: use FBX, or install glTFast for GLB/glTF.
- Unreal 5: import FBX, or enable the glTF Importer plugin.
- Blender: File > Import > glTF 2.0.
- Three.js: `GLTFLoader`. Restaurant Bits models share one texture, so load it once.

## Tested helper: kitchen.mjs (Node 20, no dependencies)
Model names map directly: an item's `kind:state` can pick the mesh (for example `tomato:chopped` to `food_ingredient_tomato_slice`, `burger:cooked` to `food_ingredient_burger_cooked`, `burger:burnt` to `food_ingredient_burger_trash`).

```js
// Tiny cooking-game core: ingredient states, stations, recipe matching, timed orders. No deps.
export const STEPS = { chop: { from: 'raw', to: 'chopped', secs: 2 }, cook: { from: 'raw', to: 'cooked', secs: 4, burnAfter: 6 } };
export function makeItem(kind) { return { kind, state: 'raw' }; }
export class Station {
  constructor(type) { this.type = type; this.item = null; this.t = 0; }
  put(item) { if (this.item) return false; const s = STEPS[this.type]; if (!s || item.state !== s.from) return false; this.item = item; this.t = 0; return true; }
  tick(dt) { if (!this.item) return; const s = STEPS[this.type]; this.t += dt;
    if (this.item.state === s.from && this.t >= s.secs) this.item.state = s.to;
    if (s.burnAfter && this.item.state === s.to && this.t >= s.secs + s.burnAfter) this.item.state = 'burnt'; }
  take() { const i = this.item; this.item = null; return i; }
}
const key = i => i.kind + ':' + i.state;
export function matches(recipe, plate) { if (recipe.length !== plate.length) return false;
  const a = recipe.map(key).sort(), b = plate.map(key).sort(); return a.every((x, i) => x === b[i]); }
export class Orders {
  constructor(menu, { timeLimit = 60, seed = 1 } = {}) { this.menu = menu; this.limit = timeLimit; this.open = []; this.score = 0; this.missed = 0; this.s = seed >>> 0; }
  rnd() { this.s = (this.s * 1664525 + 1013904223) >>> 0; return this.s / 2 ** 32; }
  spawn() { const names = Object.keys(this.menu); const name = names[Math.floor(this.rnd() * names.length)]; const o = { name, left: this.limit }; this.open.push(o); return o; }
  tick(dt) { for (const o of this.open) o.left -= dt; const late = this.open.filter(o => o.left <= 0); this.missed += late.length; this.score -= 10 * late.length; this.open = this.open.filter(o => o.left > 0); }
  serve(plate) { const i = this.open.findIndex(o => matches(this.menu[o.name], plate)); if (i < 0) return 0;
    const o = this.open.splice(i, 1)[0]; const pts = 20 + Math.ceil(10 * o.left / this.limit); this.score += pts; return pts; }
}
```

Tested behaviours (assert-based test, passed on Node 20.19): a cutting board accepts only raw items and one at a time; chopping finishes after 2 s; chopped items can't be re-chopped; a stove cooks in 4 s and burns 6 s later; recipes match regardless of plate order but not with wrong states; seeded order spawning is repeatable; serving scores 20 plus a speed bonus, and expired orders cost 10 points.

## Steps for an agent
1. Download both packs from the links above (Kenney zip from the asset page; KayKit via GitHub clone or itch.io).
2. Keep each License.txt with the assets; credit is optional.
3. Build the kitchen from Restaurant Bits counters and stoves, and use Food Kit for extra dishes, drinks and desserts.
4. Drive gameplay with kitchen.mjs and swap meshes on each state change.

Sources: kenney.nl and Kay Lousberg (KayKit). Not affiliated with either; packs and terms can change, so check each page before release.
