内容
<div align="center">
<img src="assets/gamebrew-logo.svg" alt="Gamebrew" width="118" height="118" />
# Gamebrew
### 让 AI 代理在您构建 Unity 游戏时进行游戏测试。
Gamebrew 是一个 **Unity MCP**,它将 AI 代理作为实际的游戏测试者插入您的游戏开发循环中。
它们驱动一个正在运行的 Unity 编辑器 - 控制玩家,围绕物体旋转以检查,捕获看到的内容,
读取实时场景状态,运行测试 - 以便在您开发时使 bug 和粗糙的边缘浮现出来。
一个环回 HTTP 端口。无需云服务,无需账户,无需 SDK 锁定。





<sub>Unity 编辑器 ⇄ MCP ⇄ 您的代理 - 从任何 Unity 6 项目中创建一个游戏测试者。</sub>
</div>
---
## ✨ 代理可以执行的操作
| | |
|---|---|
| 🚶 **移动和导航** | 控制玩家,通过 NavMesh 路径到达任何对象 |
| 👁 **查看和旋转** | 定位相机,围绕物体旋转自由相机以检查 |
| 📸 **查看** | 将游戏视图捕获到 PNG,代理然后读取 |
| 🔍 **检查** | 转储任何实时组件的私有字段到 JSON;读取场景树 |
| ⌨️ **交互** | 在 Play 模式下发送输入系统键盘/鼠标 |
| 🧪 **测试** | 运行编辑模式测试,门控编译 |
| 🧩 **扩展** | 添加您自己的 `play.*` 动词 - 自动允许列出,一个 `case` 即可 |
| 🎟️ **安全共享** | 租赁调度器允许多个代理轮流使用一个编辑器 |
## 🚀 快速入门
两个部分:**Unity 编辑器桥** 和 **Node MCP 服务器** 您的代理与之通信。
**1 · Unity** - 将 [`unity-package/`](#install--the-unity-half) 放入您的项目中,安装两个
UPM 包(输入系统 + Newtonsoft JSON),然后 **工具 → Unity 桥 → 启动**。
**2 · MCP**
```bash
cd mcp && npm install
```
将您的 MCP 客户端(Claude,Cursor,...)指向 `mcp/src/index.mjs` - [以下配置](#install--the-mcp--node-half).
**3 · 驱动它** - 进入 Play 模式,然后:
```bash
cd mcp
./browse.sh my-agent play.navTo '{"target":"Environment/Player","standoff":2}'
./browse.sh my-agent play.orbitView '{"target":"Environment/Player","pitch":18,"yaw":45,"distance":2.5}'
./browse.sh my-agent capture shot # → 读取打印的 PNG 路径以查看它
```
您的代理现在正在您的游戏中四处移动。
## 🧠 为什么选择 Gamebrew
- **自我托管和微型** - ~20 编辑器 C# 文件 + 一个 Node 服务器。无需云服务,无需账户,仅限环回。
- **代理原生** - 说 [MCP](https://modelcontextprotocol.io),因此它可以直接插入 Claude,Cursor 或任何 MCP 客户端作为 `bridge_*` 工具。
- **多代理设计** - 协作租赁允许多个代理共享一个编辑器而不会使世界脱同步。
- **默认安全** - 默认拒绝允许列表将浏览代理限制在游戏玩法 + 检查;生命周期归您所有。
- **您可以扩展** - 游戏特定动词距离一个 `case` 很近,移动层位于干净,可子类化的缝隙后面。
## 🤖 对于 AI 代理
自己驱动 Gamebrew?阅读 **[`AGENTS.md`](AGENTS.md)** - 有效使用手册,以代理命令样式编写。
三个最重要的规则:
1. **通过捕获和读取 PNG 来查看**;对于任何数字化的内容,请信任 `dump` 而不是截图 -
一个昏暗的帧会说谎,实时的组件字段不会。
2. **旋转物体来判断它们。** 一个正面的 `capture` 隐藏了轮廓 - 而 `play.orbitView`
编写 `Logs/orbit.png`(一个自由相机),*不是* 普通 `capture` 读取的内容。 使用 `orbit` 动词。
3. **轮流并释放。** 获取租赁,驱动,释放 - 永远不要独占它。
完整的循环,复制粘贴命令模式和症状→修复表都在 [`AGENTS.md`](AGENTS.md) 中。
## 组织一个游戏测试团队(推荐,可选)
Gamebrew 不对您的代理堆栈持任何意见 - 但这里有一个结构适用于
AI 辅助游戏测试。这是工具被测试的方式:一个协调器加上两个浏览
专家在运行游戏中找到真正的游戏玩法 + 视觉错误。
| 角色 | 是否驱动桥? | 工作 |
|---|:--:|---|
| **协调器** | 直接,`:8787` | 拥有 **生命周期** - 进入/退出 Play 模式,加载场景,运行测试,应用修复 - 并 **合成 + 验证** 发现。 永远不要让浏览代理执行生命周期。 |
| **游戏测试代理** | 租赁窗口,`:8788` | 评估游戏玩法 **逻辑 · 易读性 · 边缘**:新玩家能否分辨出该怎么做?交互是否可读?是否有软锁定或漏洞? |
| **视觉/技术艺术代理** | 租赁窗口,`:8788` | 评估 **轮廓 · 材质 · 照明 · HUD** 与您的艺术圣经相比 - 围绕物体旋转,转储材质状态。 |
| **实现代理(s)** | 否 | 修复确认的内容(编辑代码);协调器重新验证并重新浏览以证明修复。 |
**循环**
1. 协调器进入 Play 模式并调度浏览专家 - **每个租赁回合**
(一个游戏世界 = 一个驱动程序一次)。
2. 每个代理运行浏览循环:`获取 → 导航/旋转/捕获/转储 → 报告 → 释放`。
3. 协调器 **验证** 每个发现与代码或捕获之前的行为 - 代理
可能不正确(在测试中,一个轨道 *驳斥*了一个“普通桌子”的裁决,该裁决来自一个糟糕的正面角度)。确认,不要信任。
4. 实现者修复确认的内容;协调器重新编译并重新浏览以证明修复。
5. **感觉是人类的。** 代理人解决 *可理解* 和 *正确* 的问题;“是否看起来/感觉良好”的问题由您解决。
从小开始 - 一个协调器 + 一个游戏测试者已经很有用;当艺术
很重要时添加视觉代理,并扩展到一个完整的团队进行深入评估。每个代理的驱动规则都在
[`AGENTS.md`](AGENTS.md) 中。
---
## 架构
两个部分。 Unity 编辑器端托管一个 HTTP 监听器;Node 端与您的
代理客户端通信,并可选地通过租赁调度器序列化多个代理。
```
┌─────────────┐ MCP/stdio ┌───────────────────────┐
│ AI 代理 │ ─────────────▶ │ Gamebrew MCP 服务器 │ (mcp/src/index.mjs)
│ (Claude, │ │ bridge_* 工具 │
│ Cursor,…)│ ◀───────────── │ │
└─────────────┘ └───────────┬───────────┘
│ POST { command, args }
▼
http://127.0.0.1:8787/ ← 编辑器 HTTP 桥
┌───────────────────────┐ (unity-package/…/BridgeServer.cs)
│ Unity 编辑器(Play) │
│ 命令路由器开关 │ ── 驱动 ──▶ 您的正在运行的游戏
└───────────────────────┘
── 多个代理?将租赁调度器放在 8787 前─────────────────────────
代理 A ─┐ ┌──────────────────────┐
代理 B ─┼── POST /lease, /cmd ─▶ │ 调度器 :8788 │ ─ 只有租赁持有者 ─▶ :8787
代理 C ─┘ (轮流) │ 租赁 + 队列 + │
│ 默认拒绝允许 │
└──────────────────────┘
```
- **编辑器桥(`:8787`)** - 一个绑定到 `127.0.0.1` 的 `HttpListener`。 一个 `CommandRouter`
将 `{command, args}` 分派到协调器(场景,游戏对象,组件,播放模式
输入,导航,轨道相机,捕获,组件转储,测试)。
- **MCP 服务器(`mcp/src/index.mjs`)** - 将桥暴露为 `bridge_*` MCP 工具;POST 一个
裸 `{command,args}` 正文到 `:8787`。 这是 **协调器/生命周期** 路径。
- **租赁调度器(`mcp/src/dispatcher.mjs`,`:8788`)** - 可选,附加。 位于
`:8787` 前并序列化转以使并行代理不会交错并使一个共享世界脱同步。 强制执行 **默认拒绝浏览允许列表**。
- **`mcp/browse.sh`** - 一个薄的 shell 包装器,代理用于获取/驱动/释放租赁。
---
## 安装 - Unity 部分
1. 将整个 **`unity-package/`** 复制到您的项目中(例如 `Assets/Gamebrew/`),保持
`Editor/` 和 `Runtime/` 子文件夹完整。 Unity 重新生成 `.meta` 文件。 两个
程序集(`Gamebrew.Bridge.Editor`,`Gamebrew.Bridge.Runtime`)是自包含的 - 编辑器
asmdef 引用运行时 asmdef **按名称**,这在两个文件夹都存在时解析。
2. **需求(UPM 包)** - 通过 **窗口 → 包管理器** 安装两者:
- **输入系统** - `com.unity.inputsystem`(程序集 `Unity.InputSystem`)。 被
两个程序集引用;驱动 `play.sendKey` / `play.mouse*` 和输入中继。 设置
**编辑 → 项目设置 → 播放器 → 活动输入处理** 为 *输入系统*(或 *两者*)。
- **Newtonsoft Json** - `com.unity.nuget.newtonsoft-json`(`Newtonsoft.Json.dll`)。 编辑器
程序集的 JSON 命令信封使用。 (运行时程序集既不需要 Newtonsoft 也不需要
任何其他包。)
内置的 **AI(NavMesh)** 模块(`UnityEngine.AIModule`)由 `play.navTo` 用于
*路径规划*,无需包。 *烘焙* 运行时 NavMesh 是您游戏的工作 - 请参阅
[状态](#status--whats-decoupled-vs-todo) 中的 `BridgeNavMeshBaker` 缝隙。
3. **连接移动缝隙(可选,仅当您使用 `play.move`/`play.navTo`/`play.aimAt` 时)。**
play-driver 动词定位游戏无关的抽象组件 - `BridgeLocomotor`,
`BridgeCameraRig`,`BridgeNavMeshBaker`(在 `Runtime/BridgeSeams.cs` 中)- 通过
`FindAnyObjectByType`。 在您的玩家 / 相机 / NavMesh 烘焙器上子类化每个并转发到
您的控制器(每个 3 行适配器;`BridgeSeams.cs` 中的示例)。 如果缝隙
丢失,匹配的动词返回一个干净的 `"场景中没有<缝隙>"` 错误 - 它永远不会抛出,
并且其他所有动词仍然有效。
4. 在 Unity 中:**工具 → Unity 桥 → 启动**。 监听器出现在
`http://127.0.0.1:8787/`。 它在域重新加载中存活(在
`SessionState` 中记住您的启动/停止意图)。
## 安装 - MCP / Node 部分
```bash
cd mcp
npm install
```
使用您的 MCP 客户端(Cursor `.cursor/mcp.json`,Claude Code MCP 配置文件,...)注册服务器:
```json
{
"mcpServers": {
"gamebrew-bridge": {
"command": "node",
"args": ["/绝对路径/到/Gamebrew/mcp/src/index.mjs"]
}
}
}
```
在配置更改后重新启动/重新连接客户端。 如果客户端在您添加工具后显示过时的工具数量,
请使用 `npm run export-mcp-tools` 重新生成描述符并切换服务器关闭/打开。
### 环境变量
| 变量 | 默认值 | 目的 |
|----------|---------|---------|
| `UNITY_BRIDGE_URL` | `http://127.0.0.1:8787/` | 编辑器桥端点(也被调度器读取)。 |
| `GAMEBREW_BRIDGE_URL` | — | `UNITY_BRIDGE_URL` 的旧别名。 |
| `UNITY_BRIDGE_CONTROL_FILE` | `.unity-bridge/control.json` | 当 HTTP 关闭时启动/停止桥(编辑器轮询此文件)。 |
| `UNITY_BRIDGE_MENU` | `工具 → Unity 桥 → 启动` | 在错误消息中显示。 |
| `DISPATCHER_PORT` | `8788` | 租赁调度器端口。 |
| `DISPATCHER_LEASE_TTL` | `90`(秒) | 空闲自动释放超时。 |
| `GAMEBREW_BROWSE_RUN` | `default` | 每会话随机数,以便同一代理 ID 的两个并行运行不会相互冲突。 |
---
## 代理浏览工作流
桥无法流式传输视频。 代理通过捕获静止图像并读取
PNG 来“看到”世界;它通过组件转储读取确切状态。 典型的单代理循环:
```bash
cd mcp
# 1. 获取租赁(仅当空闲时授予;否则您将被排队)
./browse.sh my-agent acquire
# 2. 导航/查看(play.* 动词;需要编辑器已经在 Play 模式)
./browse.sh my-agent play.navTo '{"target":"Environment/Player","standoff":2}'
./browse.sh my-agent play.orbitView '{"target":"Environment/Player","pitch":18,"yaw":45,"distance":2.5}'
# 3. 捕获 → 然后读取打印的路径以查看帧
./browse.sh my-agent capture before # → 日志/browse-my-agent-before.png
# 4. 转储实时状态为 JSON(优于眯着眼看低对比度捕获)
./browse.sh my-agent dump Environment/Player Rigidbody
# 5. 及时释放 - 不要独占租赁
./browse.sh my-agent release
```
### ⚠️ `orbitView` 与 `capture` 的陷阱
有两个不同的相机,这会让人感到困惑:
- `play.orbitView` 移动一个 **自由检查相机** 并写入其自己的帧到
**`Logs/orbit.png`**(一个固定路径)。 它 **不** 移动玩家刚体。
- `capture`(`editor.captureGameView`)读取 **玩家/主游戏相机** 当前看到的内容
到您命名的路径。
因此,在 `orbitView` 之后,**读取 `Logs/orbit.png`** 以查看轨道结果 - 普通
`capture` 将显示 **玩家的** 视图,而轨道视图从未移动。 要判断一个物体的轮廓,
围绕它旋转几次(`yaw:0` 正面,`yaw:60` 3/4,`yaw:120` 侧面)并读取
每个 `Logs/orbit.png`。 一个正面的 `navTo` 捕获不足以说明一个物体是“平的”。
---
## 安全模型
- **仅限环回。** 编辑器桥绑定到 `127.0.0.1:8787`;调度器绑定到
`127.0.0.1:8788`。 没有监听可路由接口。
- **无身份验证。** 这是一个本地开发工具。 反射可以调用组件方法 -
仅在您信任的项目上运行。
- **默认拒绝浏览允许列表。** 调度器的 `/cmd` 在转发命令之前
检查命令是否在 `play.*` 动词(整个命名空间)或一组小的读取/检查/感知
的确切成员。 除此之外 - **在到达编辑器之前被拒绝**。 (参见 `mcp/src/browseAllowlist.mjs`。)
- **协调器拥有生命周期。** 教条:协调器驱动 Play 进入/退出,场景
I/O,测试,编译和结构突变在 **直接 `:8787` 路径**。 代理获得
**仅限游戏的租赁窗口** 在 `:8788`。 代理实际上无法进入 Play 模式
或改变场景图 - 因此请协调器进入 Play 模式,然后为您打开窗口。
- **租赁是合作的,而不是强制执行的。** 调度器提供咨询性的轮流 +
可观察性,而不是访问控制。 `:8787` 保持开放,因此直接与其通信的客户端
绕过租赁。 租赁只有在大家同意通过 `:8788` 进行时才有效。 协调器必须
`GET :8788/status` 并且在代理持有租赁时不驱动 - **不要将 MCP 客户端的 `UNITY_BRIDGE_URL` 重定向到 `:8788`** -
客户端将裸正文发布到 `/`,调度器不会路由(它只知道 `/lease/*`,
`/cmd`,`/status`);保持 MCP 路径在 `:8787`。
### 租赁礼仪(简版)
1. **获取**后再驱动;如果被占用,您将排队。
2. **驱动**,然后**及时释放** - 永远不要持有超过 1-2 分钟。
3. 空闲租赁在 `DISPATCHER_LEASE_TTL` (90 秒)后 **自动回收** 并传递给下一个代理。
4. **两阶段促销:** 释放后,下一个排队的代理被 *保留* 并必须重新
`acquire` 以在 ~12 秒内确认,以便死代理不会阻塞队列长达整个 TTL。
5. 相同代理 ID 在两个并行运行中 → 为每个运行赋予不同的 `GAMEBREW_BROWSE_RUN` 随机数。
使用自包含测试验证整个租赁/允许列表机制(启动调度器 + 存根编辑器,
断言轮流 + 允许列表):
```bash
cd mcp && npm run test:dispatcher # → "37 passed, 0 failed"
```
---
## 命令词汇(通用动词)
`<target>` 是像 `Environment/Player` 这样的场景路径。 `play.*` 动词需要 Play 模式。
| 命令 | 参数 | 目的 | 浏览安全? |
|---|---|---|:--:|
| `ping` | `{}` | 存活/Unity 版本 | ✅ |
| `editor.getBridgeStatus` | `{}` | 桥健康状况 | ✅ |
| `editor.getPlayMode` / `editor.setPlayMode` | `{}` / `{playing}` | 读取/ **设置** Play 模式 | 读取 ✅ / 设置 🚫 |
| `editor.captureGameView` | `{path}` | 写入游戏摄像机的 PNG | ✅ |
| `editor.getConsoleLogs` | `{level?, count?}` | 最近的控制台输出 | ✅ |
| `editor.executeMenuItem` | `{path}` | 运行菜单项 | 🚫 |
| `editor.stopBridge` | `{}` | 停止监听器 | 🚫 |
| `scene.getHierarchy` | `{}` | 活动场景树 | ✅ |
| `scene.open` / `scene.save` | `{path}` / `{}` | 场景 I/O | 🚫 |
| `gameobject.find` / `gameobject.get` | `{name}` / `{path}` | 读取 GameObject | ✅ |
| `gameobject.create` / `.rename` / `.reparent` / `.setActive` | 变化 | 修改场景图 | 🚫 |
| `component.add` / `.setProperty` / `.getProperty` / `.callMethod` | 变化 | 修改/调用组件 | 🚫 |
| `debug.dumpComponent` | `{type}` 或 `{path, component}` | 实时组件字段 → JSON | ✅ |
| `play.move` / `play.moveTo` | 变化 | 移动玩家 | ✅ |
| `play.navTo` / `play.navTo.status` | `{target, standoff?, …}` / `{}` | NavMesh-将玩家移动到对象 | ✅ |
| `play.viewObject` | `{target, standoff?}` | 从玩家的角度显示对象 | ✅ |
| `play.orbitView` | `{target, pitch, yaw, distance}` | 轨道 **自由** 相机 → `Logs/orbit.png` | ✅ |
| `play.aimAt` / `play.aimAtObject` / `play.setLook` | 变化 | 瞄准/看 | ✅ |
| `play.sendKey` | `{key, action?, shift?, …}` | Play 模式下的输入系统键盘 | ✅ |
| `play.mouseLook` / `play.mouseButton` | 变化 | 鼠标视角/点击 | ✅ |
| `test.spawnWall` / `test.despawnWall` | 变化 | 测试障碍 | 🚫 |
| `editor.runTests` / `editor.getTestResults` / `editor.waitForCompile` | 变化 | 编辑模式测试/编译门控 | 🚫(协调器) |
### 添加自定义游戏特定动词
新的 `play.*` 动词被调度器**自动允许** - 您不需要接触允许列表。
要添加一个:
1. 在编辑器程序集(例如 `MyGamePlayCoordinator.cs`)中编写一个静态协调器。
2. 在 `CommandRouter.Execute` 中添加一个 `case "play.myVerb": return MyGamePlayCoordinator.Do(args);`(有一个清晰标记的**扩展点**,以前用于游戏动词)。
3. 可选地在 `mcp/src/index.mjs` 中添加一个匹配的 `bridge_*` MCP 工具。
一个最小的、独立的示例(一个单独的 `play.example.*` 动词)位于 **`examples/custom-verb/`** - 复制模式以添加您自己的 `play.*` 动词。
---
## 仓库布局
```
Gamebrew/
├── README.md
├── LICENSE ← MIT
├── assets/gamebrew-logo.svg
├── unity-package/ ← 将整个文件夹放入您的项目中(保留两个子文件夹)
│ ├── Editor/Bridge/ ← 仅编辑器程序集(Gamebrew.Bridge.Editor)
│ │ ├── Gamebrew.Bridge.Editor.asmdef ← 引用 Gamebrew.Bridge.Runtime 名称
│ │ ├── BridgeServer.cs ← HttpListener on 127.0.0.1:8787 + 工具菜单
│ │ ├── CommandRouter.cs ← 命令开关(+ 游戏动词扩展点)
│ │ ├── MainThreadDispatcher.cs, CompileCoordinator.cs, ConsoleLogBuffer.cs …
│ │ ├── GameObjectResolver.cs, ComponentResolver.cs, JsonCoercion.cs
│ │ ├── DebugDumpCoordinator.cs (debug.dumpComponent), GameViewCapture.cs
│ │ ├── Play{Move,Nav,Orbit,View,Look}Coordinator.cs, PlayModeInputCoordinator.cs
│ │ └── EditorPlayModeCoordinator.cs, Test{Run,Obstacle}Coordinator.cs
│ └── Runtime/ ← 配套运行时程序集(Gamebrew.Bridge.Runtime)
│ ├── Gamebrew.Bridge.Runtime.asmdef ← 引用 Unity.InputSystem; 所有平台
│ ├── BridgeInputRelay.cs ← 通用 Play 模式键盘注入器(play.sendKey)
│ ├── BridgeSimTime.cs ← 通用确定性-dt 缝合(#if UNITY_EDITOR)
│ └── BridgeSeams.cs ← BridgeLocomotor / BridgeCameraRig / BridgeNavMeshBaker
├── mcp/
│ ├── package.json ← "gamebrew-mcp"
│ ├── browse.sh ← 代理租赁包装器
│ ├── src/index.mjs ← MCP stdio 服务器(bridge_* 工具)
│ ├── src/dispatcher.mjs ← 租赁调度器 on :8788
│ ├── src/browseAllowlist.mjs ← 默认拒绝浏览安全命令集
│ ├── src/playModeUtils.mjs ← 进入/退出 Play 模式助手
│ └── scripts/{test-dispatcher,export-mcp-tool-descriptors}.mjs
└── examples/
└── custom-verb/ ← "如何添加游戏自己的 play 动词"(示例)
├── README.md
└── ExampleVerbCoordinator.cs
```
---
## 状态 - 什么已解耦 vs TODO
> **快照。** Gamebrew 从一个真正的 Unity 游戏中提取出来。`unity-package/` 现在是**自包含** - 一个编辑器程序集及其捆绑的 `Gamebrew.Bridge.Runtime` - 并且每个引用的符号都解析为包、UnityEngine/UnityEditor、Newtonsoft.Json、`System.*` 或输入系统,因此预计在添加两个 UPM 包后可以直接编译。
> 其余的游戏钩子是**可选**的,并在源代码中标记为 `TODO(decouple)`。
**解耦和通用:** 整个传输(HttpListener,CommandRouter,主线程调度),场景/游戏对象/组件动词,`debug.dumpComponent`,所有 `play.*` 导航/轨道/视图/查找协调器,捕获,测试,控制台缓冲区 - 以及整个 Node 一半(MCP 服务器,租赁调度器,允许列表,浏览包装器)。捆绑的运行时程序集包含编辑器协调器需要的三个游戏无关的部分:`BridgeInputRelay`(键盘注入),`BridgeSimTime`(确定性 dt)和 `BridgeLocomotor` / `BridgeCameraRig` / `BridgeNavMeshBaker` **缝合**。Node 租赁 + 允许列表逻辑通过其自测试 **37/37**。
| 标记/缝合 | 它是什么 | 您要做什么 |
|---|---|---|
| `Runtime/BridgeSeams.cs` | 抽象 MonoBehaviour 缝合,代替游戏的玩家控制器/相机架/导航网格烘焙器。 Play 驱动器动词直接调用它们。 | 在您的玩家/相机/烘焙器(3 行适配器)上子类化每个 **仅当** 您使用 `play.move` / `play.navTo` / `play.aimAt` / `test.spawnWall`。 缺席缝合 → 清洁错误,不崩溃。 |
| `CommandRouter.cs`(扩展点) | 源游戏自己的 `play.*` 动词案例已被删除;一个标记的扩展点保留。 | 在此处添加您自己的 `play.*` 案例(参见 `examples/`)。 |
| `CommandRouter.cs`(`time.advance`) | 驱动游戏时钟。 正文**存根**返回错误。 | 连接到您自己的时间系统,或删除案例。 |
| `CommandRouter.cs`(`perceive.aimHit` / `perceive.locate`) | 依赖于游戏感知/交互助手。 正文**存根**。 | 移植一个小的感知助手,或删除案例。 |
| `CommandRouter.cs`(`editor.getPlaytestReport`,`playtest.clear`) | 读取游戏验收测试日志。 正文**存根**。 | 连接到您自己的测试日志,或删除案例。 |
| `PlayNavCoordinator.cs` | 默认导航僵局是一个游戏交互范围;**硬编码**为 `3.25f * 0.9f`。 | 如果您有自己的范围,请重新指向它。 |
| `ComponentResolver.cs` & `DebugDumpCoordinator.cs` | 简单名称类型解析优先使用游戏命名空间;替换为 `PreferredNamespacePrefix` 常量**默认为 `""`(关闭)**。 | 为方便起见,将其设置为游戏的根命名空间,或留空。 |
---
<div align="center"><sub>为需要<b>看到</b>和<b>玩</b>的 AI 代理而构建,而不是仅仅读取代码。 • MIT</sub></div>
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器