Skip to content

Asset tools

The asset database, import and download, materials, textures, prefabs, audio generation and previews.

28 tools in the asset category. Badges: read-only tools never change the project; mutating tools are undoable and attributed; open-world tools reach outside the engine and MCP clients ask before running them.

Tool Summary
asset_import_mesh Import a mesh (.obj, .glb, .gltf — e.g.
asset_request Queue a request for generated content — kind: mesh (3D model), texture, sprite (2D), audio (sfx), music, video — with a prompt.
asset_requests List generated-asset requests and their status.
asset_complete Mark a request done with the generated file (project-relative).
asset_list Search the project's assets (meshes, textures, materials, prefabs, scenes, audio...) by type, tag or text (matches path, description and tags; supports * globs).
asset_info Everything about one asset: GUID, type, tags, description, provenance, import settings, which entities use it, and type-specific data (material fields, prefab contents).
asset_preview Render an isolated preview image of a mesh, material (on a sphere), texture or prefab — look before you place it.
asset_import Register a file placed in the project (e.g.
asset_tag Set an asset's tags and/or description (and provenance).
asset_move Rename or move an asset file (its .meta and GUID move with it) and update every reference in the open scene.
asset_refresh Rescan the project folder for new or changed files (the editor also does this automatically).
material_create Create a reusable material asset (*.mat.json): color, metallic, roughness, emissive (glows with bloom), albedo texture with tiling, unlit.
material_update Change fields of an existing material; every entity using it updates instantly.
texture_generate Procedurally generate a seamless PBR texture set — albedo, normal map and ORM (occlusion/roughness/metallic) — for realistic or stylized surfaces: bricks, planks, cobblestone, rock, rust, marble, fabric, scales, ...
material_assign Use a material asset on one or more entities (sets mesh.material; empty string clears it).
prefab_create Save an entity and all its children (components, behaviors, vars, tags) as a reusable prefab asset.
prefab_instantiate Create a linked instance of a prefab: the scene stores only what you change on it (prefab_overrides), and editing the prefab updates every instance.
sprite_atlas_pack Pack many images (a folder, a list, or globs like "sprites/hero/.png") into one atlas texture plus a .atlas.json describing every frame (trimmed of transparent borders, padded and edge-extruded so nothing bleeds).
sprite_sheet_slice Describe a grid sprite sheet as an atlas (*.atlas.json) so frames get names: give the cell size (or columns/rows), optional margin/spacing, and either names or a prefix.
audio_generate Create a sound effect, ambience loop or piece of music as a WAV file in the project, procedurally and deterministically (the same seed and parameters always give the same audio) - no external generator needed.
audio_info Measure an audio file (wav, mp3, flac): duration, sample rate, channels, peak and RMS in dBFS, integrated loudness (LUFS), clipping, DC offset, silence ratio, whether it starts or ends abruptly (clicks), and for loops how big the jump is at the loop point.
groom_export Write a groom's rest-pose strands to a file for DCC round trips: .hair (Cem Yuksel's format, read by many hair tools), .groom.json (readable) or .skygroom (compact binary).
prefab_overrides How a linked prefab instance differs from its prefab: per-field overrides (with the prefab's value), removed nodes, added entities and its placement (root name/transform, never applied).
prefab_revert Undo overrides so an instance matches its prefab again.
prefab_apply Push an instance's overrides into its prefab file so every instance (in all scenes) gets them.
prefab_unpack Make an instance local: its entities stay exactly as they are but are no longer linked to the prefab (edits to the prefab stop reaching it, and the scene saves it in full); also known as "make local".
prefab_relink Link existing copies of a prefab (made before prefabs were linked, or by copying entities) back to it.
sprite_sheet_import Turn rendered animation frames (a Blender/DCC render: one subfolder of numbered PNGs per clip, e.g.

asset_import_mesh

Import mesh mutating

Import a mesh (.obj, .glb, .gltf — e.g. output of a 3D-generation model) and optionally assign it to an entity (its mesh becomes "asset:"). Meshes are normalized to fit a 1m cube; glTF materials become a material asset. See also asset_import.

Argument Type Required Description Values
path string yes Project-relative .obj/.glb/.gltf path
entity integer | string Entity to assign the mesh to
asset_import_mesh {"path": "models/lantern.obj", "entity": "Lantern"}
skywalker call asset_import_mesh '{"path": "models/lantern.obj", "entity": "Lantern"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_import_mesh",
    "arguments": {
      "path": "models/lantern.obj",
      "entity": "Lantern"
    }
  }
}

asset_request

Request generated asset mutating

Queue a request for generated content — kind: mesh (3D model), texture, sprite (2D), audio (sfx), music, video — with a prompt. A connected generator (image/3D/audio model) or an agent fulfills it with asset_complete; results are applied to target automatically.

Argument Type Required Description Values
kind string yes Asset kind mesh texture sprite audio music video
prompt string yes What to generate, in detail
style string Optional style guide, e.g. "low-poly pastel"
target integer | string Entity that should receive the result
asset_request {"kind": "texture", "prompt": "weathered teak planks, seamless", "style": "photoreal", "target": "Deck"}
skywalker call asset_request '{"kind": "texture", "prompt": "weathered teak planks, seamless", "style": "photoreal", "target": "Deck"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_request",
    "arguments": {
      "kind": "texture",
      "prompt": "weathered teak planks, seamless",
      "style": "photoreal",
      "target": "Deck"
    }
  }
}

