ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Unity MCP 场景对象检索实战:深入解析 find_gameobjects 工具的多维搜索与分页机制

Unity MCP 场景对象检索实战:深入解析 find_gameobjects 工具的多维搜索与分页机制 Unity MCP 场景对象检索实战深入解析 find_gameobjects 工具的多维搜索与分页机制【免费下载链接】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导读find_gameobjects是 Unity MCP 中面向场景对象查找场景的专用搜索工具允许 LLM/AI 助手按名称、标签、图层、组件类型、层级路径或实例 ID 六种方式检索场景中的 GameObject并以分页形式仅返回轻量级的实例 ID 列表。本文以该项目官方工具参考文档为主体结合 服务端实现 与 Unity 编辑器侧实现 的源码细节完整讲解其参数语义、六种搜索方式的底层行为、分页游标约定、返回值结构以及与 GameObject 资源mcpforunity://scene/gameobject/{id}和manage_gameobject的职责分工帮助读者在 Unity MCP 自动化工作流中正确、高效地完成先定位、再读取、后操作的完整链路。1. 工具定位轻量搜索拒绝大载荷find_gameobjects被设计为聚焦型搜索工具focused search tool。与manage_gameobject创建/修改/删除和 GameObject 资源读取完整数据不同它的唯一职责是在场景中找出符合条件的 GameObject并只返回它们的实例 ID 列表。这一设计动机在服务端与编辑器侧的文档注释中均有明确说明返回仅含实例 ID 可以最小化传输载荷minimize payload size避免在一次搜索中把大量对象的完整数据塞进 MCP 响应参见 find_gameobjects.py 中的模块与函数文档 和 FindGameObjects.cs 的类注释。其定位可总结为能力工具/资源说明搜索并返回实例 IDfind_gameobjects分页、轻量、只读搜索读取单个对象完整数据mcpforunity://scene/gameobject/{id}名称、标签、图层、Transform、组件类型列表读取全部组件含属性mcpforunity://scene/gameobject/{id}/components分页支持读取单个组件mcpforunity://scene/gameobject/{id}/component/{name}完整属性序列化创建/修改/删除对象manage_gameobjectCRUD 操作职责边界如果目标是改对象不要用find_gameobjects直接走manage_gameobject如果目标是查对象的详细信息find_gameobjects只负责第一步拿 ID后续数据通过资源 URI 获取。这一协作关系在资源文档资源mcpforunity://scene/gameobject-api见 gameobject.py中被明确描述为find_gameobjects → resources的两步工作流。2. 参数详解schema、默认值与类型宽松化官方工具参考文档给出了五个参数的元信息结合服务端源码可得到完整语义参数类型必填默认值说明search_termstr是无要搜索的值名称、标签、图层名、组件类型或路径search_methodLiteral[by_name, by_tag, by_layer, by_component, by_path, by_id]否by_name搜索方式include_inactivebool \| str \| None否None→False是否包含未激活对象page_sizeint \| str \| None否None→50每页结果数默认 50最大 500cursorint \| str \| None否None→0分页游标下一页偏移量0 基2.1search_term唯一必填参数服务端在进入任何 I/O 之前会先做必填校验——如果search_term为空直接返回错误提示find_gameobjects.py。编辑器侧同样要求searchTerm或兼容旧版命名的target至少提供一个FindGameObjects.cs因此早期集成中使用target的调用方依然可以工作。2.2 类型宽松化coercioninclude_inactive、page_size、cursor三个参数都允许传入字符串或数字。服务端在发送给 Unity 之前通过coerce_bool/coerce_int统一转换include_inactive coerce_bool(include_inactive, defaultFalse) page_size coerce_int(page_size, default50) cursor coerce_int(cursor, default0)find_gameobjects.py这意味着 LLM 调用时写成true、10这类字符串也会被正确归一化。这一行为在集成测试中被专门覆盖test_find_gameobjects_boolean_coercion验证include_inactivetrue会被转换为布尔True并写入请求参数test_find_gameobjects.pytest_find_gameobjects_pagination_params验证字符串形式的page_size10、cursor20被转换为整数同上 L84-L120。2.3 发送到 Unity 的参数命名服务端组装请求时统一使用 camelCase 参数名发送给编辑器params { searchMethod: search_method, searchTerm: search_term, includeInactive: include_inactive, pageSize: page_size, cursor: cursor, }find_gameobjects.py其中None值会被过滤掉3. 六种搜索方式底层实现与行为差异编辑器侧GameObjectLookup.SearchGameObjects是搜索的核心实现GameObjectLookup.cs六种方式各有其底层行为与限制3.1by_name精确名称匹配遍历场景中所有对象按go.name name做完全相等匹配非模糊/子串匹配见 SearchByName。同名对象会全部返回。3.2by_tag标签匹配默认调用 Unity 的GameObject.FindGameObjectsWithTag(tag)当include_inactiveTrue时需要手动遍历全部对象并CompareTag因为 Unity 的标签查找 API 不会命中未激活对象SearchByTag。若标签不存在会抛出UnityException并被捕获后静默返回空结果。3.3by_layer图层匹配名称或数字search_term既可以传图层名称通过LayerMask.NameToLayer解析也可以直接传 0~31 的图层编号SearchByLayer。非法图层名或越界编号不会报错只会返回空列表。3.4by_component组件类型匹配search_term传组件类型名如Camera、Rigidbody。类型解析委托给UnityTypeResolver.ResolveComponent会在已加载的程序集中查找类型FindComponentType。若类型找不到会写入一条警告日志并返回空结果。匹配使用GetComponent(componentType)即该组件只需存在即可命中SearchByComponent。3.5by_path层级路径匹配路径使用/分隔的层级结构如Canvas/Panel/Button。匹配规则为全路径相等或以/路径结尾MatchesPath因此支持相对后缀路径。这里有一个值得注意的 Unity API 限制处理SearchByPathPrefab Stage预制体编辑模式下GameObject.Find(path)不可用改用GetAllSceneObjects手动遍历并做路径匹配普通场景下、且include_inactiveFalse直接调用GameObject.Find(path)但该 API只能找到激活对象include_inactiveTrue退化为手动遍历全部对象匹配路径。3.6by_id实例 ID 直接解析search_term传整数形式的实例 ID通过InstanceIDToObjectCompat解析为对象若对象存在且满足激活条件则返回该 IDById 分支。这是六种方式中唯一精确命中单个对象的搜索。3.7 共同底座GetAllSceneObjects除by_id与默认路径分支外多数搜索都依赖GetAllSceneObjects遍历场景GetAllSceneObjects。它有两个来源Prefab Stage使用PrefabStageUtility.GetCurrentPrefabStage()的prefabContentsRoot作为根普通场景使用SceneManager.GetActiveScene().GetRootGameObjects()逐层深度优先遍历GetObjectAndDescendants。因此find_gameobjects在预制体编辑模式下同样可用且include_inactiveFalse时遍历过程会跳过未激活子树if (!includeInactive !obj.activeInHierarchy) yield break;。4. 分页机制page_size、cursor与游标语义4.1 统一的分页契约编辑器侧使用标准的PaginationRequest/PaginationResponseTPagination.cs它与场景中其他分页工具如组件资源分页保持一致。请求端PaginationRequest.FromParamsPagination.cs同时接受page_size与pageSize两种命名游标同时接受cursor0 基与page_number/pageNumber1 基自动换算为(pageNumber - 1) * pageSize默认PageSize 50。响应端PaginationResponseT.CreatePagination.cs游标越界会被钳制到[0, totalCount]计算nextCursor还有下一页时为endIndex否则为nullHasMore直接由NextCursor.HasValue推导。4.2 编辑器侧的强制上限FindGameObjects.HandleCommand在解析分页后会用Mathf.Clamp(pagination.PageSize, 1, 500)把每页大小钳制在1~500之间FindGameObjects.cs与 Python 侧 schema 中默认 50、最大 500的声明一致。4.3 返回值结构成功时find_gameobjects返回{ success: true, message: Found GameObjects, data: { instanceIDs: [12345, 67890], pageSize: 50, cursor: 0, nextCursor: 50, totalCount: 132, hasMore: true } }字段说明对应 FindGameObjects.cs 与 Pagination.cs字段含义instanceIDs本页命中的实例 ID 列表pageSize本页实际大小cursor当前页游标0 基nextCursor下一页游标null表示已到末页totalCount全部命中数跨页总计hasMore是否还有下一页服务端拿到 Unity 响应后会透传message与data字段find_gameobjects.py异常路径统一返回{success: false, message: ...}。4.4 翻页示例# 第一页 page1 find_gameobjects(search_termEnemy, search_methodby_tag, page_size50) # page1[data][nextCursor] 50, hasMore True # 第二页把上一页的 nextCursor 作为 cursor 传入 page2 find_gameobjects(search_termEnemy, search_methodby_tag, page_size50, cursorpage1[data][nextCursor])5. 与 GameObject 资源的协同ID 即索引工具文档明确指出拿到实例 ID 后用资源 URI 读取详细数据。项目提供三个参数化资源gameobject.py资源 URI返回内容mcpforunity://scene/gameobject/{id}基本数据instanceID、name、tag、layer、layerName、active、isStatic、transform、parent、children、componentTypes、pathmcpforunity://scene/gameobject/{id}/components全部组件完整属性序列化支持page_size默认 25、cursor、include_properties分页参数mcpforunity://scene/gameobject/{id}/component/{name}指定类型名的单个组件如.../component/Camera官方示例见 gameobject.py 中的资源文档mcpforunity://scene/gameobject/-81840 mcpforunity://scene/gameobject/-81840/components mcpforunity://scene/gameobject/-81840/component/Camera推荐的标准三步工作流项目 Skill 文档中的 Resource-First Workflow见 unity-mcp-skill/SKILL.md1. Check editor state → mcpforunity://editor/state 2. Understand the scene → mcpforunity://scene/gameobject-api 3. Find what you need → find_gameobjects 或 resources 4. Take action → manage_gameobject / create_script / script_apply_edits ... 5. Verify results → read_console, manage_camera(actionscreenshot), resources实践建议Skill 模板提示SKILL.md模板示例可能因 Unity 版本、UGUI/TMP/Input System 等包配置而异在使用任何工具修改目标之前先通过资源和find_gameobjects校验目标与组件是否存在并把名称、枚举值视为需适配的占位符。6. 实战调用模式6.1 六种搜索方式快速对照# 按名称精确匹配 find_gameobjects(search_termPlayer, search_methodby_name) # 按标签 find_gameobjects(search_termEnemy, search_methodby_tag) # 按图层名称或编号 0~31 find_gameobjects(search_termUI, search_methodby_layer) find_gameobjects(search_term5, search_methodby_layer) # 按组件类型 find_gameobjects(search_termCamera, search_methodby_component) find_gameobjects(search_termRigidbody, search_methodby_component) # 按层级路径支持后缀相对路径 find_gameobjects(search_termCanvas/Panel/Button, search_methodby_path) # 按实例 ID find_gameobjects(search_term-81840, search_methodby_id)语法模板对齐 unity-mcp-skill/references/tools-reference.md6.2 包含未激活对象find_gameobjects(search_termHiddenTrigger, search_methodby_name, include_inactiveTrue)注意开启后by_tag/by_path会从 Unity 原生 API 退化为手动遍历见第 3 节属于正常行为而非缺陷。6.3 用batch_execute批量发现推荐项目 Skill 明确建议用batch_execute一次性发起多个find_gameobjects搜索避免逐次往返SKILL.mdbatch_execute(commands[ {tool: find_gameobjects, params: {search_term: Camera, search_method: by_component}}, {tool: find_gameobjects, params: {search_term: Player, search_method: by_tag}}, {tool: find_gameobjects, params: {search_term: GameManager, search_method: by_name}} ])单批默认上限 25 条命令可在 Unity MCP Tools 窗口调整最大 100依赖型操作建议加fail_fastTrueSKILL.md。6.4 典型工作流搜索 → 读取 → 修改# 1) 定位 result find_gameobjects(search_termEnemy, search_methodby_tag, page_size50) ids result[data][instanceIDs] # 2) 读取第一个目标的详细信息 detail read_resource(mcpforunity://scene/gameobject/{0}.format(ids[0])) # 3) 按需修改CRUD 走 manage_gameobject manage_gameobject(actiondelete, instance_idids[0])7. 验证与一致性保障该工具的契约由服务端集成测试锁定Server/tests/integration/test_find_gameobjects.pytest_find_gameobjects_basic_search验证命令名find_gameobjects与参数searchTerm/searchMethod的正确透传test_find_gameobjects_by_component组件搜索参数传递test_find_gameobjects_pagination_params字符串型分页参数转为整数test_find_gameobjects_boolean_coercion字符串布尔转Truetest_find_gameobjects_by_layer/by_path对应搜索方式透传。此外test_tool_signatures_paging.py、test_tool_annotations.py与test_cli.py也覆盖了该工具的分页签名与注解元数据。工具声明为readOnlyHintFalse、destructiveHintFalse、idempotentHintTruefind_gameobjects.py——之所以不是只读是因为前置的preflight(refresh_if_dirtyTrue)在场景较脏时可能触发资源刷新与域重载这是使用该工具时需要考虑的轻微副作用同样见 preflight 调用。8. 常见问题与排查要点现象原因与对策by_name搜不到模糊名称该方式为精确相等匹配改用by_tag/by_component或枚举具体名称未激活对象搜不到显式传include_inactiveTrue注意by_tag、by_path会切换为手动遍历by_layer返回空图层名拼写错误或编号越界合法范围 0~31可先用编号重试by_component返回空组件类型名未找到编辑器会记录Component type xxx not found警告检查完整类型名by_path在 Prefab 模式下失效已内置 Prefab Stage 兼容处理如仍异常请确认search_term与预制体层级根路径一致结果被截断默认每页 50、上限 500用nextCursor翻页或调大page_size9. 参考文件索引工具官方文档website/docs/reference/tools/core/find_gameobjects.md由tools/generate_docs_reference.py自动生成勿手改examples块服务端实现Server/src/services/tools/find_gameobjects.py编辑器侧实现MCPForUnity/Editor/Tools/FindGameObjects.cs搜索核心逻辑MCPForUnity/Editor/Helpers/GameObjectLookup.cs分页契约MCPForUnity/Editor/Helpers/Pagination.cs关联资源实现Server/src/services/resources/gameobject.py集成测试Server/tests/integration/test_find_gameobjects.py使用模板unity-mcp-skill/SKILL.md、unity-mcp-skill/references/tools-reference.md、unity-mcp-skill/references/workflows.md【免费下载链接】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),仅供参考
返回列表