Skip to content
Development
Skill

/hz-unity-fbx-import

Ensures complete FBX URLs or absolute paths are used when importing external 3D models into Unity projects targeting Meta VR and Horizon OS. Use when adding FBX files, 3D models, or external assets.

From plugin
meta-vr
24936 skills1 MCP

Claude Code

$ npx -y skills add meta-quest/agentic-tools --skill hz-unity-fbx-import --agent claude-code

SKILL.md

hz-unity-fbx-import.SKILL.md
name: hz-unity-fbx-import
license: Apache-2.0
description: Ensures complete FBX URLs or absolute paths are used when importing external 3D models into Unity projects targeting Meta VR and Horizon OS. Use when adding FBX files, 3D models, or external assets.

Unity FBX Import with Full URLs

Importing an external 3D model fails most often for one reason: an incomplete source path. This skill ensures every FBX source is a **complete, fully-qualified URL or absolute filesystem path**, and walks the import through `unity-cli`.

When to use this skill

Use this skill automatically whenever:

  • Importing FBX files from external sources
  • Adding 3D models to the Unity project
  • Loading assets from URLs or file paths
  • User mentions: "import model", "add FBX", "load 3D asset", "bring in model"

Core principle

**ALWAYS use complete, fully-qualified URLs or absolute paths for FBX files.**

Never use relative paths, partial URLs, or assume path completion.

**`unity command import_asset` takes an absolute *filesystem* path — it does not download.** Verified: passing a URL fails with *"Source file 'https://…' does not exist."* So a remote model is always two steps: download to disk, then import the local file.

Instructions

Step 1: Identify the FBX source

When a user requests to import a model, determine the source:

1. **Remote URL** (HTTP/HTTPS):

  • Must start with `http://` or `https://`
  • Must include the full domain and path
  • Filename must end with `.fbx` or `.zip`
  • **IMPORTANT**: Include ALL query parameters and tokens after the extension
  • Query parameters (like `?param=value&other=data`) are required for authentication
  • Example: `https://example.com/models/character.fbx?token=abc123&auth=xyz`
  • Example: `https://cdn.fbcdn.net/path/file.fbx?_nc_gid=xxx&_nc_oc=yyy&oh=zzz`

2. **Local file** (file system):

  • Must be an absolute path (not relative)
  • Windows: `C:/Users/name/Downloads/model.fbx`
  • Unix/Mac: `/home/user/models/model.fbx`
  • Must end with `.fbx` or `.zip`

3. **ZIP archive**:

  • Can be URL or local path
  • Must contain an FBX file inside — extract before importing
  • Example: `https://example.com/assets.zip`

Step 2: Validate the source format

**CRITICAL**: For URLs with query parameters (like `?token=...&auth=...`), you MUST include the ENTIRE URL including all parameters. Query parameters often contain authentication tokens required for download.

Valid examples:

  • `https://cdn.example.com/assets/models/chair.fbx`
  • `https://cdn.example.com/models/chair.fbx?token=abc123&auth=xyz789` (with query params)
  • `https://scontent.fbcdn.net/model.fbx?_nc_gid=xxx&_nc_oc=yyy&oh=zzz` (Meta CDN with auth)
  • `http://localhost:8000/models/character.fbx`
  • `C:/Projects/Models/tree.fbx` (Windows absolute)
  • `/home/user/assets/car.fbx` (Unix absolute)
  • `https://github.com/user/repo/releases/download/v1.0/model.zip`

Invalid examples (never use these):

  • `models/chair.fbx` (relative path)
  • `~/Downloads/robot.fbx` (tilde expansion not supported)
  • `example.com/model.fbx` (missing protocol)
  • `../assets/model.fbx` (relative path)
  • `model.fbx` (no path at all)

Step 3: Download remote sources to disk

Skip this step for a local file. **Quote the URL** so the shell doesn't split on `&` in query parameters — the single most common cause of a truncated, failing download.