asset_requests

List asset requests read-only

List generated-asset requests and their status.

Argument Type Required Description Values
status string Filter by status pending done failed
asset_requests {"status": "pending"}
skywalker call asset_requests '{"status": "pending"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_requests",
    "arguments": {
      "status": "pending"
    }
  }
}

asset_complete

Complete asset request mutating

Mark a request done with the generated file (project-relative). mesh -> imported and assigned to the target; texture -> set as the target's texture; sprite -> target becomes a camera-facing textured quad.

Argument Type Required Description Values
id integer yes Request id
path string Generated file path
failed boolean Mark as failed instead
asset_complete {"id": 3, "path": "textures/deck_planks.png"}
skywalker call asset_complete '{"id": 3, "path": "textures/deck_planks.png"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_complete",
    "arguments": {
      "id": 3,
      "path": "textures/deck_planks.png"
    }
  }
}

asset_list

List assets read-only

Search the project's assets (meshes, textures, materials, prefabs, scenes, audio...) by type, tag or text (matches path, description and tags; supports * globs). Each line shows path, type, tags, description and, for generated assets, the prompt that made them.

Argument Type Required Description Values
type string Filter by asset type mesh texture material prefab scene audio video script agent animation controller sequence
tag string Required tag
query string Text or glob, e.g. "tree" or "props/*.glb"
limit integer Max results (default 60)
asset_list {"query": "tree"}
skywalker call asset_list '{"query": "tree"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_list",
    "arguments": {
      "query": "tree"
    }
  }
}

asset_info

Asset details read-only

Everything about one asset: GUID, type, tags, description, provenance, import settings, which entities use it, and type-specific data (material fields, prefab contents).

Argument Type Required Description Values
asset string yes Path, "asset:path" or "guid:..."
asset_info {"asset": "prefabs/pine.prefab.json"}
skywalker call asset_info '{"asset": "prefabs/pine.prefab.json"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_info",
    "arguments": {
      "asset": "prefabs/pine.prefab.json"
    }
  }
}

asset_preview

Look at an asset read-only

Render an isolated preview image of a mesh, material (on a sphere), texture or prefab — look before you place it.

Argument Type Required Description Values
asset string yes Asset path or guid
size integer Image size in pixels (default 384)
asset_preview {"asset": "materials/gold.mat.json", "size": 256}
skywalker call asset_preview '{"asset": "materials/gold.mat.json", "size": 256}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_preview",
    "arguments": {
      "asset": "materials/gold.mat.json",
      "size": 256
    }
  }
}

asset_import

Import asset mutating

Register a file placed in the project (e.g. by a generator) as an asset. Meshes (.glb/.gltf/.obj/.ply/.stl) are imported — glTF / OBJ+MTL materials become material assets, PLY/OBJ vertex colors are kept — and can be placed as a new entity right away. Rigged / animated glTF characters also get an animation library (.anim: skeleton + clips) and a prefab with an animator, keep their real size (unless normalize is given) and are turned to face -Z; then use animation_list / animator_setup. Animation-only glTF files become clip libraries. To fetch models from the web use asset_download.

Argument Type Required Description Values
path string yes Project-relative file path
create_entity string If set, create an entity with this name using the mesh
position number[3] Position for the created entity
description string What the asset is (helps future searches)
tags string[] Tags
normalize boolean Scale meshes to fit 1 m (default true; rigged characters default to their real size); false keeps real-world units
z_up boolean The mesh is Z-up (CAD, scans, some exporters) — rotate to Y-up
lods boolean Build the automatic level-of-detail chain for meshes of 3,000+ triangles (default true). false for meshes whose edges must stay exact: voxel or terrain chunks, modular pieces that meet seamlessly
asset_import {"path": "characters/knight.glb", "create_entity": "Knight", "position": [0, 0, 0]}
skywalker call asset_import '{"path": "characters/knight.glb", "create_entity": "Knight", "position": [0, 0, 0]}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_import",
    "arguments": {
      "path": "characters/knight.glb",
      "create_entity": "Knight",
      "position": [
        0,
        0,
        0
      ]
    }
  }
}

asset_tag

Describe & tag asset mutating

Set an asset's tags and/or description (and provenance). Good descriptions make assets findable by other agents later.

Argument Type Required Description Values
asset string yes Asset path or guid
tags string[] Replace tags
description string One-line description
source object Provenance fields to merge, e.g.
asset_tag {"asset": "models/statue.glb", "tags": ["statue", "marble", "hero-prop"], "description": "Weathered marble statue for the plaza"}
skywalker call asset_tag '{"asset": "models/statue.glb", "tags": ["statue", "marble", "hero-prop"], "description": "Weathered marble statue for the plaza"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_tag",
    "arguments": {
      "asset": "models/statue.glb",
      "tags": [
        "statue",
        "marble",
        "hero-prop"
      ],
      "description": "Weathered marble statue for the plaza"
    }
  }
}

asset_move

Move / rename asset mutating

