hz-android-2d-porting
Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use…
Configures Unity UI for Meta VR and Horizon OS VR development — world-space canvases, TextMesh Pro setup, comfortable sizing, viewing distances, and interaction readiness.
Claude Code
$ npx -y skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui --agent claude-code
Codex
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui -a codex -y
Cursor
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui -a cursor -y
Gemini CLI
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui -a gemini-cli -y
GitHub Copilot
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui -a github-copilot -y
OpenCode
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui -a opencode -y
Windsurf
$ npx skills add meta-quest/agentic-tools --skill hz-unity-meta-quest-ui -a windsurf -y
name: hz-unity-meta-quest-ui license: Apache-2.0 description: Configures Unity UI for Meta VR and Horizon OS VR development — world-space canvases, TextMesh Pro setup, comfortable sizing, viewing distances, and interaction readiness.
Use this skill automatically when:
Build the UI against an open Editor with `unity-cli` rather than hand-editing scene YAML — the Editor applies changes to the actual active scene.
unity status --format json # look for state "ready" unity command run_script --file AgentScripts/BuildUI.cs --entry BuildUI.Run --format json
Canvas construction is multi-component work, so it belongs in a `run_script` `.cs` file (kept **outside `Assets/`**, path relative to the project root) rather than a chain of single commands. Add `--dry_run true` to compile-check a script before it mutates the scene — but read the verdict from **`data.result.success`**: a compile failure still returns outer `success: true` and exit code `0`, with the errors in `data.result.diagnostics`. Connecting, `--project-path`, and Safe Mode recovery are in the **`unity-cli`** skill; MCP equivalents are in [references/unity-mcp-fallback.md](references/unity-mcp-fallback.md).
Single-property reads and writes are cheaper as direct commands than as a script:
unity command get_component_properties --target MenuUI --type Canvas --format json unity command set_transform --target MenuUI --position "[0,1.5,2]" --format json unity command find_gameobjects --name MenuUI --format json
Array parameters take a **JSON array in one argument** (`--position "[0,1.5,2]"`). Space- or comma-separated components are rejected with `INVALID_COMMAND_ARGS`. Note `set_transform` writes **local** position — see the **unity-placement** skill for parented canvases.
Before creating ANY VR UI, verify TMP resources are imported:
unity command find_assets --name "LiberationSans SDF" --format json
A `data.result.count` of `0` means they are missing — use the **tmp-resources** skill before proceeding.
// AgentScripts/BuildUI.cs
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.UI;
public static class BuildUI
{
public static string Run()
{
// Adapt the name to match your canvas (e.g., "MainMenu", "SettingsUI")
var go = new GameObject("MenuUI");
var canvas = go.AddComponent<Canvas>();
canvas.renderMode = RenderMode.WorldSpace;
go.AddComponent<GraphicRaycaster>();
// Remove CanvasScaler — not appropriate for VR
var scaler = go.GetComponent<CanvasScaler>();
if (scaler != null)
Object.DestroyImmediate(scaler);
var rt = go.GetComponent<RectTransform>();
rt.localScale = new Vector3(0.001f, 0.001f, 0.001f);
rt.sizeDelta = new Vector2(1920f, 1080f);
rt.position = new Vector3(0f, 1.5f, 2f);
Undo.RegisterCreatedObjectUndo(go, "Create VR Canvas");
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
return $"Created VR Canvas '{go.name}'. Scale: {rt.localScale}, Size: {rt.sizeDelta}, Position: {rt.position}";
}
}Persist it when the shape is right:
unity command save_scene --format json
All child elements (panels, buttons, text) must follow these rules:
// AgentScripts/BuildPanel.cs
using TMPro;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.UI;
public static class BuildPanel
{
public static string Run()
{
// Replace "MenuUI" with the actual canvas name used in Step 1
var canvas = GameObject.Find("MenuUI");
if (canvas == null) return "ERROR: Canvas 'MenuUI' not found.";
// Panel
var panel = new GameObject("ButtonPanel");
panel.transform.SetParent(canvas.transform, false);
var panelRT = panel.AddComponent<RectTransform>();
panelRT.localScale = Vector3.one;
panelRT.sizeDelta = new Vector2(800f, 600f);
var panelImg = panel.AddComponent<Image>();
panelImg.color = new Color(0.1f, 0.1f, 0.1f, 0.95f);
panelImg.raycastTarget = false;
var layout = panel.AddComponent<VerticalLayoutGroup>();
layout.spacing = 50f;
layout.padding = new RectOffset(80, 80, 100, 100);
layout.childAlignment = TextAnchor.MiddleCenter;
// Button
var btnGO = new GameObject("StartButton");
btnGO.transform.SetParent(panel.transform, false);
var btnRT = btnGO.AddComponent<RectTransform>();
btnRT.localScale = Vector3.one;
btnRT.sizeDelta = new Vector2(400f, 120f);
var btnImg = btnGO.AddComponent<Image>();
btnImg.color = new Color(0.2f, 0.6f, 1f, 1f);
btnGO.AddComponent<Button>();
// BGuides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use…
Upgrades Meta VR apps to newer Horizon OS SDK versions — migration guides, deprecated API replacements, changelog. Use when…
Guides design of comfortable, intuitive VR/MR experiences for Meta VR and Horizon OS — comfort guidelines, interaction patterns,…
Builds WebXR experiences for Meta VR and Horizon OS using the Immersive Web SDK (IWSDK) — ECS architecture, Three.js integration,…
Build multi-window Meta Horizon OS experiences with the MetaVrx Layout SDK in Jetpack Compose or React Native. Covers framework…
Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system. Covers…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.