UE C++ 编辑器开发 3.自定义蓝图节点线条样式

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.实现的线条效果

猜你喜欢

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