Cocotas Lab

Free game assets

Free game assets for indie devs and AI coding agents

18 free 2D asset packs from Cocotas Lab, an indie studio: a pixel-art platformer pack and the free Basic edition of every UI kit we make. PNG files with JSON atlases that drop into Godot, Unity, Phaser or a plain HTML5 canvas, free for commercial games. Downloads are free, with no payment. The download page asks for your email address and sends you a sign-in code, then the zip starts. One sign-in covers every pack.

Before you start

License, credit and machine-readable files

License in short

  • Free for personal and commercial games and apps, with no limit on projects or copies sold.
  • You may modify the assets and ship them inside your game, including in its source code repository.
  • You may not resell or redistribute the assets themselves, on their own or in another asset pack.
  • You may not use them to train, fine-tune or evaluate AI models.
  • Credit is appreciated but optional.

Full text: Cocotas Lab Asset License 1.0.

Credit line (optional)

Not required. If you want to credit us in your game or its README, copy this line:

Assets by Cocotas Lab (cocotaslab.com)

For AI coding agents and tools

Every pack on this page is listed in catalog.json (formats, file size, license, credit line, preview and download page), and the page as markdown is in llms-full.txt. Downloads need a person to sign in with an email address, so hand the download page link to whoever you are building for.

The packs

Free packs

How to use

Use the files in your engine

Every zip has the same layout: sprites/ (one PNG per sprite), sheets/ (one sheet per group with a JSON of frame rectangles by name), README.md with the size, frame count and frame rate of every sprite, and LICENSE.txt. UI kits add x2/ and x4/ and extras/nine_slice.json; animated packs add sheets/animations/, one strip per animation. The examples use Little Knight and Deep Space UI Basic.

Godot 4

# Project Settings > Rendering > Textures > Default Texture Filter = Nearest (pixel art)
# An animation strip: N frames left to right, N is in the file name
var knight := Sprite2D.new()
knight.texture = load("res://LittleKnight/sheets/animations/knight_run_strip8.png")
knight.hframes = 8
add_child(knight)

# A UI panel that stretches: NinePatchRect + the margins from extras/nine_slice.json
# (exporting? add *.json to Export > Resources > "Filters to export non-resource files")
var panel := NinePatchRect.new()
panel.texture = load("res://DeepSpaceUi_Basic/sprites/panels/panel_holo.png")
var m = JSON.parse_string(FileAccess.get_file_as_string("res://DeepSpaceUi_Basic/extras/nine_slice.json"))["slices"]["panel_holo"]
panel.patch_margin_left = m.left; panel.patch_margin_top = m.top
panel.patch_margin_right = m.right; panel.patch_margin_bottom = m.bottom
add_child(panel)

Unity

1. Drop the folder into Assets/.
2. Select the PNGs: Texture Type = Sprite (2D and UI). Pixel art: Filter Mode = Point, Compression = None.
   UI kits: Filter Mode = Bilinear, tick Alpha Is Transparency.
3. Animation strip (knight_run_strip8.png): Sprite Mode = Multiple, Sprite Editor > Slice > Grid By Cell Count,
   8 columns x 1 row; select the slices and drag them into the scene to get an animation clip.
4. 9-slice panel: Sprite Editor > Border = left/top/right/bottom from extras/nine_slice.json,
   then Image component > Image Type = Sliced.

Phaser 3

// new Phaser.Game({ pixelArt: true, ... }) for pixel art
preload() {
  this.load.atlas('props', 'LittleKnight/sheets/props.png', 'LittleKnight/sheets/props.json');
  this.load.spritesheet('knight_run', 'LittleKnight/sheets/animations/knight_run_strip8.png',
    { frameWidth: 32, frameHeight: 32 });
}
create() {
  this.add.image(100, 100, 'props', 'chest_closed');   // a frame of the atlas, by name
  this.anims.create({ key: 'run', frames: this.anims.generateFrameNumbers('knight_run'), frameRate: 12, repeat: -1 });
  this.add.sprite(160, 100, 'knight_run').play('run');
}

HTML5 canvas

const ctx = document.querySelector('canvas').getContext('2d');
const atlas = await (await fetch('LittleKnight/sheets/props.json')).json();
const sheet = new Image();
sheet.onload = () => {
  const f = atlas.frames.chest_closed.frame;          // { x, y, w, h }
  ctx.imageSmoothingEnabled = false;                   // crisp pixel art
  ctx.drawImage(sheet, f.x, f.y, f.w, f.h, 0, 0, f.w * 4, f.h * 4);
};
sheet.src = 'LittleKnight/sheets/props.png';

More free packs

Free on other stores