Rename or move an asset file (its .meta and GUID move with it) and update every reference in the open scene. The file move itself is not undoable — move it back with another asset_move.

Argument Type Required Description Values
asset string yes Asset path or guid
to string yes New project-relative path (same extension)
asset_move {"asset": "models/statue.glb", "to": "models/plaza/statue.glb"}
skywalker call asset_move '{"asset": "models/statue.glb", "to": "models/plaza/statue.glb"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_move",
    "arguments": {
      "asset": "models/statue.glb",
      "to": "models/plaza/statue.glb"
    }
  }
}

asset_refresh

Rescan assets read-only

Rescan the project folder for new or changed files (the editor also does this automatically).

Takes no arguments.

asset_refresh {}
skywalker call asset_refresh '{}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "asset_refresh",
    "arguments": {}
  }
}

material_create

Create material mutating

Create a reusable material asset (*.mat.json): color, metallic, roughness, emissive (glows with bloom), albedo texture with tiling, unlit. Character models: preset skin (scatterColor, scatterRadius mm, lobeMix, microNormal), eye (irisCenter, irisRadius, irisDepth, corneaRoughness, eyeShadow), cloth (sheenColor, sheenRoughness, fuzz), hair_card (hairShift, hairSpecular, hairDirection, alphaMode dither|coverage). Assign it with material_assign. Example: {"path": "materials/face.mat.json", "preset": "skin", "texture": "textures/face.png"}.

Argument Type Required Description Values
color color Base color (multiplied with the texture) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
metallic number 0 = dielectric, 1 = metal 0 .. 1
roughness number 0 = mirror, 1 = matte 0.02 .. 1
emissive color Emitted light; alpha is strength (glows with bloom) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
texture string Albedo texture path (png/jpg), project-relative
tilingU number Texture repeats along U 0.01 .. 1000
tilingV number Texture repeats along V 0.01 .. 1000
unlit boolean Ignore lighting (flat look for 2D / UI / stylized)
shading string pbr = physically based, toon = cel bands + crisp highlights, unlit = flat, water = animated waves; character models: skin (subsurface scattering, dual-lobe specular, pores, transmission), eye (refracted iris, wet cornea, shadowed corners), cloth (sheen and fuzz), hair_card (anisotropic strand highlights, dithered or coverage alpha) pbr toon unlit water skin eye cloth hair_card
normalMap string Normal map (png), project-relative
ormMap string Occlusion/roughness/metallic map (R/G/B), project-relative
emissiveMap string Emission map, multiplied with emissive
normalStrength number Normal map strength 0 .. 4
triplanar boolean World-space texture projection (tiling = repeats per meter)
clearcoat number Glossy lacquer layer (car paint, varnish) 0 .. 1
subsurface number Light bleeding through (skin, leaves, wax, snow) 0 .. 1
rim number Stylized rim light 0 .. 4
outline number Cartoon outline width in pixels 0 .. 12
outlineColor color Outline color — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
doubleSided boolean Render both faces
occlusionStrength number Ambient occlusion from the ORM map's red channel 0 .. 1
alphaCutoff number Alpha-tested cutout threshold (foliage, sails, fences); 0 = off 0 .. 1
scatterColor color skin: relative distance each color scatters under the surface (red farthest: the warm glow in shadow edges and backlit ears) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
scatterRadius number skin: scattering distance of the reddest light in millimeters (1-4) 0 .. 50
lobeMix number skin: weight of the second, broader specular lobe (0.1-0.2) 0 .. 1
lobeRoughness number[2] skin: roughness multipliers of the two specular lobes [sharp, broad]
microNormal number skin: procedural pore detail strength (fades with distance) 0 .. 2
microNormalTiling number skin: pore detail repeats per UV unit 1 .. 4000
transmission number skin: light through thin parts (ears, nostrils, fingers), from the sun's shadow-map thickness 0 .. 4
irisCenter number[2] eye: UV of the iris center in the eye texture
irisCenter2 number[2] eye: UV of a second iris when both eyes share one texture (each pixel uses the nearer); [-1, -1] = none
irisRadius number eye: UV radius of the iris 0.001 .. 0.5
irisDepth number eye: parallax depth of the iris under the cornea (UV units) 0 .. 0.3
corneaRoughness number eye: roughness of the wet cornea highlight 0.01 .. 0.5
eyeShadow number eye: darkening toward the eye corners (lids and lashes) 0 .. 1
limbusDarkening number eye: dark ring around the iris 0 .. 1
sheenColor color cloth: color of the soft sheen at grazing angles (velvet, wool, cotton) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
sheenRoughness number cloth: 0.3 satin .. 1 felt 0.07 .. 1
fuzz number cloth: extra rim of loose fibers 0 .. 2
hairShift number hair_card: primary highlight shift along the strand -1 .. 1
hairSpecular number hair_card: highlight strength 0 .. 4
hairDirection string hair_card: strand direction in the card's UVs (root to tip); auto = found per pixel from the strand pattern of the texture (atlases whose cards run either way) auto v -v u -u
alphaMode string hair_card: dither = stochastic transparency that resolves to soft strands under TAA and stills; coverage = alpha to coverage (MSAA) dither coverage
clearcoatRoughness number Roughness of the clearcoat layer (0.02 mirror lacquer .. 0.3 satin; default 0.06) 0 .. 1
flakes number Metallic flakes in the base layer (car paint sparkle): share of the base reflection, 0 = none, 0.3-0.6 = metallic paint 0 .. 1
flakeSize number Flake size in meters in the mesh's own space (default 0.0015; real flakes are smaller, a little larger reads better on screen) 5e-05 .. 0.05
scrollU number Texture scroll along U in UV units per second (flowing lava, rivers, conveyor belts); 0 = still -100 .. 100
scrollV number Texture scroll along V in UV units per second; 0 = still -100 .. 100
path string yes Project-relative path ending in .mat.json, e.g. materials/stone.mat.json
preset string Start from a built-in material (other fields override it) gold silver copper chrome brushed_steel iron plastic rubber ceramic car_paint glass water ice skin wax leaves snow velvet neon toon toon_metal clay eye cloth hair_card
material_create {"path": "materials/face.mat.json", "preset": "skin", "texture": "textures/face.png"}
skywalker call material_create '{"path": "materials/face.mat.json", "preset": "skin", "texture": "textures/face.png"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "material_create",
    "arguments": {
      "path": "materials/face.mat.json",
      "preset": "skin",
      "texture": "textures/face.png"
    }
  }
}

