> For the complete documentation index, see [llms.txt](https://studio-docs.sandbox.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://studio-docs.sandbox.game/the-editor/how-to-kitbash-a-level-from-mesh-models.md).

# How to kitbash a level from mesh models

A level is many **Model Mesh Nodes** pointing at a small set of `.glb` files. Dragging one model ten times does not copy the file ten times. You get ten nodes. Each has its own position, rotation, and scale. They share the mesh.

This page is placement at level scale. What a `.glb` is: [How to use mesh models and ModelMesh nodes](/the-editor/how-to-use-mesh-models-and-modelmesh.md). Gizmos: [How to Place Move Rotate and Scale an Asset](/the-editor/how-to-place-move-rotate-and-scale-an-asset.md). Packed look: [How to set up materials](/the-editor/how-to-set-up-materials.md).

## One file, many nodes

| You need                                                         | Use                                                                                                      |
| ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| The same model again                                             | Drag the same `.glb` again, or ask the agent to place another node with that `modelUrl`                  |
| The same **setup** again (mesh plus light, trigger, extra nodes) | [Save as Prefab](/the-editor/how-to-set-up-a-prefab.md) after the first one is right                     |
| Dozens of the same small prop                                    | An instanced mesh. See [How to instance repeated meshes](/the-editor/how-to-instance-repeated-meshes.md) |

A prefab is a reusable node **tree**. A second copy that is only a mesh does not need a prefab. A character that is capsule + model + animation does.

{% hint style="info" %}
*NOTE: Older scenes may show **Model Mesh Actor** (`ENGINE.ModelMeshActor`) as the Outliner row, with a **Model Mesh Node** child that holds `modelUrl`. New drags create a Model Mesh Node. Placement and scale often sit on the parent row. Select the row you actually move.*
{% endhint %}

{% stepper %}
{% step %}

## Import the kit into Assets

Put `.glb` files under `assets/models/` (or a folder the Asset panel can see). Drag from disk into the Asset panel if they are not there yet. See [Assets & asset generation](/the-editor/assets-and-asset-generation.md).
{% endstep %}

{% step %}

## Place the first piece

Drag one `.glb` into the viewport. A node appears, named from the file. Class is `ENGINE.ModelMeshNode` (or a Model Mesh Actor with a mesh child).

Leave **Model Material** empty unless you are replacing the packed look.
{% endstep %}

{% step %}

## Read modelUrl

Select the mesh (the child, if the parent is a Model Mesh Actor). In the Inspector, `modelUrl` is a fully qualified path such as `@project/assets/models/prop.glb`.

Copy that path into an agent prompt when you want more copies of the same piece.
{% endstep %}

{% step %}

## Scale to the world, not the file

Kit pieces are often authored at a different size than your level. Scale lives on the **node**, not inside the `.glb`.

Use the Scale tool (`R`), or type values in the Inspector. Uniform scale (the centre of the scale gizmo) keeps proportions. Non-uniform scale stretches one axis — useful for a long module, wrong for a character.

If the Outliner shows a parent and a mesh child, check both. A parent at scale `(10, 10, 10)` with a child at `(1, 1, 1)` is normal: the file stays untouched; the instance is ten times larger.

Gizmo detail: [How to Place Move Rotate and Scale an Asset](/the-editor/how-to-place-move-rotate-and-scale-an-asset.md).
{% endstep %}

{% step %}

## Snap to the ground and to a grid

With the Move tool (`W`) active, press `End` to snap the selection to the nearest floor geometry.

Open Snap Settings (magnet icon above the viewport) when you want regular spacing — for example 5 m between copies. See [Snap Settings](/the-editor/snap-settings.md).

Press `F` to frame the selection if you lose it in a large level. See [Editor Orientation](/the-editor/editor-orientation.md).
{% endstep %}

{% step %}

## Place more copies of the same file

Drag the same `.glb` from the Asset panel again. Each drop is a new node with the same `modelUrl` and its own transform.

Turn **Cast Shadow** on pieces that should throw a silhouette, and **Receive Shadow** on ground surfaces. Defaults after a drag have both off. See [How to use shadow](/the-editor/how-to-use-shadow.md).
{% endstep %}

{% step %}

## Group the Outliner

A flat list of hundreds of numbered copies is hard to select. Drag nodes under labelled parents (for example `Environment` and `Props`). The Outliner is not sorted alphabetically; order is what you set. See [Project Structure](/best-practices/project-structure.md).
{% endstep %}
{% endstepper %}

## When a prefab is worth it

Save as Prefab when you would rebuild the same **tree** more than twice: a mesh plus a point light, a pickup, extra gameplay nodes.

Copies that are only the same `.glb` in different places can stay as Model Mesh Nodes. If you later add a light or a trigger to every copy of that setup, convert it to a prefab and replace the copies. Full steps: [How to Set Up a Prefab](/the-editor/how-to-set-up-a-prefab.md).

Do not hand-edit `.genesys-scene` files to stamp copies. Place in the editor, or ask the agent through [Sandbox Studio MCP](/working-efficiently-with-ai/set-up-and-use-sandbox-studio-mcp.md).

## Instancing vs more nodes

Hundreds of separate Model Mesh Nodes that share one `.glb` still cost a draw per node. Use [How to instance repeated meshes](/the-editor/how-to-instance-repeated-meshes.md) for dense repeats. Measure FPS first: [Performance & optimization](/the-editor/performance-and-optimization.md).

## Common mistakes

| What went wrong                                               | What to do                                                                                     |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| Scaled the `.glb` in another app for every size you need      | Scale the **node**. One file, many sizes.                                                      |
| Selected the child mesh, wondered why the object did not move | Move the parent that owns world placement.                                                     |
| Filled **Model Material** on every kit piece                  | Leave it empty for kit art. [How to set up materials](/the-editor/how-to-set-up-materials.md). |
| Saved every copy as its own prefab                            | Prefab the **setup**, not every unique transform of the same mesh.                             |
| Asked for a “mesh” and got a blank box                        | That is a Mesh Node. Ask for a Model Mesh Node and the `@project/assets/models/...glb` path.   |

## What You've Done

You can stamp a kit through the scene as many nodes on shared `.glb` files, scale instances without editing the file, and choose prefab or instancing when the setup or the count demands it. Next: [How to set collision and navmesh on mesh models](/the-editor/how-to-set-collision-and-navmesh-on-mesh-models.md), or [How to set up a light](/the-editor/how-to-set-up-a-light.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://studio-docs.sandbox.game/the-editor/how-to-kitbash-a-level-from-mesh-models.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
