一、使用官方提供的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源代码、思维导图
第一章源码+思维导图
思维导图包含所有类之间关系、编辑器基本运行逻辑