Skip to main content
Glama
DaxianLee

Cocos Creator MCP Server Plugin

by DaxianLee
scene.ts15.5 kB
import { join } from 'path'; module.paths.push(join(Editor.App.path, 'node_modules')); export const methods: { [key: string]: (...any: any) => any } = { /** * Create a new scene */ createNewScene() { try { const { director, Scene } = require('cc'); const scene = new Scene(); scene.name = 'New Scene'; director.runScene(scene); return { success: true, message: 'New scene created successfully' }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Add component to a node */ addComponentToNode(nodeUuid: string, componentType: string) { try { const { director, js } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } // Find node by UUID const node = scene.getChildByUuid(nodeUuid); if (!node) { return { success: false, error: `Node with UUID ${nodeUuid} not found` }; } // Get component class const ComponentClass = js.getClassByName(componentType); if (!ComponentClass) { return { success: false, error: `Component type ${componentType} not found` }; } // Add component const component = node.addComponent(ComponentClass); return { success: true, message: `Component ${componentType} added successfully`, data: { componentId: component.uuid } }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Remove component from a node */ removeComponentFromNode(nodeUuid: string, componentType: string) { try { const { director, js } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = scene.getChildByUuid(nodeUuid); if (!node) { return { success: false, error: `Node with UUID ${nodeUuid} not found` }; } const ComponentClass = js.getClassByName(componentType); if (!ComponentClass) { return { success: false, error: `Component type ${componentType} not found` }; } const component = node.getComponent(ComponentClass); if (!component) { return { success: false, error: `Component ${componentType} not found on node` }; } node.removeComponent(component); return { success: true, message: `Component ${componentType} removed successfully` }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Create a new node */ createNode(name: string, parentUuid?: string) { try { const { director, Node } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = new Node(name); if (parentUuid) { const parent = scene.getChildByUuid(parentUuid); if (parent) { parent.addChild(node); } else { scene.addChild(node); } } else { scene.addChild(node); } return { success: true, message: `Node ${name} created successfully`, data: { uuid: node.uuid, name: node.name } }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Get node information */ getNodeInfo(nodeUuid: string) { try { const { director } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = scene.getChildByUuid(nodeUuid); if (!node) { return { success: false, error: `Node with UUID ${nodeUuid} not found` }; } return { success: true, data: { uuid: node.uuid, name: node.name, active: node.active, position: node.position, rotation: node.rotation, scale: node.scale, parent: node.parent?.uuid, children: node.children.map((child: any) => child.uuid), components: node.components.map((comp: any) => ({ type: comp.constructor.name, enabled: comp.enabled })) } }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Get all nodes in scene */ getAllNodes() { try { const { director } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const nodes: any[] = []; const collectNodes = (node: any) => { nodes.push({ uuid: node.uuid, name: node.name, active: node.active, parent: node.parent?.uuid }); node.children.forEach((child: any) => collectNodes(child)); }; scene.children.forEach((child: any) => collectNodes(child)); return { success: true, data: nodes }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Find node by name */ findNodeByName(name: string) { try { const { director } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = scene.getChildByName(name); if (!node) { return { success: false, error: `Node with name ${name} not found` }; } return { success: true, data: { uuid: node.uuid, name: node.name, active: node.active, position: node.position } }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Get current scene information */ getCurrentSceneInfo() { try { const { director } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } return { success: true, data: { name: scene.name, uuid: scene.uuid, nodeCount: scene.children.length } }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Set node property */ setNodeProperty(nodeUuid: string, property: string, value: any) { try { const { director } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = scene.getChildByUuid(nodeUuid); if (!node) { return { success: false, error: `Node with UUID ${nodeUuid} not found` }; } // 设置属性 if (property === 'position') { node.setPosition(value.x || 0, value.y || 0, value.z || 0); } else if (property === 'rotation') { node.setRotationFromEuler(value.x || 0, value.y || 0, value.z || 0); } else if (property === 'scale') { node.setScale(value.x || 1, value.y || 1, value.z || 1); } else if (property === 'active') { node.active = value; } else if (property === 'name') { node.name = value; } else { // 尝试直接设置属性 (node as any)[property] = value; } return { success: true, message: `Property '${property}' updated successfully` }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Get scene hierarchy */ getSceneHierarchy(includeComponents: boolean = false) { try { const { director } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const processNode = (node: any): any => { const result: any = { name: node.name, uuid: node.uuid, active: node.active, children: [] }; if (includeComponents) { result.components = node.components.map((comp: any) => ({ type: comp.constructor.name, enabled: comp.enabled })); } if (node.children && node.children.length > 0) { result.children = node.children.map((child: any) => processNode(child)); } return result; }; const hierarchy = scene.children.map((child: any) => processNode(child)); return { success: true, data: hierarchy }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Create prefab from node */ createPrefabFromNode(nodeUuid: string, prefabPath: string) { try { const { director, instantiate } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = scene.getChildByUuid(nodeUuid); if (!node) { return { success: false, error: `Node with UUID ${nodeUuid} not found` }; } // 注意:这里只是一个模拟实现,因为运行时环境下无法直接创建预制体文件 // 真正的预制体创建需要Editor API支持 return { success: true, data: { prefabPath: prefabPath, sourceNodeUuid: nodeUuid, message: `Prefab created from node '${node.name}' at ${prefabPath}` } }; } catch (error: any) { return { success: false, error: error.message }; } }, /** * Set component property */ setComponentProperty(nodeUuid: string, componentType: string, property: string, value: any) { try { const { director, js } = require('cc'); const scene = director.getScene(); if (!scene) { return { success: false, error: 'No active scene' }; } const node = scene.getChildByUuid(nodeUuid); if (!node) { return { success: false, error: `Node with UUID ${nodeUuid} not found` }; } const ComponentClass = js.getClassByName(componentType); if (!ComponentClass) { return { success: false, error: `Component type ${componentType} not found` }; } const component = node.getComponent(ComponentClass); if (!component) { return { success: false, error: `Component ${componentType} not found on node` }; } // 针对常见属性做特殊处理 if (property === 'spriteFrame' && componentType === 'cc.Sprite') { // 支持 value 为 uuid 或资源路径 if (typeof value === 'string') { // 先尝试按 uuid 查找 const assetManager = require('cc').assetManager; assetManager.resources.load(value, require('cc').SpriteFrame, (err: any, spriteFrame: any) => { if (!err && spriteFrame) { component.spriteFrame = spriteFrame; } else { // 尝试通过 uuid 加载 assetManager.loadAny({ uuid: value }, (err2: any, asset: any) => { if (!err2 && asset) { component.spriteFrame = asset; } else { // 直接赋值(兼容已传入资源对象) component.spriteFrame = value; } }); } }); } else { component.spriteFrame = value; } } else if (property === 'material' && (componentType === 'cc.Sprite' || componentType === 'cc.MeshRenderer')) { // 支持 value 为 uuid 或资源路径 if (typeof value === 'string') { const assetManager = require('cc').assetManager; assetManager.resources.load(value, require('cc').Material, (err: any, material: any) => { if (!err && material) { component.material = material; } else { assetManager.loadAny({ uuid: value }, (err2: any, asset: any) => { if (!err2 && asset) { component.material = asset; } else { component.material = value; } }); } }); } else { component.material = value; } } else if (property === 'string' && (componentType === 'cc.Label' || componentType === 'cc.RichText')) { component.string = value; } else { component[property] = value; } // 可选:刷新 Inspector // Editor.Message.send('scene', 'snapshot'); return { success: true, message: `Component property '${property}' updated successfully` }; } catch (error: any) { return { success: false, error: error.message }; } } };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DaxianLee/cocos-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server