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:

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.

All view modes have a comprehensive settings dialog, allowing further fine-tuning per view.

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:

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

Installation

  1. Drop the Mosaic folder into your project’s Plugins/ directory. Fab does this automatically.
  2. 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:

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/.

Building a lighting or performance gymLighting artist · Tech artistTurning a content folder into a permanent Unreal test level for lighting, profiling and scale reference.Clearing dead assets out of a projectTech artist · ProducerAuditing an Unreal project for unused content with Mosaic’s Orphan Zoo, and deleting it without breaking anything.Finding every texture a mesh pulls inTech artist · Environment artistTracing an Unreal asset through its materials to every texture it costs you, without clicking through the properties panel.Judging art cohesion across a packEnvironment artist · Art directorLaying a bought or delivered asset pack out flat in Unreal to see whether it sits alongside the rest of your game.

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

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.