material_update

Update material mutating

Change fields of an existing material; every entity using it updates instantly.

Argument Type Required Description Values
color color Base color (multiplied with the texture) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
metallic number 0 = dielectric, 1 = metal 0 .. 1
roughness number 0 = mirror, 1 = matte 0.02 .. 1
emissive color Emitted light; alpha is strength (glows with bloom) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
texture string Albedo texture path (png/jpg), project-relative
tilingU number Texture repeats along U 0.01 .. 1000
tilingV number Texture repeats along V 0.01 .. 1000
unlit boolean Ignore lighting (flat look for 2D / UI / stylized)
shading string pbr = physically based, toon = cel bands + crisp highlights, unlit = flat, water = animated waves; character models: skin (subsurface scattering, dual-lobe specular, pores, transmission), eye (refracted iris, wet cornea, shadowed corners), cloth (sheen and fuzz), hair_card (anisotropic strand highlights, dithered or coverage alpha) pbr toon unlit water skin eye cloth hair_card
normalMap string Normal map (png), project-relative
ormMap string Occlusion/roughness/metallic map (R/G/B), project-relative
emissiveMap string Emission map, multiplied with emissive
normalStrength number Normal map strength 0 .. 4
triplanar boolean World-space texture projection (tiling = repeats per meter)
clearcoat number Glossy lacquer layer (car paint, varnish) 0 .. 1
subsurface number Light bleeding through (skin, leaves, wax, snow) 0 .. 1
rim number Stylized rim light 0 .. 4
outline number Cartoon outline width in pixels 0 .. 12
outlineColor color Outline color — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
doubleSided boolean Render both faces
occlusionStrength number Ambient occlusion from the ORM map's red channel 0 .. 1
alphaCutoff number Alpha-tested cutout threshold (foliage, sails, fences); 0 = off 0 .. 1
scatterColor color skin: relative distance each color scatters under the surface (red farthest: the warm glow in shadow edges and backlit ears) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
scatterRadius number skin: scattering distance of the reddest light in millimeters (1-4) 0 .. 50
lobeMix number skin: weight of the second, broader specular lobe (0.1-0.2) 0 .. 1
lobeRoughness number[2] skin: roughness multipliers of the two specular lobes [sharp, broad]
microNormal number skin: procedural pore detail strength (fades with distance) 0 .. 2
microNormalTiling number skin: pore detail repeats per UV unit 1 .. 4000
transmission number skin: light through thin parts (ears, nostrils, fingers), from the sun's shadow-map thickness 0 .. 4
irisCenter number[2] eye: UV of the iris center in the eye texture
irisCenter2 number[2] eye: UV of a second iris when both eyes share one texture (each pixel uses the nearer); [-1, -1] = none
irisRadius number eye: UV radius of the iris 0.001 .. 0.5
irisDepth number eye: parallax depth of the iris under the cornea (UV units) 0 .. 0.3
corneaRoughness number eye: roughness of the wet cornea highlight 0.01 .. 0.5
eyeShadow number eye: darkening toward the eye corners (lids and lashes) 0 .. 1
limbusDarkening number eye: dark ring around the iris 0 .. 1
sheenColor color cloth: color of the soft sheen at grazing angles (velvet, wool, cotton) — hex string "#rrggbb[aa]" or [r,g,b(,a)] in 0..1
sheenRoughness number cloth: 0.3 satin .. 1 felt 0.07 .. 1
fuzz number cloth: extra rim of loose fibers 0 .. 2
hairShift number hair_card: primary highlight shift along the strand -1 .. 1
hairSpecular number hair_card: highlight strength 0 .. 4
hairDirection string hair_card: strand direction in the card's UVs (root to tip); auto = found per pixel from the strand pattern of the texture (atlases whose cards run either way) auto v -v u -u
alphaMode string hair_card: dither = stochastic transparency that resolves to soft strands under TAA and stills; coverage = alpha to coverage (MSAA) dither coverage
clearcoatRoughness number Roughness of the clearcoat layer (0.02 mirror lacquer .. 0.3 satin; default 0.06) 0 .. 1
flakes number Metallic flakes in the base layer (car paint sparkle): share of the base reflection, 0 = none, 0.3-0.6 = metallic paint 0 .. 1
flakeSize number Flake size in meters in the mesh's own space (default 0.0015; real flakes are smaller, a little larger reads better on screen) 5e-05 .. 0.05
scrollU number Texture scroll along U in UV units per second (flowing lava, rivers, conveyor belts); 0 = still -100 .. 100
scrollV number Texture scroll along V in UV units per second; 0 = still -100 .. 100
path string yes Project-relative path ending in .mat.json, e.g. materials/stone.mat.json
preset string Start from a built-in material (other fields override it) gold silver copper chrome brushed_steel iron plastic rubber ceramic car_paint glass water ice skin wax leaves snow velvet neon toon toon_metal clay eye cloth hair_card
material_update {"path": "materials/brass.mat.json", "roughness": 0.2, "clearcoat": 0.5}
skywalker call material_update '{"path": "materials/brass.mat.json", "roughness": 0.2, "clearcoat": 0.5}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "material_update",
    "arguments": {
      "path": "materials/brass.mat.json",
      "roughness": 0.2,
      "clearcoat": 0.5
    }
  }
}

