{
  "schemaVersion": "1.0",
  "item": {
    "slug": "unity",
    "name": "Unity",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/ivangdavila/unity",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/unity",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/unity",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=unity",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/unity"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/unity",
    "agentPageUrl": "https://openagent3.xyz/skills/unity/agent",
    "manifestUrl": "https://openagent3.xyz/skills/unity/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/unity/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Lifecycle Order",
        "body": "Awake before Start — use Awake for self-init, Start for cross-references\nOnEnable called before Start — but after Awake\nOrder between scripts not guaranteed — use Script Execution Order if needed\nAwake called even if disabled — Start only when enabled"
      },
      {
        "title": "GetComponent Performance",
        "body": "GetComponent every frame is slow — cache in Awake or Start\nGetComponentInChildren searches recursively — expensive on deep hierarchies\nTryGetComponent returns bool — avoids null check, slightly faster\nUse RequireComponent attribute — ensures dependency, documents requirement"
      },
      {
        "title": "Physics Timing",
        "body": "Physics in FixedUpdate, not Update — consistent regardless of framerate\nFixedUpdate can run 0 or multiple times per frame — don't assume 1:1\nRigidbody.MovePosition in FixedUpdate — transform.position bypasses physics\nTime.deltaTime in Update, Time.fixedDeltaTime in FixedUpdate — or just use deltaTime"
      },
      {
        "title": "Unity's Fake Null",
        "body": "Destroyed objects aren't truly null — == null returns true, but object exists\nNull-conditional ?. doesn't work properly — use == null or bool conversion\nDestroy doesn't happen immediately — object gone next frame\nUse DestroyImmediate only in editor — causes issues in builds"
      },
      {
        "title": "Coroutines",
        "body": "StartCoroutine needs MonoBehaviour active — disabled/destroyed stops coroutines\nyield return null waits one frame — yield return new WaitForSeconds(1) for time\nStopCoroutine needs same method or Coroutine reference — string overload unreliable\nCan't return values — use callbacks or set field in coroutine"
      },
      {
        "title": "Instantiate and Pooling",
        "body": "Instantiate is expensive — pool frequently created/destroyed objects\nInstantiate(prefab, parent) sets parent — avoids extra SetParent call\nSetActive(false) before returning to pool — not Destroy\nPool inactive objects under a parent — keeps hierarchy clean"
      },
      {
        "title": "Serialization",
        "body": "[SerializeField] for private fields in inspector — prefer over public\npublic fields auto-serialize — but exposes API you may not want\n[HideInInspector] hides but still serializes — [NonSerialized] to skip entirely\nSerialized fields keep inspector values — code defaults ignored after first serialize"
      },
      {
        "title": "ScriptableObjects",
        "body": "Data containers that live as assets — share between scenes/prefabs\nCreateAssetMenu attribute for easy creation — right-click → Create\nDon't modify at runtime in builds — changes not saved (except in editor)\nGreat for config, item databases — reduces prefab duplication"
      },
      {
        "title": "Common Mistakes",
        "body": "Find methods every frame — cache references\nString comparisons for tags — use CompareTag(\"Enemy\"), not tag == \"Enemy\"\nPhysics queries allocate — use NonAlloc variants: RaycastNonAlloc\nUI anchors wrong — stretches unexpectedly on different resolutions\nasync/await without context — use UniTask or careful error handling"
      }
    ],
    "body": "Lifecycle Order\nAwake before Start — use Awake for self-init, Start for cross-references\nOnEnable called before Start — but after Awake\nOrder between scripts not guaranteed — use Script Execution Order if needed\nAwake called even if disabled — Start only when enabled\nGetComponent Performance\nGetComponent every frame is slow — cache in Awake or Start\nGetComponentInChildren searches recursively — expensive on deep hierarchies\nTryGetComponent returns bool — avoids null check, slightly faster\nUse RequireComponent attribute — ensures dependency, documents requirement\nPhysics Timing\nPhysics in FixedUpdate, not Update — consistent regardless of framerate\nFixedUpdate can run 0 or multiple times per frame — don't assume 1:1\nRigidbody.MovePosition in FixedUpdate — transform.position bypasses physics\nTime.deltaTime in Update, Time.fixedDeltaTime in FixedUpdate — or just use deltaTime\nUnity's Fake Null\nDestroyed objects aren't truly null — == null returns true, but object exists\nNull-conditional ?. doesn't work properly — use == null or bool conversion\nDestroy doesn't happen immediately — object gone next frame\nUse DestroyImmediate only in editor — causes issues in builds\nCoroutines\nStartCoroutine needs MonoBehaviour active — disabled/destroyed stops coroutines\nyield return null waits one frame — yield return new WaitForSeconds(1) for time\nStopCoroutine needs same method or Coroutine reference — string overload unreliable\nCan't return values — use callbacks or set field in coroutine\nInstantiate and Pooling\nInstantiate is expensive — pool frequently created/destroyed objects\nInstantiate(prefab, parent) sets parent — avoids extra SetParent call\nSetActive(false) before returning to pool — not Destroy\nPool inactive objects under a parent — keeps hierarchy clean\nSerialization\n[SerializeField] for private fields in inspector — prefer over public\npublic fields auto-serialize — but exposes API you may not want\n[HideInInspector] hides but still serializes — [NonSerialized] to skip entirely\nSerialized fields keep inspector values — code defaults ignored after first serialize\nScriptableObjects\nData containers that live as assets — share between scenes/prefabs\nCreateAssetMenu attribute for easy creation — right-click → Create\nDon't modify at runtime in builds — changes not saved (except in editor)\nGreat for config, item databases — reduces prefab duplication\nCommon Mistakes\nFind methods every frame — cache references\nString comparisons for tags — use CompareTag(\"Enemy\"), not tag == \"Enemy\"\nPhysics queries allocate — use NonAlloc variants: RaycastNonAlloc\nUI anchors wrong — stretches unexpectedly on different resolutions\nasync/await without context — use UniTask or careful error handling"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/unity",
    "publisherUrl": "https://clawhub.ai/ivangdavila/unity",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/unity",
    "downloadUrl": "https://openagent3.xyz/downloads/unity",
    "agentUrl": "https://openagent3.xyz/skills/unity/agent",
    "manifestUrl": "https://openagent3.xyz/skills/unity/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/unity/agent.md"
  }
}