unity_docs 详解:Unity MCP 官方文档检索工具的使用与源码原理
2026/9/14 23:45:33 网站建设 项目流程

unity_docs 详解:Unity MCP 官方文档检索工具的使用与源码原理

【免费下载链接】unity-mcpUnity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.项目地址: https://gitcode.com/GitHub_Trending/un/unity-mcp

unity_docs是 Unity MCP 的docs工具组中负责检索官方文档的核心工具,它从 docs.unity3d.com 拉取 ScriptReference、Manual 与包文档,并返回描述、参数详情、代码示例与注意事项。本文以 unity_docs 工具参考文档 为主体,结合 服务端实现、单元测试 与 技能手册,讲解其四种 Action、全部参数、返回结构、底层抓取与解析原理,并给出与unity_reflect配合的 API 验证工作流,帮助你准确、高效地为 AI 生成可靠的 Unity 代码。

工具定位与适用场景

unity_docs归属于docs工具组(group=docs),模块路径为services.tools.unity_docs,通过 Server/src/services/tools/unity_docs.py 中的@mcp_for_unity_tool装饰器注册到 MCP 服务(可在 manifest.json 中查看到它的注册声明)。

它的核心能力是:

从 docs.unity3d.com 获取 Unity 官方文档,返回描述(description)、参数详情(parameters)、代码示例(examples)与注意事项(caveats)。推荐在unity_reflect确认某个类型确实存在之后使用,用于在编写实现代码前获取用法模式、坑点与示例代码。

这里体现了两个关键定位:

  • unity_reflect互补unity_reflect通过运行时反射检查"编辑器里实际存在什么 API"(需要 Unity 连接),而unity_docs拉取"官方文档怎么说"(不需要 Unity 连接),两者构成"反射 > 项目资产 > 官方文档"的信任层级;
  • 面向写码前验证:避免 AI 在写 C# 时臆造或使用过时的 API 签名。

docs工具组是可选(opt-in)的,首次使用前需要通过manage_tools(action="activate", group="docs")激活,详见 workflows.md。

四种 Action 一览

unity_docs通过action参数区分四种操作,常量ALL_ACTIONS = ["get_doc", "get_manual", "get_package_doc", "lookup"]在源码中定义(见 unity_docs.py):

