1.5 从0创建蓝图编辑器-使用官方Pin+第一部分源代码

一、使用官方提供的SlatePin

1.1、创建一个宏,用于分开之前的自定义Pin/Node与现在的官方Pin/Node的使用
TestGraphAndBlueprint.h
#define  SELF_SLATE 1

在这里插入图片描述

1.2、给GraphNode添加更多的GraphPin
UTestNode_HelloWorld::AllocateDefaultPins():
void UTestNode_HelloWorld::AllocateDefaultPins()
{
	//EGPD_Input:引脚类型(EGPD_Input、EGPD_Output、EGPD_Max)
	//HelloNodeInput FName(): 类型组、次级类型组
	//TEXT("In"): 针脚名
#if SELF_SLATE
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In1"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In2"));
	CreatePin(EGPD_Output, "HelloNodeInput", FName(), TEXT("Out1"));
	CreatePin(EGPD_Output, "HelloNodeInput", FName(), TEXT("Out2"));
#else
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In1"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In2"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In3"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In4"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In5"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In6"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In7"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In8"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In9"));
	CreatePin(EGPD_Input, "HelloNodeInput", FName(), TEXT("In9"));

	CreatePin(EGPD_Output, "HelloNodeInput", FName(), TEXT("Out1"));
	CreatePin(EGPD_Output, "HelloNodeInput", FName(), TEXT("Out2"));
	CreatePin(EGPD_Output, "HelloNodeInput", FName(), TEXT("Out3"));
	CreatePin(EGPD_Output, "HelloNodeInput", FName(), TEXT("Out4"));
#endif
}
1.3 给GraphPin创建SlatePin
SMyGraphNode_HelloWorld::UpdateGraphNode()
#if SELF_SLATE
	PinBox->SetWidthOverride(185.f);
	PinBox->SetHeightOverride(120.f);
#else
	PinBox->SetWidthOverride(395.f);
	PinBox->SetHeightOverride(470.f);
#endif

在这里插入图片描述

SMyGraphNode_HelloWorld::CreatePinWidgets()
	if (HelloNode)
	{
#if SELF_SLATE
		//遍历所有的Pin一一创建SlatePin
		for (UEdGraphPin* CurPin : HelloNode->Pins)
		{
			//新建SlatePin
			TSharedPtr<SGraphPin> NewPin = SNew(SMyGraphPin_HelloWorld, CurPin);
			NewPin->SetIsEditable(IsEditable);
			//添加到系统对应的Box中,In/Out与UpdateGraphNode中的LeftNodeBox/RightNodeBox对应
			this->AddPin(NewPin.ToSharedRef());
			//添加到自定义的对应集合中,用来画线
			//被移至AddPin()中
// 			if (CurPin->Direction==EEdGraphPinDirection::EGPD_Input)
// 			{
// 				InputPins.Add(NewPin.ToSharedRef());
// 			}
// 			else if (CurPin->Direction == EEdGraphPinDirection::EGPD_Output)
// 			{
// 				OutputPins.Add(NewPin.ToSharedRef());
// 			}
		}

#else
		//定义方便添加Pin的宏
		#define RESET_PIN(SlatePinType,GraphPinObj,...) \
			NewPin = SNew(SlatePinType,GraphPinObj, __VA_ARGS__);	\
			NewPin->SetIsEditable(IsEditable);	\
			this->AddPin(NewPin.ToSharedRef());

		//SGraphPinNameList的参数
		static TArray<TSharedPtr<FName>> InNameList;
		InNameList.Add(MakeShareable(new FName(TEXT("One"))));
		InNameList.Add(MakeShareable(new FName(TEXT("Two"))));
		InNameList.Add(MakeShareable(new FName(TEXT("Three"))));
		InNameList.Add(MakeShareable(new FName(TEXT("Four"))));

		TSharedPtr<SGraphPin> NewPin = nullptr;
		RESET_PIN(SGraphPinExec, HelloNode->Pins[0]);
		RESET_PIN(SGraphPinColor, HelloNode->Pins[1]);
		RESET_PIN(SGraphPinEnum, HelloNode->Pins[2]);
		RESET_PIN(SGraphPinBool, HelloNode->Pins[3]);
		RESET_PIN(SGraphPinNameList, HelloNode->Pins[4],InNameList);
		RESET_PIN(SGraphPinObject, HelloNode->Pins[5]);
		RESET_PIN(SGraphPinString, HelloNode->Pins[6]);
		RESET_PIN(SGraphPinVector2D, HelloNode->Pins[7]);
		RESET_PIN(SGraphPinVector4, HelloNode->Pins[8]);
		RESET_PIN(SGraphPinInteger, HelloNode->Pins[9]);

		RESET_PIN(SGraphPinExec, HelloNode->Pins[10]);
		RESET_PIN(SGraphPinBool, HelloNode->Pins[11]);
		RESET_PIN(SGraphPinEnum, HelloNode->Pins[12]);
		RESET_PIN(SGraphPinVector2D, HelloNode->Pins[13]);
// 		RESET_PIN(SMyGraphPin_HelloWorld, HelloNode->Pins[11]);
// 		RESET_PIN(SMyGraphPin_HelloWorld, HelloNode->Pins[12]);
// 		RESET_PIN(SMyGraphPin_HelloWorld, HelloNode->Pins[13]);
#endif
	}
SMyGraphNode_HelloWorld::AddPin()
void SMyGraphNode_HelloWorld::AddPin(const TSharedRef<SGraphPin>& PinToAdd)
{
	//初始化SlatePin的OwnerNode和GraphPinObj
	PinToAdd->SetOwner(SharedThis(this));
	const UEdGraphPin* GraphPinObj = PinToAdd->GetPinObj();
	//?
	if (GraphPinObj&&GraphPinObj->bAdvancedView)
	{
		PinToAdd->SetVisibility(TAttribute<EVisibility>(PinToAdd, &SGraphPin::IsPinVisibleAsAdvanced));
	}
	//设置尺寸——仅限自定义SlatePin
#if SELF_SLATE
	PinToAdd->SetDesiredSizeScale(FVector2D(7.f, 10.f));
#endif
	//将InputPin塞入LeftNodeBox
	if (PinToAdd->GetDirection() == EEdGraphPinDirection::EGPD_Input)
	{
		LeftNodeBox->AddSlot()
			.HAlign(HAlign_Fill)
			.VAlign(VAlign_Fill)
			.AutoHeight()
			.Padding(5.f, 10.f)
			[
				PinToAdd
			];
		InputPins.Add(PinToAdd);
	}
	//将OutPin塞入RightNodeBox
	if (PinToAdd->GetDirection() == EEdGraphPinDirection::EGPD_Output)
	{
		RightNodeBox->AddSlot()
			.HAlign(HAlign_Fill)
			.VAlign(VAlign_Fill)
			.AutoHeight()
			.Padding(110.f, 10.f)
			[
				PinToAdd
			];
		OutputPins.Add(PinToAdd);
	}
}

在这里插入图片描述

1.4:结果:

在这里插入图片描述
在这里插入图片描述

附:1.1-1.5源代码、思维导图

第一章源码+思维导图
思维导图包含所有类之间关系、编辑器基本运行逻辑
类关系
插件运行逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值