Asset Recast Customizer
Falcon Glove
OVERVIEW
Recast Customizer turns one modular asset into a content library: an artist supplies a batch of designs, every part can wear any of them, and a team builds pieces the artist never made with every combination guaranteed to work. Five material values refine a chosen combination, and a design worth keeping exports as a single file. In Unity that file becomes the materials, maps and prefab the design needs, so the library grows without an engine licence and without an artist rebuilding anything.
I designed the architecture, the functionality and the interface, built the model and textures in Maya and Substance Painter, and vibe coded the tool with Claude, directing and debugging it through.
Key contributions
Tool design: Framed the piece as a content system for a studio rather than a player-facing picker, and built the interface around that decision.
Shader authoring: Two hand-written shaders: a hue and saturation pass that moves a look without disturbing the calibrated lighting, and a channel isolation pass for inspection.
Pipeline: A round trip from browser to file to engine that ends in generated assets, plus sixteen editor menu tools covering thumbnail baking, one-click web builds, importing a design and taking one back out again.
The round trip: The feature the tool exists for. A web build cannot touch the filesystem, so exports are handed to the browser as a download. The file travels by ticket, chat or mail. In Unity, an importer lists every material it wants to change and waits for a yes before writing a single value.
Browser → JSON / TXT → Unity importer → Real materials
The four panels: asset data, modular parts, look dev, and design presets.
Features
Swap: Four parts, three designs each, every combination guaranteed valid.
Tune: Hue, saturation, brightness, smoothness and normal strength, per part.
Save: Name a design and keep it. It survives a reload and sits under the authored three, which stay untouched.
Judge: Lighting matched to a production reference, so decisions hold in engine.
Cost: The panel shows how many new textures a design will need before anyone commits to it. Two of the five controls are free; three are not.
Export: One file describing the whole design, and a text version for a person.
Generate: Unity turns that file into materials, maps, a prefab, and a new entry in the design list.
THE HANDOFF
Two people, one file, no retyped numbers.
Build: Swap parts and tune five values per part. The panel shows what the colour choices will cost before anyone commits to them.
Save: Name the design. It sits under the artist's three, which stay untouched.
Export: One file describes the whole design and downloads like any other.
Import: A Unity menu item reads it, lists what it will create, and waits.
Generate: Unity writes the materials and maps, saves a prefab, and adds the design to the list.
Save → Export JSON → Import in Unity → Materials + Maps + Prefab → New design
The importer applying an exported look file (.json), listing every material it will change before writing anything.
Process
1. Get the lighting honest
Before any interface existed, the glove was set up in URP in linear colour space and matched against a separate lighting reference. A review tool is worthless if the render lies.
Before any interface existed, the glove was set up in URP in linear colour space and matched against a separate lighting reference. A review tool is worthless if the render lies.
2. Prototype the swapping
Runtime material swapping driven from a single variant data file, an orbit camera with limited yaw so the open cuff never faces the viewer, and thumbnails baked in the editor so a design is chosen by image rather than by filename.
Runtime material swapping driven from a single variant data file, an orbit camera with limited yaw so the open cuff never faces the viewer, and thumbnails baked in the editor so a design is chosen by image rather than by filename.
3. Answer the real question
A studio tool and a player avatar screen look identical from outside and are judged by completely different standards. Choosing the first drove everything after it: real material parameters, the export and importer pair, and a live texture memory readout so the cost of a decision stays visible.
A studio tool and a player avatar screen look identical from outside and are judged by completely different standards. Choosing the first drove everything after it: real material parameters, the export and importer pair, and a live texture memory readout so the cost of a decision stays visible.
4. Make it survive a stranger
First-run guide, panel names rewritten from engine words into plain ones, thumbnail memory cut from 16.55 MB to 3.65 MB with no visible loss, and tagged restore points across the whole build.
First-run guide, panel names rewritten from engine words into plain ones, thumbnail memory cut from 16.55 MB to 3.65 MB with no visible loss, and tagged restore points across the whole build.
Making The Asset
The glove was modelled in Maya and textured in Substance before any of the tooling existed. It was built modular from the start: four parts that each carry their own material, with the UV space and the naming laid out so a part can be swapped without the rest of the glove knowing.
That decision is what the whole tool rests on. A glove modelled as one mesh would have needed rebuilding before a single part could be swapped.
Technical notes
Hue without touching Lit: A stock URP material can only multiply its base colour, which tints but never rotates a hue. The base map is blitted through an HSV pass into a render texture instead, so the calibrated lighting is never at risk.
Colourize the neutrals: A grey pixel has no position on the colour wheel, so the black variant ignored the hue slider. A second path, chosen per pixel by how neutral it already is, gives grey pixels a hue while keeping their own luminance and grain.
Non-destructive by construction: The lookup that resolves a live material returns nothing outside play mode, so no slider can reach a saved asset. The importer confirms before writing.
Shipped-in-Unity problems: Serialized scene values silently beating code defaults. Normal maps reading pink until decoded. Thumbnails stretched by power-of-two rounding at import. A wireframe hook that crashed the editor by firing on every hidden preview camera.
Three decisions in code
One shader, one engine script, one browser plugin. The comment in each is the reason it is written that way.
HLSL · Recast_HSVAdjust.shader
C# · ViewModeController.cs
JavaScript · RecastDownload.jslib
Repository
Source only: 19 scripts, 3 shaders, and the browser plugin that carries a file out of the sandbox. Thirteen editor menu items do the repeatable work, from baking the variant thumbnails to a one-click web build.