自定义蓝图节点

在蓝图中类似于 SpawnActor 或者 GetClassDefaults 之类的函数,可以根据参数的变化来改变节点的信息(如增加引脚,修改返回值类型等等)。

其实在蓝图中这样的节点都是继承自 UK2Node 的类,每一个节点是一个类,如 SpawnActor 它就是定义在 Editor/BlueprintEditor 下的 K2Node_SpawnActor 类。
UK2Node提供了很多的方法供继承类重写,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 鼠标指到节点上的提示信息
virtual FText GetTooltipText()const;
// 节点在蓝图中显示的名字
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType)const;
// 将节点添加至上下文菜单
virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegister)const;
// 设置节点在编辑器中右键菜单的分类
virtual FText GetMenuCategory()const;
// 在编译时扩展节点,可以添加或移除节点的 Pin
// 在这个函数中需要绑定真正需要执行的函数,注意绑定的函数要是 BlueprintCallable 的
virtual void ExpandNode(FKismetCompilerContext & CompilerContext, UEdGraph * SourceGraph);
// 当节点中的 Pin 信息被改变
virtual void PinDefaultValueChanged(UEdGraphPin* ChangedPin);
// 给节点分配默认的 Pin,如初始添加 InExec 和 OutExec,声明在 UEdGraphNode 中
// 默认在 ReallocatePinsDuringReconstruction 中调用,也可以自己在 ExpandNode 中调用
virtual void AllocateDefaultPins();

上面列出的就是创建一个自定义的蓝图节点需要实现的最重要的几个函数。

当在蓝图中点击节点右键刷新的时候会调用到 ExpandNode 函数,如果在其中调用了 AllocateDefaultPins 要考虑从序列化中读取已有配置的问题。

一个例子,实现的效果为根据枚举值修改节点的参数类型:

代码放在了 Gist:CustomK2Node.cpp