texture_generate

Generate PBR texture mutating

Procedurally generate a seamless PBR texture set — albedo, normal map and ORM (occlusion/roughness/metallic) — for realistic or stylized surfaces: bricks, planks, cobblestone, rock, rust, marble, fabric, scales, ... With create_material it also writes a ready material (triplanar by default, so it works on scaled primitives without stretching). Colors override the kind's defaults. The soft kinds glow (radial) and curtain (vertical rays fading upward) have transparent edges and make self-lit effect materials: particles, light pools, fake reflections, auroras, light shafts, steam.

Argument Type Required Description Values
kind string yes Pattern noise marble wood planks bricks tiles cobblestone grass dirt sand rock metal_brushed rust fabric checker stripes hexagons scales stylized glow curtain
name string yes Base path without extension, e.g. textures/old_bricks
size integer Pixels, power of two 64..2048 (default 512)
seed integer Variation seed (default 1)
scale number Feature count across the tile (kind default if omitted)
color1 string Primary color #rrggbb
color2 string Secondary color #rrggbb
color3 string Accent color (mortar, grout, veins, rust) #rrggbb
roughness number Base roughness 0..1
metallic number Metallic 0..1
variation number Color / height variation 0..1
bump number Normal strength (default 1)
create_material boolean Also create materials/<name>.mat.json using the maps (default true)
tiling number Material repeats per meter (triplanar) — default 0.5
glow number Emission strength for the soft effect kinds glow / curtain (default 1.5)
texture_generate {"kind": "cobblestone", "name": "street", "create_material": true, "tiling": 2}
skywalker call texture_generate '{"kind": "cobblestone", "name": "street", "create_material": true, "tiling": 2}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "texture_generate",
    "arguments": {
      "kind": "cobblestone",
      "name": "street",
      "create_material": true,
      "tiling": 2
    }
  }
}

material_assign

Assign material mutating

Use a material asset on one or more entities (sets mesh.material; empty string clears it).

Argument Type Required Description Values
entities integer | string[] yes Entities
material string yes Material path (*.mat.json) or ""
material_assign {"entities": ["Bell", "Door Handle"], "material": "materials/brass.mat.json"}
skywalker call material_assign '{"entities": ["Bell", "Door Handle"], "material": "materials/brass.mat.json"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "material_assign",
    "arguments": {
      "entities": [
        "Bell",
        "Door Handle"
      ],
      "material": "materials/brass.mat.json"
    }
  }
}

prefab_create

Save prefab mutating

Save an entity and all its children (components, behaviors, vars, tags) as a reusable prefab asset. Instantiate it with prefab_instantiate, scatter, or Wander spawn("prefab:path"). By default the entity itself becomes a linked instance of the new prefab (link=false leaves it unlinked).

Argument Type Required Description Values
entity integer | string yes Entity id (number) or exact name
path string yes Project-relative path ending in .prefab.json, e.g. prefabs/cottage.prefab.json
description string What it is
tags string[] Tags
link boolean Link the entity to the new prefab (default true)
prefab_create {"entity": "Lantern", "path": "prefabs/lantern.prefab.json", "tags": ["light", "prop"], "description": "Hanging lantern with a warm point light"}
skywalker call prefab_create '{"entity": "Lantern", "path": "prefabs/lantern.prefab.json", "tags": ["light", "prop"], "description": "Hanging lantern with a warm point light"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_create",
    "arguments": {
      "entity": "Lantern",
      "path": "prefabs/lantern.prefab.json",
      "tags": [
        "light",
        "prop"
      ],
      "description": "Hanging lantern with a warm point light"
    }
  }
}

prefab_instantiate

Place prefab mutating

Create a linked instance of a prefab: the scene stores only what you change on it (prefab_overrides), and editing the prefab updates every instance. Optionally drop it onto the surface below its position.

