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);
};

未完

UE4