Sprite Gen
aldegad/sprite-gen
Generates images and game sprites through GPT or Grok with guided provider choices, separate saved defaults, automatic cleanup and optional curation.
Set up and tweak Meta Movement SDK (MSDK) retargeting for a character model.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-meta-movement-sdk-retargeting --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/hz-unity-meta-movement-sdk-retargeting .claude/skills/hz-unity-meta-movement-sdk-retargeting && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hz-unity-meta-movement-sdk-retargeting" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargeting into .claude/skills/hz-unity-meta-movement-sdk-retargeting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-meta-movement-sdk-retargeting", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargetingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-meta-movement-sdk-retargeting --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/hz-unity-meta-movement-sdk-retargeting .agents/skills/hz-unity-meta-movement-sdk-retargeting && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hz-unity-meta-movement-sdk-retargeting" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargeting into .agents/skills/hz-unity-meta-movement-sdk-retargeting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-meta-movement-sdk-retargeting", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-meta-movement-sdk-retargeting --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/hz-unity-meta-movement-sdk-retargeting .cursor/skills/hz-unity-meta-movement-sdk-retargeting && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hz-unity-meta-movement-sdk-retargeting" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargeting into .cursor/skills/hz-unity-meta-movement-sdk-retargeting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-meta-movement-sdk-retargeting", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/meta-quest/agentic-tools.git --path skills/hz-unity-meta-movement-sdk-retargeting--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-meta-movement-sdk-retargeting --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/hz-unity-meta-movement-sdk-retargeting .gemini/skills/hz-unity-meta-movement-sdk-retargeting && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hz-unity-meta-movement-sdk-retargeting" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargeting into .gemini/skills/hz-unity-meta-movement-sdk-retargeting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-meta-movement-sdk-retargeting", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install meta-quest/agentic-tools hz-unity-meta-movement-sdk-retargetingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/hz-unity-meta-movement-sdk-retargeting .github/skills/hz-unity-meta-movement-sdk-retargeting && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hz-unity-meta-movement-sdk-retargeting" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargeting into .github/skills/hz-unity-meta-movement-sdk-retargeting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-meta-movement-sdk-retargeting", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-meta-movement-sdk-retargeting --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/hz-unity-meta-movement-sdk-retargeting .opencode/skills/hz-unity-meta-movement-sdk-retargeting && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hz-unity-meta-movement-sdk-retargeting" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-meta-movement-sdk-retargeting into .opencode/skills/hz-unity-meta-movement-sdk-retargeting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-meta-movement-sdk-retargeting", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
hz-unity-meta-movement-sdk-retargetingSet up and tweak Meta Movement SDK (MSDK) retargeting for a character model.
Hz Unity Meta Movement SDK Retargeting is an agent skill from meta-quest/agentic-tools. Set up and tweak Meta Movement SDK (MSDK) retargeting for a character model. Use this whenever the user wants to retarget a humanoid FBX/prefab for Meta VR body tracking, generate a retargeting config, or hand-edit the resulting <asset.json (fix known-joint mappings, exclude joints from auto-mapping, rename target joints, adjust per-joint mapping weights, change a mapping behavior to twist/childAlignedTwist, edit T-pose values). The headless entry point is…
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/unity-mcp-fallback.md`).
It sits in Game Development. It works with Model Context Protocol. The repository describes itself as: Agent Skills for Meta Quest/Horizon OS VR Development. The licence is Apache-2.0.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3a8553d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json, csharp and bash).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Hz Unity Meta Movement SDK Retargeting loads about 5.4k tokens when it runs, and up to ~6.3k if it reads all its reference files. Until then it costs about 196 tokens; SKILL.md has 2,159 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from meta-quest/agentic-tools at commit 3a8553d, republished under its Apache-2.0 licence (© meta-quest). 2,159 words, ~5,398 tokens.
.claude/skills/hz-unity-meta-movement-sdk-retargeting/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Don't hand-craft the JSON from scratch — the native side computes initial alignment, mappings, and T-pose data that would be tedious to write by hand. The right flow is:
Meta.XR.Movement.Editor.MSDKUtilityEditor.RunDefaultRetargetingSetup(GameObject asset, string customDataSourcePath = null) against a live Editor with unity-cli. This is the headless equivalent of clicking through the Retargeting Configuration Editor UI with all defaults (Next×3 → Validate → Done) and produces both artifacts:<asset>.json — the retargeting config (this skill targets this file)<asset>-metadata.asset — a small ScriptableObject linking the model to the JSON (rarely needs editing)The same RunDefaultRetargetingSetup API also backs the Assets/Movement SDK/Body Tracking/Run Default Retargeting Setup editor menu item, so a user who sees a project asset selected can trigger it from the menu too.
unity-clirun_script compiles against every loaded assembly, so the Meta.* Editor namespace is directly
referenceable — call the method normally, no reflection:
// AgentScripts/RunRetargetingSetup.cs
using Meta.XR.Movement.Editor;
using UnityEditor;
using UnityEngine;
public static class RunRetargetingSetup
{
public static string Run(string assetPath)
{
var asset = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
if (asset == null) return $"ERROR: asset not found at {assetPath}";
MSDKUtilityEditor.RunDefaultRetargetingSetup(asset, null);
var jsonPath = System.IO.Path.ChangeExtension(assetPath, ".json");
return $"done; config at {jsonPath} (exists: {System.IO.File.Exists(jsonPath)})";
}
}unity status --format json # look for state "ready"
unity command run_script --file AgentScripts/RunRetargetingSetup.cs \
--entry RunRetargetingSetup.Run --args '["Assets/MyChar/MyChar.fbx"]' --format jsonKeep the .cs outside Assets/ (the path is relative to the project root) so writing it triggers no
import or domain reload. See the unity-cli skill for connecting and --project-path; the
reflection-based MCP version is in
references/unity-mcp-fallback.md.
Notes:
RunDefaultRetargetingSetup is non-destructive - if a JSON already exists, it loads and re-runs the per-step replay; user-made target.knownJoints and source.autoMappingJointData edits survive (see the "Re-running setup" table at the bottom).Assets/ or in an embedded package. Calling it on an immutable package asset can trigger Unity's "save changes to immutable package?" modal dialog, which blocks the request — copy the asset into Assets/ first.The defaults are usually 80–95% right. Common reasons to hand-edit afterwards:
chest mapped to a spine bone, or wrist mapped to a wrist-twist bone).LeftHandPalm or *WristTwist are bleeding into target hand mappings and causing jitter.mixamorig:Hips, bn_pelvis_C_001) and you want to clean up the joint names.weightPosition / weightRotation for a specific joint, or change a mapping behavior to twist / childAlignedTwist.The JSON drives runtime retargeting. The same skeleton-name strings appear across many sections — edit them all consistently or the native loader will silently produce broken mappings.
{
"name": "<character name>",
"config": { version, coordinateSpace }
"source": { format, joints, manifestations, autoMappingJointData, knownJoints, hierarchy, tposeMin, tposeMax, tpose }
"target": { format, joints, knownJoints, hierarchy, tposeMin, tposeMax, tpose }
"mapping": { min: { <targetJoint>: <mappingEntry> }, max: { ... } }
}source — the Meta VR body tracking skeleton (typically OVR FullBody, ~84 joints). Joint names are fixed (e.g. LeftHandWrist, Hips); usually leave alone.target — the user's character rig. Joint names come from the model's bone hierarchy (e.g. Left_Hand, Hips, Skeleton).mapping — for each target joint, a weighted list of source joints that drive it. min is for the smallest body scale, max for the largest. The retargeter blends between them at runtime based on the user's height.A joint name (e.g. "Right_UpperArm") referenced inconsistently across sections will break the rig. When renaming/removing a target joint, update all of these:
| Section | What it contains |
|---|---|
target.joints[] | The flat list of all joint names |
target.knownJoints | Maps semantic role → joint name (e.g. "hips": "Hips") |
target.hierarchy | Maps "<child>": "<parent>" |
target.tpose, target.tposeMin, target.tposeMax | Per-joint position+rotation, keyed by joint name |
mapping.min, mapping.max | Top-level keys ARE target joint names; nested target.mappings keys also reference target joint names |
The auto-detection sometimes picks the wrong bone (e.g. Right_HandTwist instead of Right_Hand, or attaches chest to a spine joint instead of the chest). Fix by editing target.knownJoints:
"target": {
"knownJoints": {
"root": "Skeleton",
"hips": "Hips",
"rightUpperArm": "Right_UpperArm",
"leftUpperArm": "Left_UpperArm",
"rightWrist": "Right_Hand", // ← corrected
"leftWrist": "Left_Hand",
"chest": "UpperChest", // ← corrected (was "Chest")
"neck": "Neck",
"rightUpperLeg": "Right_UpperLeg",
"leftUpperLeg": "Left_UpperLeg",
"rightAnkle": "Right_Foot",
"leftAnkle": "Left_Foot"
}
}The 12 keys are the only valid ones (matches KnownJointType enum: root, hips, rightUpperArm, leftUpperArm, rightWrist, leftWrist, chest, neck, rightUpperLeg, leftUpperLeg, rightAnkle, leftAnkle). After editing this, the user typically also wants to re-run alignment — recommend they re-run MSDKUtilityEditor.RunDefaultRetargetingSetup on the asset (it will preserve the JSON and re-derive mappings).
Useful when the auto-mapper ties a source twist/palm joint to an unwanted target joint. Add to source.autoMappingJointData (or target.autoMappingJointData for target-side exclusions):
"source": {
"autoMappingJointData": {
"LeftHandPalm": { "excludeFromMapping": true },
"LeftHandWristTwist": { "excludeFromMapping": true },
"RightHandPalm": { "excludeFromMapping": true },
"RightHandWristTwist": { "excludeFromMapping": true },
"LeftFootAnkleTwist": { "excludeFromMapping": true },
"RightFootAnkleTwist": { "excludeFromMapping": true },
"Some_Custom_Joint": { "excludeFromTwistMappings": true } // ← only twist mapping skipped
}
}Two flags exist (from AutoMappingJointFlags):
excludeFromMapping: true — joint is completely ignored when generating mappingsexcludeFromTwistMappings: true — joint is still mapped normally but skipped when generating behavior: "twist" / "childAlignedTwist" entriesThe keys' iteration order in this object is non-deterministic (native unordered map). Don't rely on it; same set of keys = equivalent config.
A mapping entry is keyed by the target joint name and lists source joints that drive it, each with weightPosition (0–1) and weightRotation (0–1). Both default to summing toward 1.0 across siblings, but the runtime normalizes — relative weights matter, not absolute.
"mapping": {
"min": {
"Left_Hand": {
"type": "source",
"behavior": "normal",
"mappings": {
"LeftHandWrist": { "weightPosition": 1.0, "weightRotation": 1.0 }
}
},
"Hips": {
"type": "source",
"behavior": "normal",
"mappings": {
"Hips": { "weightPosition": 0.234, "weightRotation": 1.0 },
"SpineLower": { "weightPosition": 0.256, "weightRotation": 0.0 },
"LeftUpperLeg": { "weightPosition": 0.121, "weightRotation": 0.0 },
"RightUpperLeg": { "weightPosition": 0.121, "weightRotation": 0.0 }
}
}
},
"max": { /* same shape, different weights for max body scale */ }
}Common tweaks:
weightRotation to 0 if you only want a source joint to influence position (or vice-versa).mappings dict to give it influence over the target joint.mapping.min and mapping.max are usually identical or close — set them the same when in doubt.Three legal values for behavior:
"normal" — direct weighted blend"twist" — for source-side twist joints; aligns parent rotation through to the twist"childAlignedTwist" — for target-side twist behavior; aligns from twist joint down to childrenWhen a target joint has both source and target sub-mappings (e.g. for arm/leg twist), the entry has a different shape:
"Left_UpperArm": {
"source": {
"behavior": "normal",
"mappings": {
"LeftShoulder": { "weightPosition": 0.086, "weightRotation": 0.086 },
"LeftScapula": { "weightPosition": 0.513, "weightRotation": 0.513 },
"LeftArmUpper": { "weightPosition": 0.402, "weightRotation": 0.402 }
}
},
"target": {
"behavior": "childAlignedTwist",
"mappings": {
"Left_LowerArm": { "weightPosition": 0.0, "weightRotation": 0.5 },
"Left_UpperArm": { "weightPosition": 0.0, "weightRotation": 0.5 }
}
}
}Note the structural difference from a "single" entry: no top-level type/behavior/mappings, instead a source block + a target block, each with its own behavior + mappings dict.
If a model has extra bones the source skeleton doesn't have (e.g. cape bones, weapon bones), exclude them from retargeting. The UI's − button on a leaf joint does this. To do it manually, remove the joint name from all of these:
target.joints[] — drop the stringtarget.hierarchy — drop the "<jointName>": "<parent>" entry, AND drop any entry whose value points to the removed joint (orphan check)target.tpose, target.tposeMin, target.tposeMax — drop the entrymapping.min, mapping.max — drop the entry keyed by the removed joint name; also drop any nested target.mappings.<jointName> referencetarget.knownJoints, you've removed something semantically important — pick a replacement firstThe runtime ignores joints absent from target.joints, so leaving stale entries elsewhere produces silent dead data. Always clean them up.
tpose (unscaled), tposeMin (smallest scale), tposeMax (largest scale) are keyed by joint name and contain world-space position (xyz) + rotation (xyzw quaternion). All in root-origin space (parent = root joint).
"target": {
"tpose": {
"Hips": {
"position": { "x": 0.0, "y": 0.981, "z": -0.016 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 }
}
}
}Common tweaks:
tposeMin and tposeMax deliberately different to give the runtime a wider scale rangeThe unit is meters (per config.coordinateSpace.metersToUnitScale: 1.0). Quaternions are unit-length — preserve that when editing rotations.
If the model's bones are named mixamorig:Hips but downstream tooling expects Hips, you can globally rename in the JSON without touching the FBX. Use replace_all: true on the Edit tool, but only within the target.* and mapping.min/mapping.max sections — never touch source.*, which uses the fixed OVR naming.
Rare: changing source.format.skeletonFlags.noRotationCorrectionOnCoordConversion between true (X-Engine native skeletons like OVR) and false (FBX/GLTF). Don't change unless you're swapping in a non-OVR source.
Symptom: the character retargets in roughly the right place, but body parts shear/skew — worst at the Min T-pose (small user / scaled-down). This is not a JSON mapping bug; it's a model-scale problem, and the fix is in the FBX import settings, not the config.
Why it happens: the runtime sizes a character with two independent levers — (a) per-joint retargeted positions (limb lengths, never clamped) and (b) a uniform root localScale that shrinks the mesh (thickness/skin). The root scale is clamped to SkeletonRetargeter._scaleRange, which defaults to (0.8, 1.2). If the FBX is authored far from human height, the scale the runtime needs falls below 0.8: the joints collapse to (e.g.) 30% spacing while the mesh can only shrink to 80%, so linear-blend skinning drags the oversized mesh across the shortened bones → skew. It's worst at Min because that's where the demanded scale is furthest below the 0.8 floor.
How to spot it: check the unscaled T-pose height in <asset>.json — target.tpose hip Y and overall span. A correct humanoid is ~1.5–2.0 m tall (hips ~0.9 m). A model that's ~2× that (e.g. 3.7 m tall, hips at ~2.1 m) will need a min/max scale of ~0.30–0.62, well outside (0.8, 1.2). Mixamo rigs (mixamorig: bone prefix) are a common offender, and they often import as Generic rather than Humanoid.
The fix (preferred — correct the authored scale): in the FBX ModelImporter, set Scale Factor so the rig lands at human height (targetHeight / currentHeight, e.g. 1.7 / 3.7 ≈ 0.46), AND set Rig → Animation Type to Humanoid. Then re-import the model and regenerate the config — both are required:
// AgentScripts/FixImportScale.cs
using UnityEditor;
public static class FixImportScale
{
public static string Run(string path, float scale)
{
var importer = (ModelImporter)AssetImporter.GetAtPath(path);
if (importer == null) return $"ERROR: no ModelImporter at {path}";
importer.globalScale = scale; // targetHeight / currentHeight
importer.useFileScale = false; // honor globalScale, not the FBX unit
importer.animationType = ModelImporterAnimationType.Human; // Humanoid
importer.SaveAndReimport(); // re-import with new settings
return $"reimported {path} at globalScale={scale}";
}
}unity command run_script --file AgentScripts/FixImportScale.cs \
--entry FixImportScale.Run --args '["Assets/MyChar/MyChar.fbx", 0.46]' --format jsonTHEN re-run RunDefaultRetargetingSetup (see above) to regenerate the T-pose/min/max from the
now-correctly-scaled rig.
SaveAndReimport() triggers an asset import, so run the regeneration as a separate run_script
call rather than chaining it in the same script.
After SaveAndReimport(), the on-disk T-pose changes, so the old <asset>.json is stale — you must re-run MSDKUtilityEditor.RunDefaultRetargetingSetup afterward. Re-verify the unscaled T-pose height is now human-sized.
Quick band-aid (only if you can't change the model): widen _scaleRange on the CharacterRetargeter component (e.g. (0.25, 1.5)) so the root scale isn't clamped. This stops the skew but leaves the rig running outside its design envelope (watch for foot sliding / IK offsets). Prefer fixing the import scale.
After editing, the user should:
Assets/Movement SDK/Body Tracking/Open Retargeting Configuration Editor on the model. The editor will silently fall back to defaults if a known joint is missing or a mapping references a non-existent joint, so look for warnings + inspect the bone foldout.CharacterRetargeter component (or use the existing MovementBody test scene) and verify limbs track correctly. Then confirm on a headset with live body tracking: deploy the test scene and stream metavr adb logcat --follow --tag Unity for retargeting warnings while moving.The runtime tolerates extra unrecognized fields in the JSON, so additive edits are safe; the dangerous edits are removals and renames. Always cross-check joint name consistency across all sections (use grep -c "<oldName>" before and after to confirm a rename touched everything).
"The character's wrists are bent backwards in MR" → Wrong rightWrist / leftWrist known joint. Open the asset's JSON, fix target.knownJoints.rightWrist and .leftWrist to point to the actual hand bones (look at target.joints[] + target.hierarchy to find the right names), then re-run MSDKUtilityEditor.RunDefaultRetargetingSetup.
"Fingers are jittery" → The source has LeftHandPalm / RightHandPalm mapped into the target. Add them to source.autoMappingJointData with excludeFromMapping: true, then re-run setup.
"Character floats above ground" → Adjust target.tpose.<root>.position.y and target.tposeMin.<root>.position.y and target.tposeMax.<root>.position.y downward (often the rig has the root at hip-height instead of floor).
"Need to retarget a humanoid with non-standard bone names" → After running RunDefaultRetargetingSetup, fix target.knownJoints to point to the actual bone names. The auto-detector uses heuristics that fail on naming like bn_pelvis_C_001.
"Body parts skew / shear when scaled down (worst at Min T-pose)" → Oversized authored rig (often a Mixamo mixamorig: FBX). Check the unscaled T-pose height in the JSON; if it's ~2× human (e.g. 3.7 m), the needed root scale falls below the (0.8, 1.2) clamp. Set the FBX import Scale Factor to targetHeight / currentHeight (e.g. 0.46) and Animation Type to Humanoid, SaveAndReimport(), then re-run RunDefaultRetargetingSetup. See "Fix a model that skews when scaled down" above.
MSDKUtilityEditor.RunDefaultRetargetingSetup(asset) reuses the existing JSON when one is present (it doesn't recreate from scratch), but it does run GenerateMappings for the MinTPose/MaxTPose steps, which overwrites mapping.min / mapping.max. Survival summary:
| Edit | Survives re-run? |
|---|---|
target.knownJoints (any of the 12 keys) | Yes, if the joint name actually exists in the model's transform hierarchy. If you typo a name, the next re-run silently sets it to empty. |
source.autoMappingJointData with excludeFromMapping: true | Yes |
source.autoMappingJointData with excludeFromTwistMappings: true | No — SkeletonData.GenerateAutoMappingExcludedJointDataFromJointNameList only round-trips the Exclude flag. The twist-only exclusion gets dropped on re-run. |
mapping.min / mapping.max weight tweaks | No — regenerated from scratch |
target.tpose* position/rotation edits | Partial — values are read into SkeletonData, but every step's UpdateConfig re-reads scene transforms via JointAlignmentUtility.UpdateTPoseData. Edits stick only if the model itself has those poses on disk, otherwise the scene values overwrite them. |
| Removing a joint cleanly (all sections) | Yes — target.joints is the source of truth |
| Renaming target joints (consistent across all sections) | Yes, same reasoning as above |
So: do mapping-weight tweaks, twist-only exclusions, and ad-hoc T-pose tweaks last, after any final RunDefaultRetargetingSetup. For known-joints and exclude-from-mapping edits, re-run is fine.
© meta-quest, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in skills/hz-unity-meta-movement-sdk-retargeting of meta-quest/agentic-tools.
Open the folder on GitHubat commit 3a8553d
Hz Unity Meta Movement SDK Retargeting next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Hz Unity Meta Movement SDK Retargeting this skillmeta-quest/agentic-tools | 215 | — | ~5.4k | Automated safety check: Pass | Apache-2.0 | |
| Sprite Genaldegad/sprite-gen | 2.7k | — | ~4.9k | Automated safety check: Pass | Apache-2.0 | |
| Blockbench Pluginsjasonjgardner/blockbench-mcp-plugin | 500 | — | ~2.8k | Automated safety check: Pass | GPL-3.0 | |
| Unreal Blueprint Authoringflopperam/unreal-engine-mcp | 1.1k | — | ~1.6k | Automated safety check: Pass | None | |
| Locus Unity BridgeMisaka-Mikoto-Tech/agent-skills | 278 | — | ~4k | Automated safety check: Pass | MIT | |
| Assets Shader List AllIvanMurzak/Unity-MCP | 4.4k | — | ~435 | Automated safety check: Pass | Apache-2.0 |
aldegad/sprite-gen
Generates images and game sprites through GPT or Grok with guided provider choices, separate saved defaults, automatic cleanup and optional curation.
jasonjgardner/blockbench-mcp-plugin
Blockbench plugin/extension development for the 3D modeling tool.
flopperam/unreal-engine-mcp
Walks an agent through creating and editing Unreal Engine Blueprints with the Flopperam MCP's bp_* tools, from inspection to commit and verification.
Misaka-Mikoto-Tech/agent-skills
A skill your agent uses when an agent needs to inspect or control a real Unity Editor through Locus, especially when Unity MCP is unavailable, named-pipe discovery is needed, C must be executed, or…
IvanMurzak/Unity-MCP
List all shaders available in the project assets and packages, sorted by name.
flopperam/unreal-engine-mcp
Walks an Unreal Engine MCP agent through building materials, Niagara particle systems, Chaos destruction, and curve assets with inspect-then-edit steps.
meta-quest/agentic-tools
Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements.
meta-quest/agentic-tools
Upgrades Meta VR apps to newer Horizon OS SDK versions — migration guides, deprecated API replacements, changelog.
meta-quest/agentic-tools
Builds WebXR experiences for Meta VR and Horizon OS using the Immersive Web SDK (IWSDK) — ECS architecture, Three.js integration, spatial UI.
meta-quest/agentic-tools
Build multi-window Meta Horizon OS experiences with the MetaVrx Layout SDK in Jetpack Compose or React Native.
meta-quest/agentic-tools
Scaffolds new Meta VR and Horizon OS projects after the build path is selected — Standard Android, Meta Spatial SDK, Unity, Unreal, or WebXR.
meta-quest/agentic-tools
Analyzes Meta VR and Horizon OS VR performance using Perfetto traces — frame timing, CPU/GPU bottlenecks, render pass analysis.
Works with
Categories
Set up and tweak Meta Movement SDK (MSDK) retargeting for a character model. Hz Unity Meta Movement SDK Retargeting is an agent skill from meta-quest/agentic-tools. Set up and tweak Meta Movement SDK (MSDK) retargeting for a character model.
Hz Unity Meta Movement SDK Retargeting fits situations like: wants to retarget a humanoid FBX/prefab for Meta VR body tracking; generate a retargeting config; hand-edit the resulting <asset.json (fix known-joint mappings; exclude joints from auto-mapping.
Run `npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a claude-code`. Or copy the skill folder (skills/hz-unity-meta-movement-sdk-retargeting in meta-quest/agentic-tools) into .claude/skills/hz-unity-meta-movement-sdk-retargeting in your project. Claude Code loads it when a task matches its description.
Run `npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a codex`. Or copy the skill folder (skills/hz-unity-meta-movement-sdk-retargeting in meta-quest/agentic-tools) into .agents/skills/hz-unity-meta-movement-sdk-retargeting in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add meta-quest/agentic-tools --skill hz-unity-meta-movement-sdk-retargeting -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hz-unity-meta-movement-sdk-retargeting, .gemini/skills/hz-unity-meta-movement-sdk-retargeting, .github/skills/hz-unity-meta-movement-sdk-retargeting and .opencode/skills/hz-unity-meta-movement-sdk-retargeting in your project.
SKILL.md names no scripts, command-line tools or credentials: Hz Unity Meta Movement SDK Retargeting is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Hz Unity Meta Movement SDK Retargeting is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 879 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Hz Unity Meta Movement SDK Retargeting: Sprite Gen (aldegad/sprite-gen, 2.7k stars), Blockbench Plugins (jasonjgardner/blockbench-mcp-plugin, 500 stars), Unreal Blueprint Authoring (flopperam/unreal-engine-mcp, 1.1k stars) and Locus Unity Bridge (Misaka-Mikoto-Tech/agent-skills, 278 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
meta-quest (a GitHub organization) maintains it in meta-quest/agentic-tools, which has 215 GitHub stars. The repository holds 34 skills in this directory. The repository was last updated on September 24, 2026.
Source: meta-quest/agentic-tools on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.