虚幻引擎远程控制MCP服务器
模型上下文协议(MCP)服务器,使Claude和其他MCP客户端能够通过远程控制API与虚幻引擎5.6+进行交互。
特性
此MCP服务器提供以下用于控制虚幻引擎的工具:
- 获取信息 -获取有关所有可用远程控制API路由的信息
- 调用函数 -在UObjects(Actor、Assets等)上调用蓝图可调用函数
- get_财产 -从UObjects读取属性值
- set_属性 -将属性值写入UObjects
- 搜索资产 -在项目的资产注册表中搜索资产
- describe_object -获取有关UObjects的详细元数据,包括属性和函数
- 批处理请求 -在单个批处理中执行多个API请求以获得更好的性能
需求
- Windows 11 25H2 (或兼容的Windows版本)
- Rust 1.91.0或更高版本
- 虚幻引擎5.6+ 启用远程控制插件
虚幻引擎设置
1.启用远程控制插件
- 打开虚幻引擎项目
- 首选 Edit → 插件
- 搜索“远程控制”
- 启用 Web远程控制 插件
- 重新启动虚幻引擎
2.配置远程控制设置
- 首选 Edit → 项目设置
- 导航至 插件→ Web远程控制
- 配置以下内容:
- 远程控制HTTP服务器端口:默认值为 30010 (可以更改) - 启用HTTP服务器:确保已检查此项 - 启用实验路线:如果要使用事件订阅功能,请选中此项
3.启动远程控制服务器
当您打开启用了插件的虚幻编辑器时,远程控制HTTP服务器会自动启动。您可以通过检查输出日志中的以下消息来验证它是否正在运行:
LogRemoteControl: Remote Control API server is listening on port 30010安装
从源头构建
- 克隆此存储库:
git clone https://github.com/yourusername/unreal-remote-control-mcp.git
cd unreal-remote-control-mcp- 构建项目:
cargo build --release- 编译后的二进制文件将位于:
target/release/unreal-remote-control-mcp.exe配置
环境变量
UNREAL_API_URL-虚幻远程控制API的基本URL(默认值:http://127.0.0.1:30010)RUST_LOG-日志记录级别(默认值:info,选项:trace,debug,info,warn,error)
Claude桌面配置
将以下内容添加到您的Claude Desktop配置文件中:
视窗: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"unreal-remote-control": {
"command": "C:\\path\\to\\unreal-remote-control-mcp.exe",
"env": {
"UNREAL_API_URL": "http://127.0.0.1:30010"
}
}
}
}用法示例
配置后,您可以通过Claude与虚幻引擎进行交互。以下是一些示例提示:
获取可用的API路线
Show me all available Unreal Engine Remote Control API routes搜索资产
Search for all StaticMesh assets in my project调用函数
Move the actor at path /Game/Maps/MyMap.MyMap:PersistentLevel.MyActor to position X=100, Y=200, Z=300读取属性
Get all properties of the actor at /Game/Maps/MyMap.MyMap:PersistentLevel.MyActor设置属性
Set the bHidden property to true for actor at /Game/Maps/MyMap.MyMap:PersistentLevel.MyActor描述一个对象
Describe the object at /Game/Maps/MyMap.MyMap:PersistentLevel.MyActor and show me its functions查找UObject路径
UObject路径对于与虚幻引擎对象交互至关重要。以下是找到它们的几种方法:
方法1:使用撤消历史记录
- 打开 撤消历史记录 虚幻编辑器中的面板
- 单击过滤器图标并启用 显示交易详细信息
- 对要控制的对象进行一个小更改
- 将鼠标悬停在条目上 修改对象和属性 列
- 工具提示将显示完整的对象路径
方法2:使用编辑器脚本工具
您可以使用MCP服务器本身查询对象路径:
- 获取当前级别的所有参与者:
Call the GetAllLevelActors function on /Script/EditorScriptingUtilities.Default__EditorLevelLibrary- 获取所有加载的资产:
Search for assets with an empty query to return all assets方法3:常见路径模式
对象路径通常遵循以下格式:
/Game/Path/To/Asset.AssetName:SubObject.Component示例:
- 演员级别:
/Game/Maps/MyMap.MyMap:PersistentLevel.MyActor - 演员组件:
/Game/Maps/MyMap.MyMap:PersistentLevel.MyActor.StaticMeshComponent0 - 资产:
/Game/Materials/MyMaterial.MyMaterial
工具参考
获取信息
获取有关所有可用远程控制API路由的信息。
参数: 无
例子:
{
"name": "get_info",
"arguments": {}
}调用函数
调用UObject上的函数。
参数:
objectPath(字符串,必填)-UObject的完整路径functionName(string,必填)-要调用的函数的名称parameters(对象,可选)-函数参数作为键值对generateTransaction(布尔值,可选)-在撤消历史记录中记录(默认值:false)
例子:
{
"name": "call_function",
"arguments": {
"objectPath": "/Game/Maps/MyMap.MyMap:PersistentLevel.MyActor",
"functionName": "SetActorLocation",
"parameters": {
"NewLocation": {"X": 100, "Y": 200, "Z": 300},
"bSweep": false
},
"generateTransaction": true
}
}get_财产
从UObject读取属性值。
参数:
objectPath(字符串,必填)-UObject的完整路径propertyName(字符串,可选)-特定属性名称(省略以获取所有属性)
例子:
{
"name": "get_property",
"arguments": {
"objectPath": "/Game/Maps/MyMap.MyMap:PersistentLevel.MyActor",
"propertyName": "bHidden"
}
}set_属性
将属性值写入UObject。
参数:
objectPath(字符串,必填)-UObject的完整路径propertyName(字符串,必填)-要设置的属性名称propertyValue(object,必填)-具有属性名称和新值的对象generateTransaction(布尔值,可选)-在撤消历史记录中记录(默认值:false)
例子:
{
"name": "set_property",
"arguments": {
"objectPath": "/Game/Maps/MyMap.MyMap:PersistentLevel.MyActor",
"propertyName": "bHidden",
"propertyValue": {
"bHidden": true
},
"generateTransaction": true
}
}搜索资产
在资产注册表中搜索资产。
参数:
query(string,必填)-搜索查询(空字符串返回全部)packageNames(数组,可选)-按确切的包名筛选classNames(数组,可选)-按类名筛选packagePaths(数组,可选)-按包路径筛选recursivePaths(布尔值,可选)-搜索子文件夹recursiveClasses(布尔值,可选)-包括子类
例子:
{
"name": "search_assets",
"arguments": {
"query": "Cube",
"classNames": ["StaticMesh"],
"recursiveClasses": true
}
}describe_object
获取有关UObject的详细元数据。
参数:
objectPath(字符串,必填)-UObject的完整路径
例子:
{
"name": "describe_object",
"arguments": {
"objectPath": "/Game/Maps/MyMap.MyMap:PersistentLevel.MyActor"
}
}批处理请求
在单个批处理中执行多个请求。
参数:
requests(array,必填)-请求对象数组,每个对象具有:
- requestId (整数,必填)-匹配响应的唯一ID - url (字符串,必需)-API端点(例如,“/remote/object/property”) - verb (字符串,必填)-HTTP方法(PUT、GET、POST、DELETE) - body (对象,可选)-请求正文
例子:
{
"name": "batch_request",
"arguments": {
"requests": [
{
"requestId": 1,
"url": "/remote/object/property",
"verb": "PUT",
"body": {
"objectPath": "/Game/Maps/MyMap.MyMap:PersistentLevel.Actor1",
"access": "READ_ACCESS"
}
},
{
"requestId": 2,
"url": "/remote/object/property",
"verb": "PUT",
"body": {
"objectPath": "/Game/Maps/MyMap.MyMap:PersistentLevel.Actor2",
"access": "READ_ACCESS"
}
}
]
}
}故障排除
连接问题
问题:“向虚幻引擎发送请求失败”
解决方案:
- 验证虚幻引擎是否正在运行
- 检查是否启用了远程控制插件
- 验证配置中的端口是否与虚幻的设置匹配
- 检查Windows防火墙是否阻止连接
- 在虚幻输出日志中查找远程控制消息
对象路径问题
问题:“找不到对象”或“对象路径无效”
解决方案:
- 使用“撤消历史记录”方法查找正确的路径
- 确保对象当前已加载到内存中
- 对于演员,确保他们处于当前加载的级别
- 对于资源,确保它们已加载(而不仅仅是在内容浏览器中)
权限问题
问题:“属性为只读”或“无法调用函数”
解决方案:
- 检查该物业是否
EditAnywhereC中的说明符++ - 确保该功能标记为
BlueprintCallable - 对于受保护/私有成员,您无法通过远程控制访问它们
- 某些属性需要
BlueprintGetter/BlueprintSetter函数
发展
项目结构
unreal-remote-control-mcp/
├── src/
│ ├── main.rs # MCP server and request handling
│ ├── types.rs # Type definitions for MCP and Unreal API
│ └── unreal_client.rs # HTTP client for Unreal Remote Control API
├── Cargo.toml # Rust dependencies and project config
└── README.md # This file在调试模式下运行
对于开发,您可以使用详细日志记录运行:
RUST_LOG=debug cargo run运行测试
cargo test贡献
欢迎投稿!请随时提交拉取请求。
许可证
MIT许可证-有关详细信息,请参阅许可证文件