Argument Type Required Description Values
prefab string yes Prefab path
position number[3] World position (default origin)
yaw number Rotation around Y in degrees
rotation number[3] Full rotation in degrees (x, y, z); overrides yaw
scale number Uniform scale multiplier (default 1)
parent integer | string Parent entity
name string Name for the instance root
on_surface boolean Drop onto the geometry below (default false)
prefab_instantiate {"prefab": "prefabs/lantern.prefab.json", "position": [4, 0, -2], "yaw": 30, "on_surface": true}
skywalker call prefab_instantiate '{"prefab": "prefabs/lantern.prefab.json", "position": [4, 0, -2], "yaw": 30, "on_surface": true}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_instantiate",
    "arguments": {
      "prefab": "prefabs/lantern.prefab.json",
      "position": [
        4,
        0,
        -2
      ],
      "yaw": 30,
      "on_surface": true
    }
  }
}

sprite_atlas_pack

Pack sprite atlas mutating

Pack many images (a folder, a list, or globs like "sprites/hero/.png") into one atlas texture plus a .atlas.json describing every frame (trimmed of transparent borders, padded and edge-extruded so nothing bleeds). Frames are named after their files and keep natural order (run_2 before run_10). Sprites then use {"texture": ".atlas.json", "frame": "run_3"}; the result suggests sprite_anim clips from numbered names (run_0..run_7 -> "run"). Example: {"folder": "art/hero", "output": "art/hero.atlas.json"}

Argument Type Required Description Values
folder string Folder of images (non-recursive)
inputs string[] Image paths or globs (project-relative)
output string Atlas JSON path (default: <folder>.atlas.json)
padding integer Pixels between frames (default 2)
trim boolean Trim transparent borders (default true)
extrude integer Edge pixels repeated into the padding (default 1)
max_size integer Maximum atlas size (default 4096)
power_of_two boolean Power-of-two atlas size
fps number Frame rate for suggested clips (default 10)
sprite_atlas_pack {"folder": "art/hero", "output": "art/hero.atlas.json"}
skywalker call sprite_atlas_pack '{"folder": "art/hero", "output": "art/hero.atlas.json"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sprite_atlas_pack",
    "arguments": {
      "folder": "art/hero",
      "output": "art/hero.atlas.json"
    }
  }
}

sprite_sheet_slice

Slice sprite sheet mutating

Describe a grid sprite sheet as an atlas (*.atlas.json) so frames get names: give the cell size (or columns/rows), optional margin/spacing, and either names or a prefix. animations turns rows (or index ranges) into sprite_anim clips, and entity applies the sprite and its animations to an entity in one step. Example: {"image": "art/knight.png", "cell": [32, 32], "animations": {"idle": {"row": 0, "fps": 6}, "run": {"row": 1, "fps": 12}, "attack": {"frames": "16-21", "fps": 14, "loop": false}}, "entity": "Knight"}

Argument Type Required Description Values
image string yes Sheet image (project-relative)
cell integer[] Cell size [w, h] in pixels
columns integer Columns (instead of cell)
rows integer Rows (instead of cell)
margin integer Border around the grid (pixels)
spacing integer Gap between cells (pixels)
prefix string Frame name prefix (default: image name + "_")
names string[] Frame names in order (left->right, top->bottom)
skip_empty boolean Drop fully transparent cells (default true)
output string Atlas path (default: <image>.atlas.json)
animations object clip ->
entity integer | string Apply: sprite (atlas) + sprite_anim (clips) on this entity
pixels_per_unit number With entity: sprite pixelsPerUnit (default: cell height, i.e. 1 cell = 1 unit)
sprite_sheet_slice {"image": "art/knight.png", "cell": [32, 32], "animations": {"idle": {"row": 0, "fps": 6}, "run": {"row": 1, "fps": 12}, "attack": {"frames": "16-21", "fps": 14, "loop": false}}, "entity": "Knight"}
skywalker call sprite_sheet_slice '{"image": "art/knight.png", "cell": [32, 32], "animations": {"idle": {"row": 0, "fps": 6}, "run": {"row": 1, "fps": 12}, "attack": {"frames": "16-21", "fps": 14, "loop": false}}, "entity": "Knight"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sprite_sheet_slice",
    "arguments": {
      "image": "art/knight.png",
      "cell": [
        32,
        32
      ],
      "animations": {
        "idle": {
          "row": 0,
          "fps": 6
        },
        "run": {
          "row": 1,
          "fps": 12
        },
        "attack": {
          "frames": "16-21",
          "fps": 14,
          "loop": false
        }
      },
      "entity": "Knight"
    }
  }
}

audio_generate

Generate sound or music mutating

