Mosaic - Asset Audit
Visualise an Unreal content library as a spatial treemap in-level with accompanying stats. Each asset folder (nested or otherwise) is packed roughly into a coloured square for visibility, and once built, moves the camera to show you the space.
This tool is great for visually and spatially analysing assets (including static meshes, materials, textures and blueprints), and is useful across various disciplines. Usecases include:
- Creating actor palates, zoos or gyms,
- Assisting in automated or manual in scene performance or lighting tests,
- Assessing art cohesion for assets in scene,
- Locating orphaned assets for removal, consolidation or future use,
For more detailed workflows or use cases, see Examples.
Features
View-modes:
All view-modes visualise a given content folder/s as an in-level treemap: static meshes as themselves, materials on spheres, and textures on planes scaled to their pixel size.
Blueprints are supported, but will likely lead to visual problems in the layout process in most cases. This is due to bounding volumes on blueprints being un-knowable until spawned in.
- Asset Zoo — Blindly lays out every given asset in a folder tree.
- Orphan Zoo — Filters for assets that have no strong dependencies and are “safe” to delete.
- Spawn all zoos — Provides you with all views in the tool. Will later be expanded upon.
All view modes have a comprehensive settings dialog, allowing further fine-tuning per view.
- Clear zoos — Cleans up zoos spawned in the scene. Regenerating a zoo does this automatically.
Browse to asset tools:
Unreal has a single “Browse to asset” feature when selecting and right clicking on an asset in a scene. What this doesn’t do is allow browsing to a meshes’ assigned materials or textures. Traditionally this is done through the properties pane, but it’s a slow process, and doesn’t allow for browsing to multiple materials and textures in one go.
Several tools to allow you to select any number of scene assets and to browse to their used materials and textures:
- Materials — Browses to all materials used by the selected Static Mesh(es)
- Textures — Browses to all textures (used by the materials) used by the selected Static Mesh(es)
- Referencers — Browses to all things that use the static mesh such as Levels or Blueprints.
- Everything — A more comprehensive Browse to, that locates every material and texture used by the selected Static Mesh(es), including the mesh itself.
Project only modes restrict the search scope to
/Game, preventing engine primitives or plugin content from
also being searched for. Useful for project clean-up, and not selecting
the engine primitives when selecting a zoo’s material or texture
previews.
Requirements
- Unreal Engine 5.7 (developed and tested there; the code carries shims for earlier 5.x but they are unverified)
- The Python Editor Script Plugin (automatically available in most UE5 versions)
Installation
- Drop the
Mosaicfolder into your project’sPlugins/directory. Fab does this automatically. - Restart the editor if already open.
That’s it — the plugin is content-only Python, nothing compiles.
Examples
Everything lives on a right-click. With nothing selected, right-click in the viewport for the view-modes; with something selected, the same menu carries the browse-to tools.
Right-click in scene ▸ Mosaic - Asset Audit ▸ Asset Zoo
For best results, spawn view-modes in empty or near empty levels. This eliminates the risk of polluting active levels with zoos, and performance penalties from spawning in additional actors in a scene. Nothing a view-mode spawns is ever saved into your map, so closing the level throws the picture away.
A few things worth knowing before you start:
- point it at a folder, not the whole project, unless you mean it — you will be asked to confirm anything over 4,096 assets
- the editor stops responding while a big picture builds, because Unreal runs Python on the game thread. The progress bar can cancel it
- re-running a view-mode replaces its own picture and leaves other pictures alone, so two views can sit side by side and be compared
Walkthroughs
Short step-by-step workflows, written from the point of view of the
person doing the job. They also ship in the plugin, in
Examples/.
Settings
Launching a view-mode opens the settings dialog first. Generate (bottom right) saves your choices and runs; Cancel (bottom left) runs nothing. The top section is shared by every view-mode, and the section under it belongs to whichever one you launched.
Settings are saved in Config/MosaicSettings.json inside
the plugin, and the dialog is the only thing that writes to it. If the
plugin folder is read-only, settings fall back to
<project>/Saved/Mosaic/.
Core
| Setting | Does |
|---|---|
| Packing algorithm | How tiles are fitted together. One option today — MaxRects, the tightest of the ones tested |
| Transient actors | On by default, meaning the picture is never saved into your map. Turn it off to deliberately build a permanent gallery level |
| Warn above | Asks before drawing more than this many assets, since a big picture
locks the editor while it builds. 0 never asks |
| Colour swatch | Classic, muted, or greyscale. Greyscale is the one to use when judging materials, as nothing competes with the assets |
| Text scale and padding | Size and spacing of the labels on each tile |
| Excluded folders / keywords | Folders and name fragments to leave out of every view-mode |
View-modes
| Setting | View-mode | Does |
|---|---|---|
| Root folders | both | Which folders to draw. Several at once, each becoming its own tile |
| Asset types | both | Which types to show — meshes, materials, textures, blueprints |
| Unused means | Orphan Zoo | Whether “unused” means nothing points at it, or nothing reaches it from a level. See below |
| Follow soft references | Orphan Zoo | Counts soft references as use. On by default, and safer left on |
Orphan Zoo’s “unused means” is the setting that changes the answer. Use flows up one chain, and each link is only reachable through the one below it:
texture -> material -> static mesh -> blueprint -> level
| Mode | Shows | Use it when |
|---|---|---|
| Unreferenced (default) | assets nothing points at | you want the obvious dead weight, with no reasoning to follow |
| Unreachable | assets whose chain never gets to a level | you want the whole dead cluster at once — the mesh nobody placed, and the materials and textures hanging off it |
Both are safe to delete as a batch. Unreferenced peels one layer per pass, so re-run after each round of deleting; unreachable gets there in one. In unreachable mode the asset types you tick also decide how far the chain is followed — an unticked type is treated as a user and protects what it points at.
Scripting
Every view-mode can be run directly, taking the same values as the dialog and skipping it:
from mosaic import asset_zoo
asset_zoo.run(roots=["/Game/MyPack", "/Game/Props"], exclude_keywords=["_old"])from mosaic import orphan_zoo
orphan_zoo.run(roots=["/Game/MyPack"], mode="unreachable")Run from a commandlet or with -unattended, the size
warning becomes a log line instead of a dialog and the run continues, so
a build machine is never left waiting on a popup.
Modifications
To allow extensibility I’ve deliberately provided this tooling as a python script plugin. I’m more than happy for modifications to be made, but please check the project’s licence.
| File | Holds |
|---|---|
mosaic/renderer.py |
All the drawing: measuring assets, packing them into squares, spawning them, and every default colour and size |
mosaic/common.py |
Shared lookups — asset registry queries, dependency walks, file sizes, folder trees. Never loads an asset |
mosaic/asset_zoo.py,
mosaic/orphan_zoo.py |
The view-modes. Each one decides what to show and works out its own numbers, then hands a plain dictionary to the renderer |
mosaic/navigator.py |
The browse-to tools |
mosaic/settings.py,
settings_dialog.py |
The settings file and the dialog built from it |
A new view-mode is a new file: build the dictionary of folders and
assets, then call renderer.render(). The renderer never
decides what to show, and a view-mode never touches the level. The
dictionary format is written up in the module comments.
Known limits
- Python scripts can be slow with extremely large asset counts. Warnings and loading bars are included to monitor progress. Size your root sensibly to the scope of your assessment.
- Anything referenced only from C++, or from a path built while the game runs, leaves no trace for Orphan Zoo to find. This matters most for blueprints, which are often spawned that way. Always let the editor’s own Delete dialog have the final word.
- Levels that have never been saved hold no references yet, so save your maps before trusting an audit.
- Some materials cannot be shown honestly on a preview sphere — decals, post-process, anything that moves its own vertices, foliage and water. Those are drawn with a “no preview” material instead of something misleading. The check reads the material graph and never the asset’s name.
- Mosaic builds its own three materials the first time you run it,
into
/Game/Mosaicif its own folder is read-only. Nothing is pre-cooked, so there is no asset to break when you change engine version.
Support and refunds
Something broken, or not behaving like this page says? Please raise it with me first. Most problems are quick to fix, and a bug report is the only way a one-person tool gets better.
Include your Unreal version, which tool you ran, what you expected,
and anything the Output Log said — Window ▸ Output Log, filter for
Mosaic.
support@arkodegames.com
I build this around a full-time job, so expect a reply in a few days rather than a few hours.
Refunds go through Fab under Epic’s own policy and I won’t argue one. But if the tool isn’t doing what you bought it for, a message usually ends in a fix, and costs you less than starting again with something else.

