UniMate Model Loader
What UniMate's Model Loader tells you before you rig anything
- model
- info
Here's the state of 3D generation in ComfyUI as of right now: the models that make meshes are decent, and the moment you need that mesh to move, you're on your own. Hunyuan3D and TRELLIS will hand you a textured shape with impressive silhouette and no rig - the community has been saying "topology is still terrible for any sort of skeletal animation" since early 2025, and nothing has changed that. UniMate attacks the problem from the other end. It doesn't build the mesh. It takes a rigged skeleton you already have and generates motion on it from a text prompt, on quadrupeds, birds, insects, dragons, humanoids. This pack wraps it in five nodes.
The Model Loader is node one, and it's deceptively boring: it picks a checkpoint run and prints a line of text. That line of text is the single most useful piece of output in the whole graph, because it's where you find out - for free, in zero seconds - whether the rig sitting on your disk is even eligible.
What it's actually doing
It doesn't load weights. Nothing goes to VRAM, nothing is torch-loaded, and that's why the node returns instantly even for a checkpoint that isn't there yet. What it does is read a directory and validate it.
The pack registers ComfyUI/models/unimate as a model folder when it imports, so a "run" is just a folder in there that looks like the checkpoint releases ship: config.json, dataset_stats.npy, and a checkpoints/ directory. The dropdown lists runs newest-first by folder mtime; only directories with both marker files count, so half-finished downloads don't clutter it.
Then it opens config.json and reads the dataset and model blocks - max_joints, max_depth, max_motion_length, the sampling cfg_scale, and which attention and text-conditioning modules the run uses - and picks a checkpoint file numerically by step, latest or earliest. All of that lands in the info string:
unimate_uniml3d_f60_v3 | step 150000 | ... | max 71 joints, depth 5 | 60 frames
The inputs and outputs
Three inputs, and you'll touch one.
- run - the dropdown of checkpoint runs. Empty until you put something in
models/unimate. - checkpoint -
latestorearliest. Latest is the right default; earliest is there because more steps is not automatically a better model, and comparing two steps on your own rig is cheap. - run_path - optional. An absolute path to a run directory that overrides the dropdown, for when you keep checkpoints on another drive or a read-only models folder.
Wire model (UNIMATE_MODEL) into both UniMate Mesh Preparation and UniMate Mesh Sampler - they both need it, and it's the same handle. info is a plain string you can read in the node or send to a text display node. That's it.
Install
ComfyUI Manager will find it by searching the pack title, or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/visualbruno/ComfyUI-UniMate
pip install -r ComfyUI-UniMate/requirements.txt # just `tyro`
Then the two things the pack can't ship for you. Clone UniMate itself (it's Friedrich-M/UniMate) and tell the pack where it lives - C:/Git/UniMate, ~/UniMate and /opt/UniMate are found automatically, otherwise set UNIMATE_REPO or write the path into unimate_path.txt beside the pack's README. And download a checkpoint run from Linzhan/UniMate, keeping the release layout:
ComfyUI/models/unimate/unimate_uniml3d_f60_v3/
config.json
dataset_stats.npy
checkpoints/checkpoint_step_150000.pt
Flatten that structure and the loader will tell you exactly which file it wanted - the error names the missing marker rather than failing somewhere deep in the sampler, which is more than most 3D packs manage.
Where people get burned
The joint limit is real and it's 71 on the v3 checkpoints. This is the thing worth knowing before you fall in love with a rig. If your character has fingers, a face skeleton, a tail fan and some prop bones, you'll sail past 71 and there is no pruning pass - rig_preprocess won't quietly drop bones for you. The loader reports the count, and preparation refuses with a number rather than the sampler silently generating nothing, but the honest move is simplifying the rig in Blender first. Deleting the bones the motion doesn't need takes a minute there and saves a confusing half hour here.
"Latest" isn't always best, and the frames number is a fixed window, not a hint. Every checkpoint was trained at a 60-frame window - two seconds at 30 fps. The info line tells you what your run was trained for; if a run ever reports something other than 60, your chained-motion math changes.
Read the licence before you get attached. The code is MIT. The checkpoints are CC BY-NC 4.0, the model card explicitly declines to warrant that the generated motions are free of third-party rights, and the animal (Truebones-trained) portion has disputed provenance - the authors themselves said they wouldn't ship these in a commercial product. Fine for prototyping or a student film. Not fine for a paid asset. No node in this pack changes that.
One last thing: community signal on this pack is close to zero so far. Expect to be the person figuring it out.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| run | COMBO | 1 options: <put a run in models/unimate> | |
| checkpoint | COMBO | latest | 2 options: latest, earliest |
| run_pathopt | STRING | Absolute path to a run directory; overrides the dropdown. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | UNIMATE_MODEL | — |
| info | STRING | — |