Create a sound effect, ambience loop or piece of music as a WAV file in the project, procedurally and deterministically (the same seed and parameters always give the same audio) - no external generator needed. Presets: jump, coin, pickup, hit, explosion, laser, powerup, footstep_grass, footstep_stone, footstep_wood, door, ui_click, ui_hover, error, swoosh, shoot, wind_loop, engine_loop, rain_loop, fire_crackle_loop, ocean_waves_loop, ambient_drone, heartbeat. Names ending in _loop loop seamlessly (use them for ambience; set loop on the audio component). Use seed and variations for natural variety (footsteps!). Customize a preset with pitch (multiplier) and volume, or fully with params: layers of oscillators/noise with pitch slides, arpeggios, envelopes, filters and echo/reverb (call with list=true for the parameter reference). Music: pass music {mood: calm, happy, sad, tense, epic, mysterious, eerie, adventure, battle; tempo, key like "A minor", progression like "i VI III VII", bars, energy 0..1, reverb, and pad/bass/arp/melody/drums on/off}; it loops seamlessly. Pass entity to create or update that entity's audio component with the clip (loops, bus and spatial settings are chosen from the kind). The result includes loudness stats; check them with audio_info and audition with audio_play. Examples: {"preset":"jump","path":"audio/jump.wav"}; {"preset":"footstep_stone","variations":4}; {"music":{"mood":"epic","tempo":110,"bars":16},"path":"audio/theme.wav"}.

Argument Type Required Description Values
preset string Sound effect preset jump coin pickup hit explosion laser powerup footstep_grass footstep_stone footstep_wood door ui_click ui_hover error swoosh shoot wind_loop engine_loop rain_loop fire_crackle_loop ocean_waves_loop ambient_drone heartbeat
params object Custom sound parameters (see list=true): {layers:[{wave, freq, slide, attack, decay, lowpass, ...}], echo, reverb, volume, loopSeconds}. With a preset, these replace the preset's matching fields.
music object Generate music instead:
path string Output path, e.g. audio/jump.wav (default audio/<name>_<seed>.wav)
seed integer Variation seed (default 1)
variations integer Generate N variants with seeds seed..seed+N-1 (sfx only, 1..16, default 1); files get _1, _2 ... suffixes
pitch number Multiplier on the pitch of the preset's tonal layers (e.g. 0.5 = an octave lower)
volume number Output gain 0..4 (default 1; the sound is normalized to 0.9 peak first)
entity integer | string Create/update this entity's audio component with the clip
description string What the sound is (stored with the asset)
tags string[] Asset tags
list boolean Only list presets, moods and the parameter reference; generate nothing
audio_generate {"preset": "jump", "path": "audio/jump.wav"}
skywalker call audio_generate '{"preset": "jump", "path": "audio/jump.wav"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audio_generate",
    "arguments": {
      "preset": "jump",
      "path": "audio/jump.wav"
    }
  }
}

audio_info

Analyze audio read-only

Measure an audio file (wav, mp3, flac): duration, sample rate, channels, peak and RMS in dBFS, integrated loudness (LUFS), clipping, DC offset, silence ratio, whether it starts or ends abruptly (clicks), and for loops how big the jump is at the loop point. Returns warnings (clipping, too quiet/loud, click risks, loop seam) and the asset's provenance. Use it to verify generated audio since you cannot listen: sound effects around -23 to -14 LUFS, music around -20 to -16, ambience quieter. Example: {"path":"audio/jump.wav"}.

Argument Type Required Description Values
path string yes Project-relative audio file
audio_info {"path": "audio/jump.wav"}
skywalker call audio_info '{"path": "audio/jump.wav"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audio_info",
    "arguments": {
      "path": "audio/jump.wav"
    }
  }
}

groom_export

Export groom strands read-only

Write a groom's rest-pose strands to a file for DCC round trips: .hair (Cem Yuksel's format, read by many hair tools), .groom.json (readable) or .skygroom (compact binary). Paths are project-relative.

Argument Type Required Description Values
entity integer | string yes Entity with a groom
path string yes Output file (.hair, .groom.json, .skygroom)
groom_export {"entity": "Head", "path": "grooms/head.hair"}
skywalker call groom_export '{"entity": "Head", "path": "grooms/head.hair"}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "groom_export",
    "arguments": {
      "entity": "Head",
      "path": "grooms/head.hair"
    }
  }
}

prefab_overrides

Prefab overrides read-only

How a linked prefab instance differs from its prefab: per-field overrides (with the prefab's value), removed nodes, added entities and its placement (root name/transform, never applied). entity may be the instance root or any entity inside it. Without entity: every instance in the scene with its override count. Then use prefab_revert to undo overrides or prefab_apply to push them into the prefab file.

Argument Type Required Description Values
entity integer | string An instance root or member; omit to list all instances
prefab string Only instances of this prefab (path) when listing
prefab_overrides {}
skywalker call prefab_overrides '{}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_overrides",
    "arguments": {}
  }
}

prefab_revert

Revert prefab overrides mutating

Undo overrides so an instance matches its prefab again. property reverts one override of entity ("light.intensity", "name", "vars.hp", "collider" for an added/removed component); without it, all of that entity's overrides (placement kept). all: true reverts the whole instance and restores removed nodes (added entities stay). Undoable.

Argument Type Required Description Values
entity integer | string yes Instance root or member
property string One override to revert, as listed by prefab_overrides
all boolean Revert the whole instance (default false)
prefab_revert {"entity": 1}
skywalker call prefab_revert '{"entity": 1}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_revert",
    "arguments": {
      "entity": 1
    }
  }
}

Minimal call with the required arguments; see the table for everything else.

prefab_apply

Apply overrides to prefab mutating

