# 蓝图开发接口 ## 接口总览 | Method | 名称 | 说明 | | --- | --- | --- | | **blueprint.describe** | 📋 获取结构 | 查看蓝图的组件、变量列表(修改前必用!) | | **blueprint.create** | 创建蓝图 | 创建新的蓝图类,支持指定父类和添加组件 | | **blueprint.add_component** | 添加组件 | 为已存在的蓝图添加新组件 | | **blueprint.set_property** | 设置属性 | 修改蓝图默认值(CDO)或组件属性(SCS) | | **blueprint.add_variable** | 定义变量 | 添加蓝图成员变量(支持数组/对象引用等) | | **blueprint.get_graph** | 上帝视角 | 获取图表全貌(节点 GUID + 真实引脚名) | | **blueprint.add_node** | 添加节点 | 添加节点并返回 pins 说明书(真实引脚名) | | **blueprint.add_timeline** | 添加 Timeline | 添加 Timeline(创建 TimelineTemplate + Timeline 节点;Timeline 不能用 add_variable/add_node 直接创建) | | **blueprint.connect_pins** | 逻辑连线 | 基于 node_id + pin.name 连接执行流/数据流 | | **blueprint.compile** | 编译蓝图 | 手动触发编译并可选保存(返回 diagnostics 供自修复) | --- ## 获取蓝图结构 `blueprint.describe` 获取蓝图完整结构信息:父类、组件列表(SCS 添加 + 继承)、变量列表、编译状态。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp0","method":"blueprint.describe","params":{ "blueprint_path":"/Game/Blueprints/BP_Hero" // 必填:蓝图名称或路径 }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp0","code":200,"result":{ "ok":true, "name":"BP_Hero", "path":"/Game/Blueprints/BP_Hero.BP_Hero", "parent_class":"Character", "parent_class_path":"/Script/Engine.Character", "generated_class":"/Game/Blueprints/BP_Hero.BP_Hero_C", "components":[ {"name":"DefaultSceneRoot","class":"SceneComponent","class_path":"/Script/Engine.SceneComponent","source":"inherited","editable":true}, {"name":"PointLight","class":"PointLightComponent","class_path":"/Script/Engine.PointLightComponent","source":"added","editable":true,"attach_to":"DefaultSceneRoot"} ], "variables":[ {"name":"WalkSpeed","type":"float","editable":true,"default_value":"600.000000"} ], "compile_status":"UpToDate" }} ``` ### 说明 - `blueprint_path` 支持短名或完整路径;若传入 `/Game/.../BP_XXX`(不带 `.BP_XXX`),插件会自动补全。 - `components[].source`:`added` 表示蓝图自身(SCS)添加,`inherited` 表示从父类 CDO 继承。 - `variables[].default_value` 仅在蓝图变量定义包含默认值时返回。 - 建议在调用 `blueprint.add_component` / `blueprint.set_property` 之前先 `blueprint.describe`,避免组件名/变量名写错。 --- ## 创建蓝图资产 `blueprint.create` 创建一个新的蓝图资产,支持指定父类、保存路径,以及在创建时直接添加组件。已实现蓝图重名检测,避免覆盖已有资产导致崩溃。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp1","method":"blueprint.create","params":{ "name":"BP_MyActor", // 必填,蓝图名称 "parent_class":"Actor", // 可选,父类(默认 Actor),支持短名或完整路径 "path":"/Game/Blueprints/BP_MyActor", // 可选,完整包路径 "folder":"/Game/Blueprints", // 可选,保存目录(与 path 二选一,默认 /Game/UnrealAgent/Blueprints) "components":[ // 可选,创建时附带的组件列表 { "component_type":"StaticMeshComponent", "component_name":"MyMesh", "attach_to":"root", // 可选,附加到的父组件 "location":{"x":0,"y":0,"z":100}, "rotation":{"pitch":0,"yaw":0,"roll":0}, "scale":{"x":1,"y":1,"z":1}, "properties":{ // 可选,组件属性 "CastShadow":true } } ] }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp1","code":200,"result":{ "ok":true, "name":"BP_MyActor", "path":"/Game/Blueprints/BP_MyActor.BP_MyActor", "parent_class":"Actor", "parent_class_path":"/Script/Engine.Actor", "generated_class":"/Game/Blueprints/BP_MyActor.BP_MyActor_C", "saved":true, "components":[ {"name":"MyMesh","class":"StaticMeshComponent","class_path":"/Script/Engine.StaticMeshComponent","source":"added","editable":true,"attach_to":"DefaultSceneRoot"} ], "variables":[], "compile_status":"Dirty", "warnings":[] }} ``` ### 说明 - `parent_class` 支持短名(如 `Actor`、`Pawn`、`Character`)或完整类路径(如 `/Script/Engine.Actor`)。 - 若蓝图已存在,返回 `code: 409` 冲突错误,需先删除或使用 `blueprint.add_component` 修改。 - `components` 数组中每个组件会按顺序添加,`attach_to` 可指定父组件名称,留空或 `root` 则附加到根节点。 - 创建完成后自动保存到磁盘并注册到 AssetRegistry。 --- ## 为蓝图添加组件 `blueprint.add_component` 为已存在的蓝图资产添加新组件,支持设置组件变换和属性。组件会被添加到蓝图的 SimpleConstructionScript 中。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp2","method":"blueprint.add_component","params":{ "blueprint_name":"BP_MyActor", // 必填,蓝图名称或完整路径 "component_type":"PointLightComponent", // 必填,组件类型 "component_name":"MyLight", // 必填,组件名称 "attach_to":"MyMesh", // 可选,附加到的父组件名称(默认 root) "location":{"x":0,"y":0,"z":200}, // 可选,相对位置 "rotation":{"pitch":0,"yaw":0,"roll":0}, // 可选,相对旋转 "scale":{"x":1,"y":1,"z":1}, // 可选,相对缩放 "component_properties":{ // 可选,组件属性 "Intensity":5000, "LightColor":"(R=1,G=0.8,B=0.6,A=1)" } }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp2","code":200,"result":{ "ok":true, "blueprint_name":"BP_MyActor", "blueprint_path":"/Game/Blueprints/BP_MyActor.BP_MyActor", "component_name":"MyLight", "component_class":"PointLightComponent", "attached":true, "saved":true, "message":"Successfully added component 'MyLight' (PointLightComponent) to blueprint 'BP_MyActor'", "all_components":[ {"name":"DefaultSceneRoot","class":"SceneComponent","class_path":"/Script/Engine.SceneComponent","source":"inherited","editable":true}, {"name":"MyLight","class":"PointLightComponent","class_path":"/Script/Engine.PointLightComponent","source":"added","editable":true,"attach_to":"DefaultSceneRoot"} ] }} ``` ### 说明 - `blueprint_name` 支持短名(如 `BP_MyActor`)或完整路径(如 `/Game/Blueprints/BP_MyActor`)。 - 若蓝图不存在返回 `code: 404`;若组件名称已存在返回 `code: 409`。 - 仅 SceneComponent 及其子类支持 `location`、`rotation`、`scale` 设置。 - `attach_to` 留空或设为 `root`/`DefaultSceneRoot` 则附加到根节点。 - 添加完成后自动标记蓝图已修改并保存。 --- ## 设置蓝图属性 `blueprint.set_property` 修改蓝图资产的属性,支持两种模式: 1. **CDO 模式**:`component_name` 为空时,修改蓝图类的默认值(Class Default Object) 2. **SCS 模式**:`component_name` 有值时,修改蓝图中指定组件的属性 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp3","method":"blueprint.set_property","params":{ "blueprint_path":"/Game/Blueprints/BP_Hero", // 必填,蓝图路径 "component_name":"PointLight", // 可选,为空则修改 CDO,有值则修改组件 "properties":{ // 必填,属性键值对 "Intensity":5000, "LightColor":{"r":1,"g":0.8,"b":0.6} }, "auto_compile":true // 可选,默认 true }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp3","code":200,"result":{ "ok":true, "blueprint_path":"/Game/Blueprints/BP_Hero.BP_Hero", "blueprint_name":"BP_Hero", "target_type":"component", "component_name":"PointLight", "modified_properties":[ {"property":"Intensity","type":"FloatProperty"}, {"property":"LightColor","type":"StructProperty"} ], "failed_properties":[], "compiled":true, "saved":true, "message":"Successfully set 2 properties on component 'PointLight'" }} ``` ### 说明 - `blueprint_path` 支持短名或完整路径,会自动在 AssetRegistry 中查找。 - 属性名需与 UE 中的属性名完全匹配(大小写敏感),失败时会返回建议属性名。 - 支持的数据类型:基础类型(int/float/bool/string)、枚举、结构体(FVector/FRotator/FColor等)、对象引用。 - 颜色属性:使用 0-1 浮点数格式 `{r,g,b,a}`,会自动转换为 0-255 格式。 - 返回码:`200` 全部成功,`207` 部分成功,`400` 全部失败,`404` 蓝图或组件未找到。 --- ## 编译蓝图 `blueprint.compile` 手动触发蓝图编译,并可选在编译成功后保存(避免写入坏蓝图)。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp4","method":"blueprint.compile","params":{ "blueprint_path":"/Game/Blueprints/BP_Hero", // 必填:蓝图名称或路径 "save":true // 可选:默认 true,仅在编译成功时保存 }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp4","code":200,"result":{ "ok":true, "status":"UpToDate", "saved":true, "path":"/Game/Blueprints/BP_Hero.BP_Hero", "diagnostics":[ {"type":"Warning","message":"Some warning message ...","node_id":"GUID-...","pin":"InString"} ] }} ``` ### 说明 - `ok` 仅表示编译结果是否为 `UpToDate`;即使 `ok:false` 也会返回 `code:200`,可通过 `status` 判断(如 `Error`)。 - `save` 只会在 `ok:true` 时执行保存。 - `diagnostics` 用于 Agent 自修复:包含 `Error/Warning/Info` 等消息,尽可能附带 `node_id`(best-effort)。 --- ## 添加蓝图变量 `blueprint.add_variable` 添加蓝图成员变量(Blueprint Member Variable)。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp5","method":"blueprint.add_variable","params":{ "blueprint_path":"/Game/Blueprints/BP_Hero", "name":"Health", "type":"float", "is_array":false, "default_value":"100.0" }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp5","code":200,"result":{ "ok":true, "blueprint_path":"/Game/Blueprints/BP_Hero.BP_Hero", "variable":{ "name":"Health", "type":"float", "is_array":false, "default_value":"100.0" } }} ``` ### 说明 - `type` 支持:`bool/int/int64/float/double/string/name/text/vector/rotator/color/linearcolor/object/class/soft_object/soft_class` - `object_class`:当 `type` 为 `object/class/soft_object/soft_class` 时可指定(如 `/Script/Engine.Actor`)。 - 若变量已存在返回 `code:409`。 --- ## 获取图表 `blueprint.get_graph` 获取指定图表的节点与引脚元数据(**真实引脚名**),用于“感知优先”的连线编程。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp6","method":"blueprint.get_graph","params":{ "blueprint_path":"/Game/Blueprints/BP_Greeter", "graph_name":"EventGraph" }} ``` ### 响应(节选) ```json {"ver":"1.0","type":"res","id":"bp6","code":200,"result":{ "ok":true, "blueprint_path":"/Game/Blueprints/BP_Greeter.BP_Greeter", "graph_name":"EventGraph", "nodes":[ { "node_id":"GUID-...", "class":"K2Node_Event", "title":"Event BeginPlay", "pos_x":0,"pos_y":0, "pins":[{"name":"Then","dir":"Output","category":"exec","sub_category":"","is_array":false}] } ] }} ``` ### 说明 - `pins[].name` 是 **真实 pin 名**,`blueprint.connect_pins` 必须使用它,不要用 UI 的显示名/label。 --- ## 添加节点 `blueprint.add_node` 在图表中添加节点,并返回 pins 说明书(含真实引脚名)。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp7","method":"blueprint.add_node","params":{ "blueprint_path":"/Game/Blueprints/BP_Greeter", "graph_name":"EventGraph", "node_type":"Function", "node_name":"KismetSystemLibrary.PrintString", "node_position":{"x":300,"y":0} }} ``` ### 响应(节选) ```json {"ver":"1.0","type":"res","id":"bp7","code":200,"result":{ "ok":true, "blueprint_path":"/Game/Blueprints/BP_Greeter.BP_Greeter", "graph_name":"EventGraph", "node_id":"GUID-...", "node_class":"K2Node_CallFunction", "pins":[ {"name":"Exec","dir":"Input","category":"exec","sub_category":"","is_array":false}, {"name":"Then","dir":"Output","category":"exec","sub_category":"","is_array":false}, {"name":"InString","dir":"Input","category":"string","sub_category":"","is_array":false} ] }} ``` ### 说明 - `node_type` 当前支持:`Event / Function / VariableGet / VariableSet` - `Event` 支持 `BeginPlay`(会自动映射为 `ReceiveBeginPlay`)。 --- ## 连接引脚 `blueprint.connect_pins` 根据 `node_id` + `pin.name` 连接执行流/数据流。 ### 请求(JSON-RPC) ```json {"ver":"1.0","type":"req","id":"bp8","method":"blueprint.connect_pins","params":{ "blueprint_path":"/Game/Blueprints/BP_Greeter", "graph_name":"EventGraph", "source_node_id":"GUID-A", "source_pin":"Then", "target_node_id":"GUID-B", "target_pin":"Exec" }} ``` ### 响应 ```json {"ver":"1.0","type":"res","id":"bp8","code":200,"result":{ "ok":true, "message":"Connection created" }} ```