UE C++ 编辑器开发 1.创建一个简单的蓝图节点

这系列文章是为了记录我在课程中所学以及自身对知识点少量的理解,只写实现过程不会有非常详细的解释,所以可能会出现错误。

课程学习至UE4编辑器开发进阶教程:反射与蓝图| ABOUTCG视频教程

1.准备基础代码

蓝图节点GraphNode.h,继承至UEdGraphNode

#pragma once

#include "CoreMinimal.h"
#include "EdGraph/EdGraphNode.h"
#include "MyEdGraphNode.generated.h"

/**
 * 
 */
UCLASS()
class TESTGRAPHANDBLUEPRINT_API UMyEdGraphNode : public UEdGraphNode
{
	GENERATED_BODY()
public:
	//蓝图节点针脚
	virtual void AllocateDefaultPins();
	//获取蓝图节点名字
	virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const;
};

蓝图GraphSchema.h

#pragma once

#include "CoreMinimal.h"
#include "EdGraph/EdGraphSchema.h"
#include "MyEdGraphSchema.generated.h"

/**
 * 
 */

//创建一个继承至FEdGraphSchemaAction的结构体,用于右键蓝图节点的下拉列表
USTRUCT()
struct FTestGraphSchemaAction :public FEdGraphSchemaAction
{
	GENERATED_BODY()
public:
	FTestGraphSchemaAction()
	{
		
	}
	
	FTestGraphSchemaAction(FText InNodeCategory, FText InMenuDesc, FText InToolTip, const int32 InGrouping, FText InKeywords = FText(), int32 InSectionID = 0)
		:FEdGraphSchemaAction(InNodeCategory,InMenuDesc,InToolTip,InGrouping,InKeywords,InSectionID)
	{
		
	}

	virtual UEdGraphNode* PerformAction(class UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true);

	class UMyEdGraphNode*GraphNode;//蓝图节点实例
};


UCLASS()
class TESTGRAPHANDBLUEPRINT_API UMyEdGraphSchema : public UEdGraphSchema
{
	GENERATED_BODY()
public:
	//蓝图中右键显示蓝图节点列表
	virtual void GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const override;
};

2.看看具体的实现

蓝图节点GraphNode.cpp

void UMyEdGraphNode::AllocateDefaultPins()
{
	Super::AllocateDefaultPins();
	//创建蓝图节点针脚,参数1节点类型,参数2针脚类别组,参数3次级针脚类别组,参数4针脚名
	CreatePin(EEdGraphPinDirection::EGPD_Input,TEXT("HelloWorld"),FName(),TEXT("In"));
	CreatePin(EEdGraphPinDirection::EGPD_Output,TEXT("HelloWorld"),FName(),TEXT("Out"));
}

FText UMyEdGraphNode::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
	//返回蓝图节点名字
	return FText::FromString(TEXT("Node Name"));
}

蓝图GraphSchema.cpp

void UMyEdGraphSchema::GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const
{
	//右键下拉列表
	TSharedPtr<FTestGraphSchemaAction>NewNodeAction(
		new FTestGraphSchemaAction(
			LOCTEXT("A","Grap Node Test"),//节点标签
			LOCTEXT("B","Node Test"),//节点名字
			LOCTEXT("C","Hello"),//节点提示
			0));//节点ID

	NewNodeAction->GraphNode = NewObject<UMyEdGraphNode>(ContextMenuBuilder.OwnerOfTemporaries);
	ContextMenuBuilder.AddAction(NewNodeAction);//添加蓝图节点至右键菜单
}

UEdGraphNode* FTestGraphSchemaAction::PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin,
	const FVector2D Location, bool bSelectNewNode)
{
	UMyEdGraphNode*UEdResultNode = nullptr;
	if (GraphNode != nullptr)
	{
		const FScopedTransaction Transaction(LOCTEXT("FFF","Hello"));

		ParentGraph->Modify();
		if (FromPin != nullptr)
		{
			FromPin->Modify();//将节点标记为已修改
		}
		GraphNode->Rename(nullptr,ParentGraph);
		ParentGraph->AddNode(GraphNode,true,bSelectNewNode);//添加节点

		GraphNode->CreateNewGuid();//为此蓝图节点创建新的GUID
		GraphNode->PostPlacedNewNode();//初始化这个蓝图节点
		GraphNode->AllocateDefaultPins();//为这个蓝图节点生成引脚
		GraphNode->AutowireNewNode(FromPin);//自动写入这个新节点

		//节点位置
		GraphNode->NodePosX = Location.X;
		GraphNode->NodePosY = Location.Y;

		UEdResultNode = GraphNode;
	}
	return UEdResultNode;
	
}

3.实现效果

下拉菜单

 蓝图节点

猜你喜欢

转载自blog.csdn.net/weixin_45500363/article/details/123386983