UE4 K2Node笔记
1、说明:
下面内容为我自己在实现K2Node过程中的一点理解,如果不对请大佬不吝指正
以我自己写的一个Json解析插件为例:
GetChildNodeValue为一个蓝图节点,实现了Value这个输出引脚类型随着ChildJsonType这个枚举的改变而改变
其原理为当枚举类型改变的时候,蓝图通过我们在GetChildNodeValue节点内写的代码,刷新这个节点并改变指定的引脚,当我们点下蓝图编译的那一刻,蓝图会把这个节点替换为其他事先已经存在的函数
换言之,自定义实现的K2Node在蓝图内只是作为别的函数的一个跳板或者说wrapper,在蓝图编译时,蓝图会去查找真正的实现函数,如果找不到则编译失败
2、具体实现:
因为K2Node只是作为一个跳板,它并不会参与项目的打包,所以我们在插件内添加一个EditorNoly的模块,把K2Node相关的代码写到这个模块中
在插件的.uplugin文件内添加内容:
"Modules": [
{
"Name": "JsonParseEditor",
"Type": "Editor", // 426或以上需要改为UncookedOnly
"LoadingPhase": "PostEngineInit"
}
]
添加一个继承UK2Node的头文件:
UCLASS()
class JSONPARSEEDITOR_API UK2Node_JsonParse : public UK2Node
{
GENERATED_BODY()
public:
//创建默认显示的引脚
virtual void AllocateDefaultPins() override;
//当鼠标放到节点上时的提示
virtual FText GetTooltipText() const override { return FText::FromString(TEXT("Get Child Json Node Value")); }
//节点在蓝图内的名字
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override { return FText::FromString(TEXT("Get Child Node Value")); }
//节点在搜索时的分类
virtual FText GetMenuCategory() const { return FText::FromString(TEXT("Json|JsonParser")); }
//初始化时
virtual void ReallocatePinsDuringReconstruction(TArray& OldPins) override;
//把这个节点注册到蓝图节点列表中
virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override;
//当蓝图编译时调用
virtual void ExpandNode(class FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph) override;
//当连接引脚的连线改变时
virtual void PinConnectionListChanged(UEdGraphPin* Pin) override;
//当引脚的值改变时
virtual void PinDefaultValueChanged(UEdGraphPin* Pin) override;
UEdGraphPin* GetThenPin() const;
protected:
void OnEnumPinChanged(UEdGraphPin* Pin);
UEdGraphPin* GetJsonValuePin() const;
UEdGraphPin* GetJsonTypePin() const;
UEdGraphPin* GetJsonKeyPin() const;
UEdGraphPin* GetIsSucceedPin() const;
UEdGraphPin* GetReturnValuePin() const;
private:
UEdGraphPin* GetJsonTypePin(TArray* OldPins);
};
未完