Action用途必填参数可选参数
get_doc获取某个类或成员的 ScriptReference 文档class_namemember_nameversion
get_manual获取 Unity Manual 页面slug(如execution-orderurp/urp-introductionversion
get_package_doc获取包文档packagepagepkg_version
lookup并行检索所有文档源(ScriptReference + Manual + 包文档),并支持批量查询queryqueriespackagepkg_versionversion

传入未知的action时,工具会返回success: false及提示信息Unknown action 'xxx'. Valid actions: ...,这一点有对应的单元测试覆盖(test_unknown_action_returns_error)。

get_doc:类与成员的 ScriptReference 文档

用于获取类(如PhysicsTransform)或类成员(如Physics.RaycastTransform.position)的脚本参考文档。内部会抓取对应 HTML 页面,并通过 HTML 解析器抽取结构化内容:description(描述)、signatures(方法签名列表)、parameters(参数表)、returns(返回值说明)、examples(C# 代码示例)。

get_manual:Manual 页面

通过页面 slug 获取 Unity 手册文章,例如脚本执行顺序execution-order、URP 介绍urp/urp-introduction。返回内容为文章标题(title)、按标题切分的章节(sections,每个章节含headingcontent)以及代码示例(code_examples)。

get_package_doc:包文档

获取某个安装包的 manual 文档,需要同时提供包名、页面与版本,例如:

unity_docs(action="get_package_doc", package="com.unity.render-pipelines.universal", page="2d-index", pkg_version="17.0")

缺少packagepagepkg_version三者中的任何一个都会直接返回错误(get_package_doc requires package, page, and pkg_version.)。

lookup:多源并行检索与批量查询

lookup是覆盖面最广的入口:一次调用同时搜索 ScriptReference、Manual,若提供了packagepkg_version还会搜索对应包文档。支持两种传参方式:

  • query:单个查询;
  • queries:逗号分隔的批量查询,例如queries='Physics.Raycast,NavMeshAgent,Light2D'一次调用即可全部检索。

一个值得注意的增强行为是:当查询涉及资源关键词(shader、material、texture、sprite、prefab、mesh、model、font 以及 lit/unlit/urp/hdrp/2d/3d 等)时,lookup还会自动检索当前 Unity 项目的资产(通过manage_assetsearchaction,需要 Unity 连接)。例如lookup(query="Lit shader")会同时返回官方文档命中和项目中匹配的 Shader/Material 资产。

参数参考

参数类型必填说明
actionstr要执行的文档操作:get_doc/get_manual/get_package_doc/lookup
class_namestr \| Noneget_doc 必填Unity 类名(如PhysicsTransform
member_namestr \| None要查询的方法或属性名
versionstr \| NoneUnity 版本(如6000.0.38f1),会自动提取 major.minor
slugstr \| Noneget_manual 必填Manual 页面 slug(如execution-order
packagestr \| Noneget_package_doc 必填;lookup 可选包名(如com.unity.render-pipelines.universal
pagestr \| Noneget_package_doc 必填包文档页面(如index2d-index
pkg_versionstr \| Noneget_package_doc 必填;lookup 可选包版本 major.minor(如17.0
querystr \| Nonelookup 单查询单个检索词(类名、主题或 slug)
queriesstr \| Nonelookup 批量逗号分隔的批量检索词(如Physics.Raycast,NavMeshAgent,Light2D

返回结构

所有操作统一返回一个包含 Unity 响应的dict,具体形状随 action 变化:

  • 成功找到文档时{"success": true, "data": {"found": true, ...}}
  • 404 未找到时success仍为true,但data.found = false,并附带suggestion提示下一步(如"用unity_reflect的 search 确认类型名后重试");
  • 网络不可达时{"success": false, "message": "Could not reach docs.unity3d.com: ..."}

get_docdata包含:urlclassmemberdescriptionsignaturesparametersreturnsexamplessee_alsoget_manual/get_package_docdata包含:foundurltitlesectionscode_exampleslookupdata则提供聚合视图:foundqueriesresults(每条查询一个结果对象,含queryhitssources_checked)以及summarytotal/found/missed统计)。

调用示例

以下示例来自 tools-reference.md:

# 获取类的 ScriptReference 文档 unity_docs(action="get_doc", class_name="Physics") unity_docs(action="get_doc", class_name="Physics", member_name="Raycast") unity_docs(action="get_doc", class_name="Transform", version="6000.0.38f1") # 获取 Manual 页面 unity_docs(action="get_manual", slug="execution-order") unity_docs(action="get_manual", slug="urp/urp-introduction") # 获取包文档 unity_docs(action="get_package_doc", package="com.unity.render-pipelines.universal", page="2d-index", pkg_version="17.0") # 单查询并行 lookup unity_docs(action="lookup", query="Physics.Raycast") # 批量 lookup(一次检索多个 API) unity_docs(action="lookup", queries="Physics.Raycast,NavMeshAgent,Light2D") # 带包文档的 lookup unity_docs(action="lookup", query="VolumeProfile", package="com.unity.render-pipelines.universal", pkg_version="17.0")

底层实现原理

版本号自动提取

传入的version(如6000.0.38f12022.3.45f16000.1.0b2)会先经过_extract_version归一化为major.minor6000.02022.36000.1),再拼接到文档 URL 中;空值或缺失则使用无版本号的 URL(见 unity_docs.py)。

URL 构造规则

  • 类文档:https://docs.unity3d.com/{version}/Documentation/ScriptReference/{Class}.html
  • 成员文档使用点分隔{Class}.{member}.html(如Physics.Raycast.html);
  • 属性文档使用短横线分隔(property 风格):{Class}-{member}.html(如Transform-position.html);
  • Manual:https://docs.unity3d.com/{version}/Documentation/Manual/{slug}.html
  • 包文档:https://docs.unity3d.com/Packages/{package}@{pkg_version}/manual/{page}.html

相关构造函数为_build_doc_url_build_property_url,均有单元测试验证 URL 形态(test_build_url_class_onlytest_build_property_url等)。

抓取与容错回退

抓取基于标准库urllib(请求头User-Agent: MCPForUnity/1.0,超时 10 秒),并通过asyncio.get_running_loop().run_in_executor放入线程池执行,避免阻塞事件循环(unity_docs.py)。抓取包含两级智能回退:

  1. 成员回退:成员用点分隔 URL 返回 404 时,自动改用属性风格的短横线 URL 重试(如Transform.positionTransform-position.html);
  2. 版本回退:带版本号的 URL 404 时,自动退回无版本 URL;get_manual同样支持该回退。

测试用例test_get_doc_property_fallbacktest_get_doc_version_fallbacktest_get_manual_version_fallback分别验证了这些路径。

HTML 解析器

针对两类页面使用了两套基于HTMLParser的自研解析器:

  • _UnityDocParser(ScriptReference):抽取 description、signatures、parameters、returns、examples。它同时兼容新旧两代 Unity 文档 HTML 结构——旧版类名name-collumn/desc-collumn和新版name lbl/desc都能正确解析参数表;方法签名既支持<pre>包裹的旧格式,也支持新版signature-CS内联文本(并会剥离 "Declaration" 前缀)(unity_docs.py);
  • _ManualPageParser(Manual / 包文档):按h1标题 +h2/h3章节 +p段落 +pre代码块切分为sectionscode_examples(unity_docs.py)。

两个解析器在 test_unity_docs.py 中都有基于真实 HTML 样本(含新旧格式)的断言测试。

lookup 的并发检索与项目资产联动

lookup的内部流程值得单独说明(unity_docs.py):

  1. 解析查询:若查询含.且不以com.开头(避免与包名混淆),自动拆分为class_name.member_name,例如Physics.Raycast拆为Physics+Raycast
  2. 构造并行任务:同时发起 ScriptReference 查询、原大小写 Manual 查询(如UIE-USS-Properties-Reference会保留原始大小写,同时尝试小写版本)、以及(可选)包文档查询;
  3. asyncio.gather并行执行,收集命中的hits(标注来源script_ref/manual/manual_lc/package/package_lc)与非致命errors
  4. 资源类查询联动项目资产:命中_ASSET_KEYWORDS时调用_search_assets,从查询中提取非停用词(如in/the/a/for/unity/using等会被过滤)构造*term*搜索模式,并依据关键词推断filter_type(如shaderShadermaterialMaterialtextureTexture2DspriteSpriteprefabPrefabmeshMeshfontFont),通过manage_assetsearchaction 并行检索Assets目录(每项pageSize=10,结果上限 15 条去重);
  5. 汇总统计:返回summary.total / found / missed,当存在未命中时会附上suggestion(建议改用get_doc精确类名、get_manual正确 slug,或manage_asset(action='search')检索 shader/material/prefab 等资源)。

_should_search_assets的判定在测试中也有覆盖:"Mesh2D shader""Lit material""URP 2D lighting""default sprite"触发资产搜索,而"Physics.Raycast""NavMeshAgent""execution-order"不触发。

与 unity_reflect 配合的标准工作流

Unity MCP 的技能手册给出了推荐的 API 验证四步流程(workflows.md),核心是"反射(运行时真实 API)> 项目资产 > 官方文档"的信任层级:

# Step 1: 检索所需类型 unity_reflect(action="search", query="NavMesh") # → 返回匹配类型:NavMeshAgent、NavMeshPath、NavMeshHit ... # Step 2: 获取类型成员摘要 unity_reflect(action="get_type", class_name="UnityEngine.AI.NavMeshAgent") # Step 3: 获取具体成员的完整签名 unity_reflect(action="get_member", class_name="NavMeshAgent", member_name="SetDestination") # → 返回参数类型、返回类型、全部重载 # Step 4: 用 unity_docs 获取官方文档与示例 unity_docs(action="get_doc", class_name="NavMeshAgent", member_name="SetDestination") # → 返回描述、签名、参数、代码示例

跨版本校验场景可以显式指定版本:

unity_docs(action="get_doc", class_name="Camera", member_name="main", version="6000.0.38f1")

CLI 方式调用

除 MCP 调用外,服务端 CLI 也提供了文档查询入口 Server/src/cli/commands/docs.py:

unity-mcp docs get Physics unity-mcp docs get Physics Raycast unity-mcp docs get NavMeshAgent SetDestination --version 6000.0

其中class_name为必填位置参数,member_name可选,--version/-v指定 Unity 版本,输出格式跟随全局配置(--format)。

测试验证与可靠性

Server/tests/test_unity_docs.py 对工具做了系统性验证,可作为理解行为的依据:

  • 纯函数测试:版本提取(完整版本、LTS、beta、空值、短版本)、URL 构造(类 / 成员点分隔 / 属性短横线 / 无版本);
  • 解析器测试:新旧两代 HTML 格式的 description、signatures、parameters、returns、examples 抽取,以及空 HTML 的健壮性;
  • 动作层测试:未知 action 报错、必填参数校验、成功路径、404 未找到(含 suggestion)、属性回退、版本回退、网络错误(Could not reach);
  • lookup 测试:单查询、批量查询(Physics,Camera,zzz-nonexistent得到found=2 / missed=1)、无结果建议、资产关键词检测与搜索词构造。

常见问题与排查建议

  • 返回found: false:优先确认类名/成员名/slug 拼写。get_doc的 suggestion 会提示先用unity_reflectsearch核实类型名;get_manual的 suggestion 会提示常见 slug 如execution-orderurp/urp-introductionUIE-USS-Properties-Referenceget_package_doc的 suggestion 会提示核对包名、版本与页面(常见页面indexinstallationwhats-new)。
  • 返回success: false且提示无法连接:说明网络无法访问 docs.unity3d.com,此时lookup中依赖 Unity 连接的资源搜索部分也会降级跳过(_search_assets内部捕获ImportError与异常并返回None)。
  • lookup部分查询未命中:查看summary中的missed与每条resultshits/sources_checked,再按 suggestion 改用精确的get_doc/get_manual或项目资产搜索。
  • 想查属性而非方法get_doc的成员回退会自动处理点/短横线两种 URL;直接写member_name="position"即可。
  • 资源类查询想同时看项目资产:使用lookup并让查询包含shadermaterialtexture等关键词,但注意该联动需要当前会话具备 Unity 连接。

总而言之,unity_docs是 Unity MCP 文档验证链路的"官方依据"环节:它不依赖 Unity 编辑器即可使用,覆盖面横跨 ScriptReference、Manual 与包文档,并通过并行 lookup、自动回退、资产联动等机制,把"查文档"这件事从一次笨拙的单页抓取变成了面向 LLM 的结构化检索能力,是写码前校验 API 事实的关键一环。

【免费下载链接】unity-mcpUnity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.项目地址: https://gitcode.com/GitHub_Trending/un/unity-mcp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询