1.准备FMyConnectionDrawingPolicy.h继承至FConnectionDrawingPolicy
#pragma once
#include "CoreMinimal.h"
#include "ConnectionDrawingPolicy.h"
/**
*
*/
class TESTGRAPHANDBLUEPRINT_API FMyConnectionDrawingPolicy :public FConnectionDrawingPolicy
{
public:
FMyConnectionDrawingPolicy(
int32 InBackLayerID,//节点连接线条的ID
int32 InFrontLayerID,//线条箭头的ID
float InZoomFactor,//蓝图缩放大小
const FSlateRect& InClippingRect,//裁剪矩形
FSlateWindowElementList& InDrawElements,//要绘制的元素
UEdGraph* InGraphObj);
//定制线条绘制风格
virtual void DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin, /*inout*/ FConnectionParams& Params);
//绘制线条
virtual void DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params);
UEdGraph*EdGraphObj;
};
构造传参
FMyConnectionDrawingPolicy::FMyConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float InZoomFactor,
const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements,UEdGraph* InGraphObj)
:FConnectionDrawingPolicy(InBackLayerID,InFrontLayerID,InZoomFactor,InClippingRect,InDrawElements)
,EdGraphObj(InGraphObj)
{
}
自定义线条样式
//线条颜色
static const FLinearColor DefaultWiringColor(1.0f,0.0f,0.0f);
void FMyConnectionDrawingPolicy::DetermineWiringStyle(
UEdGraphPin* OutputPin,//输出引脚
UEdGraphPin* InputPin,//输入引脚
FConnectionParams& Params)//线条参数
{
Params.WireThickness =3.0f;//线条粗细
Params.WireColor = DefaultWiringColor;//线条颜色
if (HoveredPins.Num()>0)//可拖拽引脚数量大于0
{
ApplyHoverDeemphasis(OutputPin,InputPin,Params.WireThickness,Params.WireColor);
}
}
线条绘制
void FMyConnectionDrawingPolicy::DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End,
const FConnectionParams& Params)
{
const FVector2D Delta = End - Start;
const FVector2D DirDelta = Delta.GetSafeNormal();//线条方向
FSlateDrawElement::MakeDrawSpaceSpline(
DrawElementsList,//绘制的元素列表
LayerId,//层级ID
Start,//开始
Delta,//开始的方向
End,//结束
DirDelta,//结束的方向
Params.WireThickness,//线条粗细
ESlateDrawEffect::None,//绘制效果
Params.WireColor);//线条颜色
//线条的气泡流动效果
{
FInterpCurve<float>SplineReparamTable;
//生成样条曲线
float SplineLength = MakeSplineReparamTable(Start,Delta,End,DirDelta,SplineReparamTable);
const float BubbleSpacing =64.f*ZoomFactor;//线条气泡间隔
const float BubbleSpeed =128.f*ZoomFactor;//线条流动速度
const FVector2D BubbleSize = BubbleImage->ImageSize*ZoomFactor*0.1f*Params.WireThickness;//气泡的尺寸
float DeltaTime = (FPlatformTime::Seconds() - GStartTime);//计算时间间隔
const float BubbleOffset = FMath::Fmod(DeltaTime*BubbleSpeed,BubbleSpacing);//计算偏移
const int32 NumBubbles = FMath::CeilToInt(SplineLength / BubbleSpacing);//向上取整,计算气泡数量
for (int32 i = 0;i < NumBubbles;i++)
{
const float Distance = ((float)i*BubbleSpacing)+BubbleOffset;
if (Distance < SplineLength)
{
const float Alpha = SplineReparamTable.Eval(Distance,0.f);
FVector2D BubblePos =FMath::CubicInterp(Start,Delta,End,DirDelta,Alpha);//气泡位置
BubblePos -= (BubbleSize*0.5f);
FSlateDrawElement::MakeBox(
DrawElementsList,
LayerId,FPaintGeometry(BubblePos,BubbleSize,ZoomFactor),
BubbleImage,
ESlateDrawEffect::None,
Params.WireColor);
}
}
}
2.FTestGraphSchemaAction.h,创建连线绘制
//自定义蓝图节点连线
virtual class FConnectionDrawingPolicy* CreateConnectionDrawingPolicy(
int32 InBackLayerID,
int32 InFrontLayerID,
float InZoomFactor,
const FSlateRect& InClippingRect,
class FSlateWindowElementList& InDrawElements,
class UEdGraph* InGraphObj) const;
进行实现
FConnectionDrawingPolicy* UMyEdGraphSchema::CreateConnectionDrawingPolicy(
int32 InBackLayerID,
int32 InFrontLayerID,
float InZoomFactor,
const FSlateRect& InClippingRect,
FSlateWindowElementList& InDrawElements,
UEdGraph* InGraphObj) const
{
return new FMyConnectionDrawingPolicy(InBackLayerID,InFrontLayerID,InZoomFactor,InClippingRect,InDrawElements,InGraphObj);
}
3.实现的线条效果