11 KiB
11 KiB
蓝图节点开发接口文档
本文档聚焦 蓝图“逻辑与图表(EventGraph)” 开发能力:变量、节点、连线,以及用于闭环自修复的编译诊断。
核心原则(强制):
- 不要猜引脚名:连线必须使用
blueprint.add_node或blueprint.get_graph返回的pins[].name(真实引脚名),禁止使用 UI 显示名/label。- node_id 是唯一引用:后续连线/修复必须基于
node_id(GUID),不要依赖“节点标题文本”。
接口总览(节点/图表)
| Method | 名称 | 说明 |
|---|---|---|
| blueprint.create_function | 创建函数 | 创建自定义函数图表(Functions),可定义输入/输出参数 |
| blueprint.add_variable | 定义变量 | 添加蓝图成员变量(可选数组/对象引用/软引用) |
| blueprint.get_graph | 上帝视角 | 获取图表全貌(节点 GUID + 真实引脚名) |
| blueprint.add_node | 添加节点 | 添加 Event/Function/VariableGet/VariableSet,并返回 pins 说明书 |
| blueprint.add_timeline | 添加 Timeline | 添加 Timeline(创建 TimelineTemplate + Timeline 节点),并返回 pins 说明书 |
| blueprint.connect_pins | 逻辑连线 | 基于 node_id + pin.name 连接执行流/数据流 |
| blueprint.compile | 编译与诊断 | 编译并返回 diagnostics(用于自修复闭环) |
0. 创建函数图表 blueprint.create_function
用于创建一个新的函数图表(Functions),并可选定义输入/输出参数。创建成功后,返回该函数图表名与入口/返回节点 GUID,供后续在该函数图表中编写逻辑(graph_name)。
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_create_fn","method":"blueprint.create_function","params":{
"blueprint_path":"/Game/BP_MyHero",
"function_name":"CalculateHealth",
"inputs":[
{"name":"BaseValue","type":"Float"},
{"name":"Multiplier","type":"Float"}
],
"outputs":[
{"name":"FinalResult","type":"Float"}
],
"pure":false
}}
响应
{"ver":"1.0","type":"res","id":"bp_create_fn","code":200,"result":{
"ok":true,
"graph_name":"CalculateHealth",
"entry_node_id":"GUID-Entry...",
"result_node_id":"GUID-Result..."
}}
说明
graph_name就是函数图表名;后续blueprint.get_graph / add_node / connect_pins的graph_name传这个值即可在函数内部编写逻辑。inputs/outputs的type支持与blueprint.add_variable相同;若传入不支持类型会被忽略(并在日志中提示)。pure:true为 best-effort(不同 UE 版本内部字段不同);若发现仍有 Exec 引脚,可用compile.diagnostics与图表检查确认。
1. 添加蓝图变量 blueprint.add_variable
添加蓝图成员变量(Blueprint Member Variable)。
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_add_var","method":"blueprint.add_variable","params":{
"blueprint_path":"/Game/Blueprints/BP_Hero",
"name":"Health",
"type":"float",
"is_array":false,
"default_value":"100.0"
}}
对象/类引用示例
{"ver":"1.0","type":"req","id":"bp_add_var2","method":"blueprint.add_variable","params":{
"blueprint_path":"/Game/Blueprints/BP_Hero",
"name":"TargetActor",
"type":"object",
"object_class":"/Script/Engine.Actor"
}}
响应
{"ver":"1.0","type":"res","id":"bp_add_var","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"
}
}}
参数说明
blueprint_path:蓝图路径或短名(会自动在 AssetRegistry 中查找)。name:变量名。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),缺省为/Script/Engine.Object。is_array:是否数组(默认false)。default_value:默认值(字符串形式;UE 会按蓝图变量默认值规则解析)。
错误码
400:参数缺失/类型不支持404:蓝图或类找不到409:变量已存在
2. 获取图表全貌 blueprint.get_graph
获取指定图表的节点列表与引脚元数据(真实引脚名)。
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_get_graph","method":"blueprint.get_graph","params":{
"blueprint_path":"/Game/Blueprints/BP_Greeter",
"graph_name":"EventGraph"
}}
graph_name可省略,默认EventGraph。若要读取函数图表(例如CalculateHealth),请将graph_name设置为函数名。
响应(节选)
{"ver":"1.0","type":"res","id":"bp_get_graph","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,"is_reference":false,"is_const":false}
]
}
]
}}
字段说明
nodes[].node_id:节点 GUID(后续连线/定位必须用它)。nodes[].pins[]:name:真实 pin 名(连线必须用它)dir:Input/Outputcategory/sub_category/sub_category_object:Pin 类型元数据friendly_name:UI 友好名(仅供展示,不要用来连线)
3. 添加节点 blueprint.add_node
在图表中添加节点,并返回该节点的 pins 说明书(真实引脚名)。
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_add_node","method":"blueprint.add_node","params":{
"blueprint_path":"/Game/Blueprints/BP_Greeter",
"graph_name":"EventGraph",
"node_type":"Event",
"node_name":"BeginPlay",
"node_position":{"x":0,"y":0}
}}
添加函数节点示例(PrintString)
{"ver":"1.0","type":"req","id":"bp_add_node2","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}
}}
响应(节选)
{"ver":"1.0","type":"res","id":"bp_add_node2","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,"is_reference":false,"is_const":false},
{"name":"Then","dir":"Output","category":"exec","sub_category":"","is_array":false,"is_reference":false,"is_const":false},
{"name":"InString","dir":"Input","category":"string","sub_category":"","is_array":false,"is_reference":false,"is_const":false}
]
}}
参数说明
node_type当前支持:Event:事件(常用BeginPlay会自动映射为ReceiveBeginPlay)Function:函数调用(建议使用ClassName.FunctionName形式,如KismetSystemLibrary.PrintString)VariableGet/VariableSet:变量 Get/Set(node_name填变量名)
node_position:可选{x,y}。
错误码
400:参数缺失/不支持的 node_type404:蓝图/图表/函数/变量找不到
3.1 添加 Timeline blueprint.add_timeline
Timeline(时间轴)是蓝图里的特殊资源:
- 不能用
blueprint.add_variable直接创建 - 也不适合走
blueprint.add_node的普通节点创建流程
本接口会:
- 在 Blueprint 上创建(或复用)同名
TimelineTemplate - 在指定图表中放置
Timeline节点并绑定该模板 - 返回该节点的 pins(真实 pin 名)用于后续连线
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_add_timeline","method":"blueprint.add_timeline","params":{
"blueprint_path":"/Game/Blueprints/BP_Greeter",
"graph_name":"EventGraph",
"timeline_name":"TL_Move",
"node_position":{"x":600,"y":0},
"reuse_existing":true
}}
响应(节选)
{"ver":"1.0","type":"res","id":"bp_add_timeline","code":200,"result":{
"ok":true,
"blueprint_path":"/Game/Blueprints/BP_Greeter.BP_Greeter",
"graph_name":"EventGraph",
"timeline_name":"TL_Move",
"node_id":"GUID-...",
"node_class":"K2Node_Timeline",
"template_created":true,
"pins":[
{"name":"Play","dir":"Input","category":"exec","sub_category":"","is_array":false,"is_reference":false,"is_const":false}
]
}}
参数说明
timeline_name:Timeline 名称(建议TL_前缀,避免与变量/函数重名)。reuse_existing:默认true,若图表中已存在同名 Timeline 节点则直接复用返回(幂等)。node_position/force_position:与blueprint.add_node同语义;若不传位置,会自动放置在图表右侧。
4. 连接引脚 blueprint.connect_pins
基于 node_id + pin.name 连接执行流/数据流。
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_connect","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"
}}
响应
{"ver":"1.0","type":"res","id":"bp_connect","code":200,"result":{
"ok":true,
"message":"Connection created"
}}
说明
- 连接前请确保 pin 名来自
get_graph/add_node的pins[].name。 - 当连接被 schema 判定为不允许时,会返回
code:400,并在错误 message 中包含原因。
5. 编译与诊断 blueprint.compile
编译蓝图,并返回 diagnostics 用于自修复闭环。
请求(JSON-RPC)
{"ver":"1.0","type":"req","id":"bp_compile","method":"blueprint.compile","params":{
"blueprint_path":"/Game/Blueprints/BP_Greeter",
"save":true
}}
响应(含 diagnostics)
{"ver":"1.0","type":"res","id":"bp_compile","code":200,"result":{
"ok":false,
"status":"Error",
"saved":false,
"path":"/Game/Blueprints/BP_Greeter.BP_Greeter",
"diagnostics":[
{"type":"Error","message":"Pin 'InString' is missing a connection ...","node_id":"GUID-...","pin":"InString"}
]
}}
说明
ok仅表示编译结果是否为UpToDate;即使ok:false也会返回code:200,请以status+diagnostics做闭环修复。diagnostics[].node_id/pin为 best-effort(在 UE5.0 可能无法总是绑定到对象 token)。
SOP 示例:BeginPlay 打印 Hello(闭环)
blueprint.add_node(Event, BeginPlay)→ 得到NODE_A与 pins(拿到真实Then)blueprint.add_node(Function, KismetSystemLibrary.PrintString)→ 得到NODE_B与 pins(拿到真实Exec/InString)blueprint.connect_pins(NODE_A.Then -> NODE_B.Exec)- (可选)补一个字符串常量节点并把输出连到
NODE_B.InString,或用默认值 blueprint.compile()- 若
ok:true:完成 - 若
ok:false:读取diagnostics,修正节点/引脚/连线后再次 compile
- 若