hz-android-2d-porting
Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use…
Ensures accurate object placement in Unity projects targeting Meta VR and Horizon OS by using Renderer and Collider bounds when objects are added, moved, or positioned relative to other objects.
Claude Code
$ npx -y skills add meta-quest/agentic-tools --skill hz-unity-placement --agent claude-code
Codex
$ npx skills add meta-quest/agentic-tools --skill hz-unity-placement -a codex -y
Cursor
$ npx skills add meta-quest/agentic-tools --skill hz-unity-placement -a cursor -y
Gemini CLI
$ npx skills add meta-quest/agentic-tools --skill hz-unity-placement -a gemini-cli -y
GitHub Copilot
$ npx skills add meta-quest/agentic-tools --skill hz-unity-placement -a github-copilot -y
OpenCode
$ npx skills add meta-quest/agentic-tools --skill hz-unity-placement -a opencode -y
Windsurf
$ npx skills add meta-quest/agentic-tools --skill hz-unity-placement -a windsurf -y
name: hz-unity-placement license: Apache-2.0 description: Ensures accurate object placement in Unity projects targeting Meta VR and Horizon OS by using Renderer and Collider bounds when objects are added, moved, or positioned relative to other objects.
This skill ensures that when placing, moving, or positioning Unity GameObjects relative to other objects, proper bounding box calculations are used to prevent overlaps and ensure accurate placement.
Use this skill automatically whenever:
**IMPORTANT**: Proactively invoke this skill immediately when you detect ANY of these patterns:
**Example 1**: "Place all objects on the tables"
**Example 2**: "Put the mug on the table"
**Example 3**: "Place the lamp next to the clock"
**Example 4**: "Position the book 0.5 meters to the left of the pen"
**Example 1**: "Move object to [5, 10, 3]"
**Example 2**: "Set the cube's position to (0, 0, 0)"
**ALWAYS get bounding box information before calculating positions.**
Never assume object sizes - always retrieve actual bounds from Renderer or Collider components on the live Editor.
Read and write the scene through `unity-cli` rather than editing `.unity` YAML — raw-file edits are invisible to the running Editor and easily hit the wrong scene.
unity status --format json # look for state "ready"
See the **`unity-cli`** skill for connecting, `--project-path`, and Safe Mode recovery. On a Unity MCP server instead, the same steps apply — use whatever scene-inspection and transform tools it exposes.
When the user requests object placement: 1. Identify the **target object** (the one being placed/moved) 2. Identify the **reference object** (the one it's being placed relative to) 3. Note the desired **spatial relationship** (on, beside, above, etc.)
For BOTH objects, locate them and read their bounds:
unity command find_gameobjects --name Cube --format json
`bounds` is a **computed** property, not a serialized field, so `get_component_properties` does not return it — a `MeshRenderer` read gives you `m_Materials`, `m_CastShadows` and friends, and no bounds at all. Reading bounds always means a script:
// AgentScripts/GetBounds.cs
using System.Text;
using UnityEngine;
public static class GetBounds
{
public static string Run(string[] names)
{
var sb = new StringBuilder();
foreach (var name in names)
{
var go = GameObject.Find(name);
if (go == null) { sb.AppendLine($"{name}: NOT FOUND"); continue; }
if (!TryGetBounds(go, out var b, out var src))
{
sb.AppendLine($"{name}: NO Renderer or Collider - bounds unknown");
continue;
}
sb.AppendLine($"{name} [{src}] center={b.center} size={b.size} extents={b.extents} min={b.min} max={b.max}");
}
return sb.ToString();
}
// Root renderer/collider first; otherwise the union of the children's, which is what an
// imported model needs since its renderers sit on child GameObjects.
private static bool TryGetBounds(GameObject go, out Bounds bounds, out string source)
{
bounds = default;
source = null;
var r = go.GetComponent<Renderer>();
if (r != null) { bounds = r.bounds; source = "Renderer"; return true; }
var col = go.GetComponent<Collider>();
if (col != null) { bounds = col.bounds; source = "Collider"; return true; }
foreach (var cr in go.GetComponentsInChildren<Renderer>())
{
if (source == null) {Guides 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.