Files
mcp-bridge/DEVELOPMENT_PLAN.md

630 lines
21 KiB
Markdown
Raw Normal View History

# Cocos-MCP 开发计划文档
## 1. 项目概述
### 1.1 项目背景
Cocos-MCP (Model Context Protocol) 插件是一个为 Cocos Creator 编辑器提供外部 AI 工具交互能力的桥梁。通过 HTTP 服务和 MCP 协议,插件允许外部 AI 工具(如 Cursor、VS Code 等)直接与 Cocos Creator 编辑器进行交互,实现场景操作、资源管理、脚本编辑等功能。
### 1.2 项目目标
- 提供与 Unity-MCP 对等的功能集,使 Cocos Creator 开发者获得同样强大的 AI 辅助开发体验
- 实现编辑器管理、游戏对象查找、材质/纹理管理等高级功能
- 优化现有功能,提高插件稳定性和性能
- 建立完善的测试和部署流程
### 1.3 技术栈
- **开发语言**JavaScript/TypeScript
- **运行环境**Node.js (Cocos Creator 内置)
- **通信协议**HTTP + JSON (MCP 协议)
- **编辑器 API**Cocos Creator 2.4.x Editor API
- **界面技术**HTML/CSS + Cocos Creator 面板 API
## 2. 功能分析
### 2.1 Unity-MCP 功能参考
Unity-MCP 提供了以下核心功能:
| 功能类别 | 具体功能 | 描述 |
|---------|---------|------|
| 编辑器管理 | manage_editor | 控制 Unity 编辑器状态和操作 |
| 游戏对象管理 | find_gameobjects | 根据条件查找游戏对象 |
| 材质管理 | manage_material | 创建和管理材质资源 |
| 着色器管理 | manage_shader | 管理着色器资源 |
| 纹理管理 | manage_texture | 管理纹理资源 |
| 代码编辑增强 | apply_text_edits | 应用文本编辑操作到文件 |
| 测试功能 | run_tests | 运行测试用例 |
| 控制台读取 | read_console | 读取编辑器控制台输出 |
| 菜单项执行 | execute_menu_item | 执行编辑器菜单项 |
| 脚本验证 | validate_script | 验证脚本语法 |
| VFX 管理 | manage_vfx | 管理视觉效果资源 |
### 2.2 Cocos-MCP 现状分析
#### 已实现功能
- **场景节点操作**:获取选中节点、设置节点名称、获取场景层级、更新节点变换、创建节点
- **组件管理**:添加、移除、获取组件
- **资源管理**:创建、删除、移动资源
- **脚本管理**:创建、删除、读取、写入脚本(默认创建 TypeScript 脚本)
- **批处理执行**:批量执行多个操作
- **资产管理**:管理各种资源文件
- **场景管理**:创建、删除、复制、获取场景信息
- **预制体管理**:创建、更新、实例化、获取预制体信息
- **面板界面**:提供主面板和工具测试面板
- **编辑器管理**:控制编辑器状态、执行编辑器操作
- **游戏对象查找**:根据条件查找场景中的节点
- **材质管理**:创建和管理材质资源
- **着色器管理**:管理着色器资源
- **纹理管理**:管理纹理资源
- **代码编辑增强**:应用文本编辑操作到文件
- **测试功能**:运行自动化测试用例 (`run_tests.js`)
- **控制台读取**:读取编辑器控制台输出
- **菜单项执行**:执行编辑器菜单项
- **脚本验证**:验证脚本语法
#### 缺失功能
- **VFX 管理**:管理视觉效果资源(暂未排期)
### 2.3 功能优先级排序
所有高/中优先级功能均已完成。
### 2.4 Unity-MCP 差异分析 (Gap Analysis)
通过对比 [Unity-MCP](https://github.com/CoplayDev/unity-mcp),发现以下缺失或可增强的功能:
1. **全局搜索 (`find_in_file`)**: ✅ 已实现。支持在整个项目中搜索文本内容。
2. **ScriptableObject 管理 (`manage_scriptable_object`)**: 虽然 AssetDB 可以创建资源,但缺乏专门针对 ScriptableObject (cc.Asset) 的简便创建工具。
3. **Undo/Redo 支持**: ✅ 已实现。通过 `manage_undo` 提供了 `undo/redo` 及事务组支持。
4. **VFX 管理 (`manage_vfx`)**: ✅ 已实现。支持粒子系统的创建、修改和信息获取。
5. **Git 集成 (`get_sha`)**: 获取当前版本库信息。
`find_in_file``Undo/Redo``manage_vfx` 已在最新迭代中完成。
## 3. 开发路线图
### 3.1 第三阶段开发计划(已完成)
| 任务 | 状态 | 描述 |
|------|------|------|
| 编辑器管理工具实现 | ✅ 完成 | 实现 manage_editor 工具,支持编辑器状态控制和操作执行 |
| 游戏对象查找工具实现 | ✅ 完成 | 实现 find_gameobjects 工具,支持根据条件查找场景节点 |
| 材质和纹理管理工具实现 | ✅ 完成 | 实现 manage_material 和 manage_texture 工具,支持材质和纹理资源管理 |
| 菜单项执行工具实现 | ✅ 完成 | 实现 execute_menu_item 工具,支持执行 Cocos Creator 菜单项 |
| 代码编辑增强工具实现 | ✅ 完成 | 实现 apply_text_edits 工具,支持文本编辑操作应用 |
| 控制台读取工具实现 | ✅ 完成 | 实现 read_console 工具,支持读取编辑器控制台输出 |
| 脚本验证工具实现 | ✅ 完成 | 实现 validate_script 工具,支持脚本语法验证 |
### 3.2 第四阶段开发计划(已完成)
| 任务 | 状态 | 描述 |
|------|------|------|
| 测试功能实现 | ✅ 完成 | 实现 run_tests.js 脚本,支持运行自动化测试用例 |
| 错误处理增强 | ✅ 完成 | 完善 HTTP 服务和工具调用的错误日志记录 |
### 3.3 差异填补阶段Gap Filling- 已完成
| 任务 | 状态 | 描述 |
|------|------|------|
| 全局文件搜索 | ✅ 完成 | 实现 find_in_file 工具 |
| 撤销/重做支持 | ✅ 完成 | 实现 manage_undo 工具,并重构核心操作支持撤销 |
| 特效管理 | ✅ 完成 | 实现 manage_vfx 工具,支持粒子系统管理 |
### 3.3 第五阶段开发计划(远期)
| 任务 | 优先级 | 预计时间 | 描述 |
|------|--------|----------|------|
| 工具扩展 | 低 | 3 天 | 添加更多高级工具和功能 |
| 界面美化 | 低 | 2 天 | 进一步优化面板界面,提升用户体验 |
| 国际化支持 | 低 | 2 天 | 添加多语言支持 |
| 文档完善 | 中 | 2 天 | 完善 API 文档和使用示例 |
| 插件发布 | 高 | 1 天 | 准备插件发布,提交到 Cocos 插件商店 |
## 4. 技术架构
### 4.1 系统架构
```
┌────────────────────┐ HTTP ┌────────────────────┐ IPC ┌────────────────────┐
│ 外部 AI 工具 │ ──────────> │ main.js (HTTP服务) │ ─────────> │ scene-script.js │
│ (Cursor/VS Code) │ <──────── │ (MCP 协议处理) │ <──────── │ (场景操作执行) │
└────────────────────┘ JSON └────────────────────┘ JSON └────────────────────┘
```
### 4.2 核心模块
1. **HTTP 服务模块**:处理外部请求,解析 MCP 协议,返回操作结果
2. **MCP 工具模块**:实现各种操作工具,包括新增的编辑器管理、游戏对象查找等功能
3. **场景操作模块**:执行场景相关操作,如节点查找、组件管理等
4. **资源管理模块**:处理脚本、材质、纹理等资源文件的创建和管理
5. **面板界面模块**:提供用户交互界面,包括主面板和工具测试面板
### 4.3 技术实现要点
- **编辑器 API 调用**:使用 `Editor.Ipc` 与编辑器核心进行通信
- **资源操作**:使用 `Editor.assetdb` API 进行资源文件的创建、读取、更新和删除
- **场景操作**:通过场景脚本执行节点和组件操作
- **异步处理**:使用回调函数处理异步操作,避免阻塞主线程
- **错误处理**:完善的错误捕获和处理机制,提高插件稳定性
- **性能优化**:使用批处理执行减少 HTTP 请求次数,优化资源操作效率
## 5. 功能实现方案
### 5.1 编辑器管理工具 (`manage_editor`)
#### 功能描述
提供对 Cocos Creator 编辑器状态的控制和操作执行能力。
#### 实现方案
```javascript
// 在 main.js 中添加
manageEditor(args, callback) {
const { action, target, properties } = args;
switch (action) {
case "get_selection":
// 获取当前选中的资源或节点
const nodeSelection = Editor.Selection.curSelection('node');
const assetSelection = Editor.Selection.curSelection('asset');
callback(null, {
nodes: nodeSelection,
assets: assetSelection
});
break;
case "set_selection":
// 设置选中状态
if (target === 'node' && properties.nodes) {
Editor.Selection.select('node', properties.nodes);
} else if (target === 'asset' && properties.assets) {
Editor.Selection.select('asset', properties.assets);
}
callback(null, "Selection updated");
break;
case "refresh_editor":
// 刷新编辑器
Editor.assetdb.refresh();
callback(null, "Editor refreshed");
break;
default:
callback("Unknown action");
}
}
```
### 5.2 游戏对象查找工具 (`find_gameobjects`)
#### 功能描述
根据条件查找场景中的节点对象。
#### 实现方案
```javascript
// 在 scene-script.js 中添加
findGameObjects(params, callback) {
const { conditions, recursive } = params;
const result = [];
// 遍历场景根节点
cc.director.getScene().children.forEach(child => {
searchNode(child, conditions, recursive, result);
});
callback(null, result);
}
function searchNode(node, conditions, recursive, result) {
// 检查节点是否满足条件
let match = true;
if (conditions.name && !node.name.includes(conditions.name)) {
match = false;
}
if (conditions.tag && node.tag !== conditions.tag) {
match = false;
}
if (conditions.component && !node.getComponent(conditions.component)) {
match = false;
}
if (match) {
result.push({
id: node.uuid,
name: node.name,
tag: node.tag,
position: node.position,
rotation: node.rotation,
scale: node.scale
});
}
// 递归搜索子节点
if (recursive) {
node.children.forEach(child => {
searchNode(child, conditions, recursive, result);
});
}
}
```
### 5.3 材质和纹理管理工具 (`manage_material`, `manage_texture`)
#### 功能描述
管理材质和纹理资源,支持创建、修改、删除等操作。
#### 实现方案
```javascript
// 在 main.js 中添加
manageMaterial(args, callback) {
const { action, path, properties } = args;
switch (action) {
case "create":
// 创建材质资源
const materialContent = JSON.stringify({
__type__: "cc.Material",
_name: "",
_objFlags: 0,
_native: "",
effects: [{
technique: 0,
defines: {},
uniforms: properties.uniforms || {}
}]
});
// 确保目录存在
const fs = require('fs');
const pathModule = require('path');
const absolutePath = Editor.assetdb.urlToFspath(path);
const dirPath = pathModule.dirname(absolutePath);
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
Editor.assetdb.create(path, materialContent, (err) => {
callback(err, err ? null : `Material created at ${path}`);
});
break;
// 其他操作...
}
}
manageTexture(args, callback) {
const { action, path, properties } = args;
switch (action) {
case "create":
// 创建纹理资源(简化版,实际需要处理纹理文件)
const textureContent = JSON.stringify({
__type__: "cc.Texture2D",
_name: "",
_objFlags: 0,
_native: properties.native || "",
width: properties.width || 128,
height: properties.height || 128
});
// 确保目录存在
const fs = require('fs');
const pathModule = require('path');
const absolutePath = Editor.assetdb.urlToFspath(path);
const dirPath = pathModule.dirname(absolutePath);
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
Editor.assetdb.create(path, textureContent, (err) => {
callback(err, err ? null : `Texture created at ${path}`);
});
break;
// 其他操作...
}
}
```
### 5.4 菜单项执行工具 (`execute_menu_item`)
#### 功能描述
执行 Cocos Creator 编辑器的菜单项命令。
#### 实现方案
```javascript
// 在 main.js 中添加
executeMenuItem(args, callback) {
const { menuPath } = args;
try {
// 执行菜单项
Editor.Ipc.sendToMain('menu:click', menuPath);
callback(null, `Menu item executed: ${menuPath}`);
} catch (err) {
callback(`Failed to execute menu item: ${err.message}`);
}
}
```
### 5.5 代码编辑增强工具 (`apply_text_edits`)
#### 功能描述
应用文本编辑操作到文件,支持插入、删除、替换等操作。
#### 实现方案
```javascript
// 在 main.js 中添加
applyTextEdits(args, callback) {
const { filePath, edits } = args;
// 读取文件内容
Editor.assetdb.queryInfoByUrl(filePath, (err, info) => {
if (err) {
callback(`Failed to get file info: ${err.message}`);
return;
}
Editor.assetdb.loadMeta(info.uuid, (err, content) => {
if (err) {
callback(`Failed to load file: ${err.message}`);
return;
}
// 应用编辑操作
let updatedContent = content;
edits.forEach(edit => {
switch (edit.type) {
case "insert":
updatedContent = updatedContent.slice(0, edit.position) + edit.text + updatedContent.slice(edit.position);
break;
case "delete":
updatedContent = updatedContent.slice(0, edit.start) + updatedContent.slice(edit.end);
break;
case "replace":
updatedContent = updatedContent.slice(0, edit.start) + edit.text + updatedContent.slice(edit.end);
break;
}
});
// 写回文件
Editor.assetdb.save(info.uuid, updatedContent, (err) => {
callback(err, err ? null : `Text edits applied to ${filePath}`);
});
});
});
}
```
### 5.6 控制台读取工具 (`read_console`)
#### 功能描述
读取编辑器控制台的输出信息。
#### 实现方案
```javascript
// 在 main.js 中添加
// 首先在模块顶部添加控制台输出捕获
let consoleOutput = [];
const originalLog = console.log;
const originalError = console.error;
const originalWarn = console.warn;
console.log = function(...args) {
consoleOutput.push({ type: 'log', message: args.join(' ') });
originalLog.apply(console, args);
};
console.error = function(...args) {
consoleOutput.push({ type: 'error', message: args.join(' ') });
originalError.apply(console, args);
};
console.warn = function(...args) {
consoleOutput.push({ type: 'warn', message: args.join(' ') });
originalWarn.apply(console, args);
};
// 然后添加 read_console 工具
readConsole(args, callback) {
const { limit, type } = args;
let filteredOutput = consoleOutput;
if (type) {
filteredOutput = filteredOutput.filter(item => item.type === type);
}
if (limit) {
filteredOutput = filteredOutput.slice(-limit);
}
callback(null, filteredOutput);
}
```
### 5.7 脚本验证工具 (`validate_script`)
#### 功能描述
验证脚本文件的语法正确性。
#### 实现方案
```javascript
// 在 main.js 中添加
validateScript(args, callback) {
const { filePath } = args;
// 读取脚本内容
Editor.assetdb.queryInfoByUrl(filePath, (err, info) => {
if (err) {
callback(`Failed to get file info: ${err.message}`);
return;
}
Editor.assetdb.loadMeta(info.uuid, (err, content) => {
if (err) {
callback(`Failed to load file: ${err.message}`);
return;
}
try {
// 对于 JavaScript 脚本,使用 eval 进行简单验证
if (filePath.endsWith('.js')) {
// 包装在函数中以避免变量污染
const wrapper = `(function() { ${content} })`;
eval(wrapper);
}
// 对于 TypeScript 脚本,这里可以添加更复杂的验证逻辑
callback(null, { valid: true, message: 'Script syntax is valid' });
} catch (err) {
callback(null, { valid: false, message: err.message });
}
});
});
}
});
}
```
### 5.8 常用 IPC 消息参考 (Cocos Creator 2.4.x)
基于社区资料整理,以下 IPC 消息可用于扩展功能:
#### 场景操作 (`scene:`)
- **创建/实例化**:
- `scene:create-node-by-classid` (参数: name, parentUuid)
- `scene:create-nodes-by-uuids` (实例化预制体, 参数: [prefabUuid], parentUuid)
- **修改**:
- `scene:set-property` (参数: {id, path, type, value})
- `scene:copy-nodes` / `scene:paste-nodes`
- **安全机制**:
- `scene:undo` / `scene:redo` (建议集成到 manage_editor)
#### 资源操作 (`assets:`)
- `assets:hint` (高亮资源)
- `assets:open-text-file` (打开外部编辑器)
## 6. 测试策略
### 6.1 测试目标
- 验证所有新增功能的正确性和稳定性
- 确保现有功能不受影响
- 测试插件在不同场景下的性能表现
- 验证错误处理机制的有效性
### 6.2 测试方法
#### 单元测试
- 为每个工具函数编写独立的测试用例
- 测试各种输入参数和边界情况
- 验证函数返回值的正确性
#### 集成测试
- 测试工具之间的协作能力
- 验证批处理执行的正确性
- 测试插件与编辑器的集成稳定性
#### 性能测试
- 测试工具执行速度
- 验证批处理执行的性能优势
- 测试插件在处理大量操作时的表现
#### 回归测试
- 确保新增功能不破坏现有功能
- 验证修复的 bug 不会再次出现
- 测试插件在不同版本 Cocos Creator 中的兼容性
### 6.3 测试工具
- **手动测试**:通过面板界面测试工具功能
- **脚本测试**:编写测试脚本自动执行测试用例
- **性能分析**:使用浏览器开发者工具分析性能瓶颈
## 7. 部署与维护
### 7.1 部署方案
#### 本地部署
1. 将插件复制到 Cocos Creator 项目的 `packages` 目录
2. 重启 Cocos Creator 编辑器
3. 在编辑器中打开 MCP Bridge 面板
4. 启动 HTTP 服务
#### 远程部署
1. 使用 Git 进行版本控制
2. 提供插件的 GitHub 仓库地址
3. 发布插件到 Cocos 插件商店(未来)
### 7.2 维护计划
#### 版本管理
- 遵循语义化版本规范MAJOR.MINOR.PATCH
- 定期发布更新版本
- 维护详细的版本变更日志
#### 错误处理
- 建立错误报告机制
- 定期分析错误日志
- 及时修复发现的问题
#### 性能优化
- 定期分析插件性能
- 优化资源操作和网络请求
- 提高插件响应速度
#### 文档维护
- 保持 README.md 和开发文档的更新
- 提供详细的 API 文档
- 编写使用教程和示例
## 8. 风险评估
### 8.1 潜在风险
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| 编辑器 API 变更 | 插件功能失效 | 定期检查 Cocos Creator 更新,适配新 API |
| 性能问题 | 插件响应缓慢 | 优化代码结构,使用批处理执行,避免阻塞操作 |
| 安全漏洞 | 未授权访问 | 添加 IP 白名单,实现认证机制,限制服务访问范围 |
| 兼容性问题 | 不同版本 Cocos Creator 不兼容 | 测试多个版本,提供版本兼容层 |
| 错误处理不完善 | 插件崩溃 | 完善错误捕获和处理机制,提高插件稳定性 |
### 8.2 应对策略
- **持续集成**:建立自动化测试流程,及时发现问题
- **监控机制**:添加性能监控和错误监控
- **用户反馈**:建立用户反馈渠道,收集使用问题
- **文档完善**:提供详细的安装和使用文档
- **社区支持**:建立社区支持渠道,解答用户问题
## 9. 结论
Cocos-MCP 插件的开发计划基于与 Unity-MCP 的功能对比,旨在为 Cocos Creator 开发者提供同样强大的 AI 辅助开发体验。通过分阶段实现编辑器管理、游戏对象查找、材质/纹理管理等高级功能,插件将逐步完善其功能集,成为 Cocos Creator 编辑器的重要扩展工具。
本开发计划文档为后续的开发工作提供了详细的指导,包括功能实现方案、技术架构设计、测试策略和部署维护计划。通过严格按照计划执行开发工作,我们可以确保插件的质量和稳定性,为 Cocos Creator 生态系统做出贡献。