FEATURED · 精选文章

Unity MCP 的 `docs` 工具组:`unity_docs` 与 `unity_reflect` 双工具文档查询实战

发布时间 / 2026/9/14 20:57:35
来源 / 创域科博编辑部
栏目 / 资讯中心
Unity MCP 的 `docs` 工具组:`unity_docs` 与 `unity_reflect` 双工具文档查询实战 Unity MCP 的docs工具组unity_docs与unity_reflect双工具文档查询实战【免费下载链接】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-mcpdocs是 Unity MCP 为 AI 助手提供的官方文档查询与实时 API 校验工具组由 unity_docs抓取 docs.unity3d.com 官方文档与 unity_reflect通过反射检查 Unity 编辑器当前加载的 C# API两个工具组成。本文以 docs 工具组索引 为骨架结合服务端 Python 实现与编辑器端 C# 实现完整讲解两个工具的 Action、参数、返回结构与源码级工作原理并给出“先反射校验、再拉取文档”的标准工作流帮助开发者在编写 Unity C# 代码时消除训练数据过时导致的 API 误用。docs工具组是什么按照 工具组索引 的定义docs工具组的定位是Unity API reflection and documentation lookup即“Unity API 反射与文档查询”。该组包含两个工具职责互补工具职责数据来源unity_docs拉取 Unity 官方文档docs.unity3d.comScriptReference、Manual、包文档unity_reflect反射检查 Unity 运行时已加载的 C# API当前 Unity 编辑器进程内已加载的程序集一个管“官方怎么说”一个管“当前编辑器里到底有没有、签名是什么”。二者的配合关系在unity_docs的官方描述中写得很清楚先用unity_reflect确认类型真实存在再用unity_docs获取用法模式、注意事项与代码示例然后才动手写实现代码。unity_docs拉取 Unity 官方文档unity_docs在服务端的实现位于 Server/src/services/tools/unity_docs.py通过mcp_for_unity_tool装饰器注册groupdocs并声明了readOnlyHintTrue、destructiveHintFalse即只读、无破坏性。支持的四种 Actionunity_docs共支持四种动作源码中以ALL_ACTIONS [get_doc, get_manual, get_package_doc, lookup]定义见 unity_docs.pyget_doc抓取 ScriptReference 中某个类或成员的文档。必填class_name可选member_name、version。例如查Physics.Raycast或只查Transform类本身。get_manual抓取 Unity Manual 手册页面。必填slug页面路径如execution-order、urp/urp-introduction可选version。get_package_doc抓取包Package文档。必填package、page、pkg_version三个参数。例如packagecom.unity.render-pipelines.universal、page2d-index、pkg_version17.0。lookup并行搜索全部文档来源ScriptReference Manual 包文档。必填query或queries逗号分隔支持批量查询例如queriesPhysics.Raycast,NavMeshAgent,Light2D一次调用搜索三个主题可选package与pkg_version追加包文档搜索。完整参数表以下是 unity_docs 参考页 列出的全部参数参数类型必填说明actionstr是要执行的文档动作四种之一class_namestr \| None—Unity 类名如Physics、Transformmember_namestr \| None—要查询的方法或属性名versionstr \| None—Unity 版本如6000.0.38f1会自动提取slugstr \| None—Manual 页面 slug如execution-orderpackagestr \| None—包名如com.unity.render-pipelines.universalpagestr \| None—包文档页面如index、2d-indexpkg_versionstr \| None—包版本号 major.minor如17.0querystr \| None—lookup的单个搜索词类名、主题或 slugqueriesstr \| None—lookup的批量搜索词逗号分隔如Physics.Raycast,NavMeshAgent,Light2D源码级实现细节版本号自动提取version参数并非要求精确的完整版本号源码中的_extract_version函数会自动从完整版本字符串中提取major.minor见 unity_docs.py6000.0.38f1 - 6000.0 2022.3.45f1 - 2022.3 6000.1.0b2 - 6000.1这保证了 URL 构造时使用docs.unity3d.com/6000.0/Documentation/...这类精简版本路径即可命中对应版本的文档。URL 构造与双重降级回退get_doc的 URL 构造遵循 Unity 文档的两种命名约定见 unity_docs.py方法点分隔ScriptReference/{Class}.{Member}.html属性短横线分隔ScriptReference/{Class}-{Member}.html抓取时若命中 404会依次执行两级降级回退见 unity_docs.py成员命名回退方法 URL点分隔404 时尝试属性 URL短横线分隔版本回退带版本号的 URL 404 时回退到不带版本号的 URL。get_manual同样内置版本回退带版本的 Manual URL 404 时会尝试无版本 URL见 unity_docs.py。最终仍然 404 时工具不会直接报错而是返回found: false并附带排查建议如核对 slug 与 Manual 页面 URL 路径是否一致常见 slug 包括execution-order、urp/urp-introduction、UIE-USS-Properties-Reference。HTML 解析兼容新旧两代官方文档结构unity_docs内置两个 HTML 解析器全部基于 Python 标准库html.parser实现无需第三方爬虫依赖_UnityDocParser见 unity_docs.py解析 ScriptReference 页面提取description描述、signatures签名列表、parameters参数名与说明、returns返回值说明、examples代码示例。它同时兼容旧版文档h2标题、name-collumn/desc-collumn表格类名、pre内签名与新版文档h3标题、signature-CS、name lbl/desc类名、行内签名相关兼容逻辑与测试样本可见 test_unity_docs.py。_ManualPageParser见 unity_docs.py解析 Manual 与包文档这类文章型页面按h1标题、h2/h3小节标题、段落与pre代码块组织成sections与code_examples。lookup并行搜索 项目资产智能联动lookup是功能最强大的动作其内部实现见 unity_docs.py值得展开查询拆分自动把Physics.Raycast拆成class_namePhysicsmember_nameRaycast并行任务同时发起 ScriptReference 查询、Manual 查询原始大小写 小写兜底若提供了package/pkg_version还会并行查询包文档全部通过asyncio.gather并发执行结果聚合汇总所有命中来源script_ref、manual、manual_lc、package、package_lc统计total/found/missed资产智能联动如果查询词命中内置的关键词表shader、material、texture、sprite、prefab、mesh、font 等见 unity_docs.py且当前上下文存在 Unity 连接还会自动调用manage_asset在项目Assets目录下并行搜索同名资源把项目内资产一并纳入结果最多返回 15 条以避免超大响应未命中建议存在未命中查询时返回的建议会引导用户改用get_doc精确类名、get_manual正确 slug或manage_asset(actionsearch)针对 shader、material、prefab 等资源。返回结构unity_docs的所有动作返回dict统一遵循 Unity MCP 的响应约定success标记整体成败data中found标记是否命中。get_doc命中时data包含url、class、member、description、signatures、parameters、returns、examples、see_also等字段Manual/包文档命中时包含url、title、sections、code_examples。网络不可达无法访问 docs.unity3d.com时返回success: false与错误消息。unity_reflect反射检查当前编辑器的 C# APIunity_reflect与unity_docs的最大区别在于它不访问任何外部网站而是把命令通过 Unity MCP 传输层发送给编辑器由编辑器端 C# 代码通过 .NET 反射直接查询当前进程内已加载的程序集。其设计初衷在描述中写得很直白训练数据可能错误或过时写 C# 代码前先用反射验证类、方法、属性是否真实存在。服务端参数校验服务端实现位于 Server/src/services/tools/unity_reflect.pyALL_ACTIONS [get_type, get_member, search]。它负责参数校验与实例路由通过get_unity_instance_from_context解析目标 Unity 实例再把unity_reflect命令经传输层转发给编辑器参数类型必填说明actionstr是反射动作get_type、get_member、searchclass_namestr \| None—完全限定名或简写 C# 类名member_namestr \| None—要检查的方法、属性或字段名querystr \| None—类型名搜索词scopestr \| None—搜索的程序集范围unity、packages、project、all参数校验规则get_type必须提供class_nameget_member必须同时提供class_name与member_namesearch必须提供query。scope仅对search生效且必须在VALID_SCOPES [unity, packages, project, all]之内否则返回参数错误。编辑器端实现UnityReflect.cs真正执行反射的是编辑器端工具 MCPForUnity/Editor/Tools/UnityReflect.cs注册为[McpForUnityTool(unity_reflect, AutoRegister false, Group docs)]即默认不自动注册、归属于docs组。三个动作的实现要点如下get_type类的成员总览返回某个类的成员摘要仅名称列表包括命名空间、程序集、基类、接口列表、抽象/密封/静态/枚举/接口标记以及按字母序排序的methods、properties、fields、events四类成员名外加extension_methods扩展方法名与obsolete_members已过时成员名。实现上有两个值得注意的设计短名歧义检测传入无命名空间的短类名如Button且存在多个同名类型时不直接猜测而是返回ambiguous: true与所有候选的FullName列表并提示使用完全限定名如UnityEngine.UI.Button消歧见 UnityReflect.cs开放泛型保护对ListT这类开放泛型定义反射成员会触发 Mono 在 Unity 2021.3 上的崩溃因此只返回最小安全信息并提示“开放泛型请查阅文档获取成员详情”见 UnityReflect.cs。get_member单个成员的完整签名按顺序尝试方法、属性、字段、事件、扩展方法五种解析路径方法返回所有重载overload_count与overloads数组每个重载包含完整签名含static、ref、out、params前缀与泛型参数、返回类型、参数列表含默认值与是否params、是否虚方法/抽象/泛型、是否过时及过时消息属性返回属性类型、可读可写标记、是否静态、是否过时、声明类型字段返回字段类型、是否静态/只读/常量常量直接给出值、是否过时事件返回事件处理器类型、是否过时扩展方法作为兜底路径扫描 UnityEngine/UnityEditor/Unity. 前缀程序集中的静态扩展类按“第一个参数类型可赋值/继承/泛型匹配”规则匹配扩展方法。get_member使用不含DeclaredOnly的反射标志因此能查到继承自基类的成员见 UnityReflect.cs。search跨程序集类型名搜索在全部已加载程序集通过UnityAssembliesCompat.GetLoadedAssemblies()获取并按程序集全名缓存中执行三类匹配按优先级排序后最多返回 25 条见 UnityReflect.cs名称精确匹配优先级 0名称前缀匹配优先级 1名称包含匹配优先级 2含完全限定名包含匹配。scope决定扫描范围见 UnityReflect.csscope匹配范围unity以UnityEngine、UnityEditor、Unity.开头的程序集packages排除System、mscorlib、netstandard之外的所有程序集project仅项目脚本程序集Assembly-CSharp、Assembly-CSharp-Editor及 firstpass 变体all全部已加载程序集结果项附带is_class、is_enum、is_interface、is_struct类型标记与namespace、assembly信息超过 25 条时置truncated: true。此外编辑器端在 Unity 编译期间会拒绝反射请求返回“请等待域重载完成”并在程序集重载后自动失效类型缓存AssemblyReloadEvents.afterAssemblyReload InvalidateCache保证反射结果永远对应最新的代码状态。标准工作流先反射校验再查官方文档两个工具的正确协作方式可以归纳为一条“三步工作流”这也是unity_docs描述中明确推荐的使用范式确认 API 存在调用unity_reflect的search不确定类名时或get_type/get_member确定类名时验证目标类、方法、属性在当前编辑器版本中真实存在并拿到准确签名——避免 LLM 训练数据中的旧 API、拼写错误或命名空间误差拉取官方用法调用unity_docs的get_doc精确到类或成员、get_manual概念性手册或get_package_docURP 等包文档获取权威描述、参数含义、返回值语义、注意事项与官方代码示例批量覆盖需要同时查询多个主题时用lookup一次调用批量检索Physics.Raycast,NavMeshAgent,Light2D这类逗号分隔查询快速获得多来源命中结果。例如要写一段Physics.Raycast的代码可以先unity_reflect: actionget_member, class_namePhysics, member_nameRaycast拿到真实重载签名参数类型、默认值、可选参数再unity_docs: actionget_doc, class_namePhysics, member_nameRaycast, version6000.0.38f1获取该 API 的描述、参数表、返回值说明与官方代码示例最后据此生成准确、可编译的实现代码。若get_doc返回found: false其内置建议会引导回到unity_reflect的search动作核对类型名再重试形成完整的闭环。工具组注册与启用从测试文件 test_unity_reflect.py 可以确认两点docs工具组存在于TOOL_GROUPS注册表中test_docs_group_existsdocs组不在默认启用的工具组列表DEFAULT_ENABLED_GROUPS中test_docs_group_not_in_defaults。也就是说这两个工具默认不随服务器启动自动开放需要按项目文档启用对应工具组后才可用。它们均为只读工具readOnlyHintTrue不修改任何场景或资产可放心纳入 AI 助手的工作流。相关工具组的完整启用方式可参考 工具分组指南 与 CLI 参考。小结docs工具组用两个互补工具解决了 AI 写 Unity 代码时的“信息真实性”问题unity_reflect以当前编辑器进程内的反射结果为准提供“它现在到底长什么样”的权威答案unity_docs以官方文档站点为准提供“它应该怎么用”的完整参考。二者的参考文档页面unity_docs.md、unity_reflect.md由 tools/generate_docs_reference.py 从 Python 工具注册表自动生成与源码保持同步读者可直接在仓库中继续查阅这两个页面及其对应的服务端、编辑器端源码与测试以掌握完整的行为细节。【免费下载链接】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),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