# macOS / Linux
curl -fSL "https://example.com/models/office_chair.fbx" -o /tmp/office_chair.fbx

# Windows (PowerShell)
Invoke-WebRequest -Uri "https://example.com/models/office_chair.fbx" -OutFile "$env:TEMP\office_chair.fbx"

Confirm the file exists and is non-empty before importing. A truncated or HTML error page saved as `.fbx` imports as a broken asset rather than failing loudly.

For a `.zip`, extract it first and locate the `.fbx` inside; import that.

Step 4: Import the file

unity status --format json          # look for state "ready"

# Validate first — reports what would be imported, writes nothing
unity command import_asset --source "C:/Users/name/Downloads/office_chair.fbx" \
  --path "Assets/Models/office_chair.fbx" --dry_run true --format json

# Then import for real
unity command import_asset --source "C:/Users/name/Downloads/office_chair.fbx" \
  --path "Assets/Models/office_chair.fbx" --format json
  • `--source` is an **absolute filesystem path** to the external file.
  • `--path` is the destination **relative to the authoring root** (usually `Assets/`), including the

extension. The `Assets/` prefix is optional.

  • `--confirm true` is required only when overwriting an existing asset at the destination.
  • `--dry_run true` validates and reports without writing — use it whenever the source came from a user.

Connecting, `--project-path`, and Safe Mode recovery are in the **`unity-cli`** skill.

Step 5: Set scale and rig type

`import_asset` copies and imports the file at its authored scale. Unlike a one-shot "import at height H" tool, normalizing size is a separate step:

unity command set_import_settings --asset "Assets/Models/office_chair.fbx" \
  --settings '{"globalScale": 0.46, "useFileScale": false}' --format json

Compute `globalScale` as `targetHeight / currentHeight`. For a humanoid rig also set `animationType` to Humanoid. See **`hz-unity-meta-movement-sdk-retargeting`** for why an oversized rig causes skewing, and for the `ModelImporter` fields involved.

Step 6: Instantiate, then get real bounds

unity command instantiate_prefab --prefab "Assets/Models/office_chair.fbx" --name office_chair --format json
unity command save_scene --format json

Then read the actual bounds — **never assume the model's size**. `bounds` is a computed property, so `get_component_properties` will not give it to you (a `MeshRenderer` read returns `m_Materials`, `m_CastShadows` and friends, no bounds). An imported FBX also puts its renderers on **children** of the instantiated root, so use `GetBounds.

Read more
@meta-quest
Ships withmeta-vr

Agentic skills and tools for Meta VR and Horizon OS development.

24936 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
249
Star history of meta-quest/agentic-tools on GitHub, a chart by star-history.com

Other skills on meta-vr.

hz-android-2d-porting

hz-android-2d-porting

Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use…

@meta-quest@meta-questInstall Skill
hz-api-upgrade

hz-api-upgrade

Upgrades Meta VR apps to newer Horizon OS SDK versions — migration guides, deprecated API replacements, changelog. Use when…

@meta-quest@meta-questInstall Skill
hz-immersive-designer

hz-immersive-designer

Guides design of comfortable, intuitive VR/MR experiences for Meta VR and Horizon OS — comfort guidelines, interaction patterns,…

@meta-quest@meta-questInstall Skill
hz-iwsdk-webxr

hz-iwsdk-webxr

Builds WebXR experiences for Meta VR and Horizon OS using the Immersive Web SDK (IWSDK) — ECS architecture, Three.js integration,…

@meta-quest@meta-questInstall Skill
hz-metavrx-layout-sdk

hz-metavrx-layout-sdk

Build multi-window Meta Horizon OS experiences with the MetaVrx Layout SDK in Jetpack Compose or React Native. Covers framework…

@meta-quest@meta-questInstall Skill
hz-metavrx-ui-set

hz-metavrx-ui-set

Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system. Covers…

@meta-quest@meta-questInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about hz-unity-fbx-import.

Which coding agents can use hz-unity-fbx-import?
hz-unity-fbx-import installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.