Push an instance's overrides into its prefab file so every instance (in all scenes) gets them. Without property: everything — overrides, removed nodes and added entities (they become prefab nodes and stay linked). With property: only that override of entity. Placement (root name/transform) is never applied. Other instances in this scene update immediately and keep their own overrides. Undo restores the scene; the file keeps the new version (re-apply or edit to change it back).

Argument Type Required Description Values
entity integer | string yes Instance root or member
property string Apply only this override of entity (e.g. "mesh.color")
prefab_apply {"entity": 1}
skywalker call prefab_apply '{"entity": 1}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_apply",
    "arguments": {
      "entity": 1
    }
  }
}

Minimal call with the required arguments; see the table for everything else.

prefab_unpack

Unpack prefab instance mutating

Make an instance local: its entities stay exactly as they are but are no longer linked to the prefab (edits to the prefab stop reaching it, and the scene saves it in full); also known as "make local". Undoable.

Argument Type Required Description Values
entity integer | string yes Instance root or member
prefab_unpack {"entity": 1}
skywalker call prefab_unpack '{"entity": 1}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_unpack",
    "arguments": {
      "entity": 1
    }
  }
}

Minimal call with the required arguments; see the table for everything else.

Relink prefab copies mutating

Link existing copies of a prefab (made before prefabs were linked, or by copying entities) back to it. A candidate links when its hierarchy matches the prefab node for node (same child names in order) and it has at most max_overrides differences besides placement; values are never changed (differences become overrides). Without entities the whole scene is searched. dry_run reports without linking.

Argument Type Required Description Values
prefab string yes Prefab path, e.g. prefabs/tree.prefab.json
entities integer | string[] Candidates (default: every unlinked entity)
max_overrides integer Most differences allowed (default 0: exact copies only)
dry_run boolean Only report what would be linked
prefab_relink {"prefab": "prefabs/tree.prefab.json", "dry_run": true}
skywalker call prefab_relink '{"prefab": "prefabs/tree.prefab.json", "dry_run": true}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prefab_relink",
    "arguments": {
      "prefab": "prefabs/tree.prefab.json",
      "dry_run": true
    }
  }
}

sprite_sheet_import

Import rendered sprite animations mutating

Turn rendered animation frames (a Blender/DCC render: one subfolder of numbered PNGs per clip, e.g. renders/heroine/run/0001.png; folders starting with _ or . are skipped) into packed sprite atlases with sprite_anim clips, plus a matching normal-map atlas (from a parallel folder of normal-pass frames) so 2D lights shade the animation. Frames are trimmed and packed; clips that do not fit one atlas spill into more (each clip then names its texture). downsample averages supersampled renders (2 = render at 2x for smooth edges). entity applies sprite (pivot, size), sprite_anim (clips) and lighting in one undoable step. Example: {"folder": "renders/heroine", "normals": "renders/heroine_normals", "output": "art/heroine/heroine", "downsample": 2, "fps": 30, "clips": {"attack1": {"loop": false, "events": {"4": "hit"}}}, "entity": "Heroine", "pivot": [0.5, 0.08], "pixels_per_unit": 150}

Argument Type Required Description Values
folder string yes Folder with one subfolder of numbered PNG frames per clip (project-relative)
normals string Folder with the same clip subfolders holding normal-pass frames (optional)
output string yes Output path without extension: writes <output>.png, <output>_n.png, <output>.atlas.json (and _2, _3 ... when clips spill over)
clips object Per clip: {fps, loop, events: {"frame": "name"}, name (rename)}; clips not listed use fps and loop true
only string[] Import only these clip folders
fps number Default frames per second (default 24)
downsample integer Average NxN source pixels into one (1-4, default 1)
max_size integer Maximum atlas size in pixels (default 4096)
padding integer Pixels between frames (default 2)
entity integer | string Apply the sprite, animations and normal map to this entity
pivot number[] With entity: pivot in the untrimmed frame (0..1, [0.5, 0] = feet)
pixels_per_unit number With entity: sprite pixelsPerUnit (after downsampling)
clip string With entity: clip to start (default: the first)
sprite_sheet_import {"folder": "renders/heroine", "normals": "renders/heroine_normals", "output": "art/heroine/heroine", "downsample": 2, "fps": 30, "clips": {"attack1": {"loop": false, "events": {"4": "hit"}}}, "entity": "Heroine", "pivot": [0.5, 0.08], "pixels_per_unit": 150}
skywalker call sprite_sheet_import '{"folder": "renders/heroine", "normals": "renders/heroine_normals", "output": "art/heroine/heroine", "downsample": 2, "fps": 30, "clips": {"attack1": {"loop": false, "events": {"4": "hit"}}}, "entity": "Heroine", "pivot": [0.5, 0.08], "pixels_per_unit": 150}' --project my_game
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sprite_sheet_import",
    "arguments": {
      "folder": "renders/heroine",
      "normals": "renders/heroine_normals",
      "output": "art/heroine/heroine",
      "downsample": 2,
      "fps": 30,
      "clips": {
        "attack1": {
          "loop": false,
          "events": {
            "4": "hit"
          }
        }
      },
      "entity": "Heroine",
      "pivot": [
        0.5,
        0.08
      ],
      "pixels_per_unit": 150
    }
  }
}